2017-07-17 2 views
0

J'ai une chaîne et j'aimerais obtenir toutes les combinaisons possibles de regroupements de celles-ci tout en les gardant dans la même séquence. J'ai pensé à faire quelque chose comme une approche n-gramme et ensuite concaténer les résultats.obtenir toutes les combinaisons de séparations de chaînes

Donc, si j'ai l'exemple chaîne:

Je voudrais obtenir (sans ordre particulier):

aa | bb cc dd 
aa bb | cc dd 
aa bb cc | dd 
aa | bb cc | dd 
aa | bb | cc dd 
aa bb | cc | dd 
aa | bb | cc | dd 

Je préférerais répondre à bash ou python.

+1

Ceci est certainement possible dans bash, mais pas une idée particulièrement bonne. N'y a-t-il pas de "vraies" langues à votre disposition? Python? Perl? – slim

+0

@slim python serait possible, je pourrais changer le titre – badner

+1

'aa | bb | cc dd' est répété dans la sortie attendue ... ajoutez ce que vous avez essayé de remettre en question aussi ... – Sundeep

Répondre

3

Ceci peut être réalisé avec une fonction récursive:

Le cas d'arrêt est une liste vide de paramètres - de sorte que la boucle while ne soit pas entré.

Sinon, nous voulons:

  • Les paramètres tels que fournis
  • Pour chaque groupe qui peut être fait à l'aide des premiers paramètres (ie "aa", "aa bb", "aa bb cc", etc.
    • ce groupe, suivi d'un « | » suivi par chacun des groupements possibles des paramètres restants

donc:

#!/bin/bash 

combos() 
{ 
    head="" 
    echo [email protected] 
    while [[ $# -gt 0 ]]; do 
     head="$head $1" 
     shift 
     combos [email protected] | sed "s/^/$head |/" 
    done 
} 


combos aa bb cc dd 

Cela a une certaine distance incohérent, fuite | s et la répétition d'un groupe. Ceux-ci peuvent tous être rangés - je l'ai laissé comme un exercice.

+0

Je peux gérer le nettoyage. Ça fonctionne super bien – badner