2010-07-27 3 views
1

que j'ai une liste de valeurs, cette liste peut être de toute longueur:Comment générer toutes les combinaisons possibles d'une chaîne lorsque donné une liste de valeurs

"100","200","300","400","500", ... 

Et j'ai une chaîne de modèle qui a un quelques jetons qui doivent être remplacés:

"@[email protected]@[email protected]@[email protected]@[email protected]" 

Utilisation de la liste des valeurs, comment puis-je générer toutes les combinaisons possibles des valeurs dans le modèle?

Les valeurs peuvent être utilisées plusieurs fois, ce qui peut donner un résultat de "100-100-100". Points supplémentaires pour une méthode qui prend en compte un nombre variable de jetons!

+1

peuvent être des valeurs utilisées plus d'une fois? le nombre de 3 tokes est-il fixé? – mvds

+0

Les valeurs peuvent être utilisées plusieurs fois, ce qui signifie qu'un résultat peut être: 100-100-100. Les jetons ne sont pas non plus fixés. –

+0

Soyez prêt pour une longue attente si votre liste de valeurs peut vraiment être de n'importe quelle longueur, puisque le nombre de permutations de N est N! (c'est-à-dire N factoriel). Cela devient très grand très rapidement, et pour une liste de taille modérée (disons 20-30) générer toutes les combinaisons pourrait prendre plus de temps que la durée de vie de l'univers. –

Répondre

2

modifier: supprimé nombre fixe de jetons Version

exploit récursion, juste pour le plaisir:

r($values,false,$numtokens); // false to get 100-100-100 as well. 

function r($values,$unique=true,$depth=3,$collect=array()) 
{ 
    if ($depth == 0) 
    { 
      print implode("-",$collect)."\n"; 
    } else { 
      foreach ($values as $id=>$t) 
      { 
        if ($unique) unset($values[$id]); 
        r($values,$unique,$depth-1,array_merge($collect,array($t))); 
        if ($unique) $values[$id] = $t; 
      } 
    } 
} 

(cela peut besoin d'une adaptation pour des langues différentes)

+0

Est-ce que cela suppose que la chaîne de modèle avec les jetons est toujours formatée avec des traits d'union? –

+0

il vous donne fondamentalement un tableau d'éléments, que vous pouvez utiliser dans n'importe quel but. 'implode (" - ", $ collect)' signifie simplement les concaténer avec '-' entre les éléments. Mais vous pouvez faire n'importe quoi à ce point bien sûr - '$ template =" .. @ token0 @ .. "; foreach ($ collect comme $ id => $ el) $ template = str_replace ("@ jeton $ id @", $ el, $ template); 'par exemple (note: premier élément id 0!) – mvds

1

Python:

from itertools import permutations 
list_of_values = ["100","200","300","400","500"] 
template = "%s-%s-%s" 
for p in permutations(list_of_values,3): 
    print(template % p) 

Vous pouvez faire co mbinations au lieu de permutations si vous ne voulez pas "500-400-300" et "300-400-500" comme exemple.

0

valeurs peuvent être répétées En supposant:

#!/usr/bin/env python 

VALUES=['100','200','300','400','500'] 

TOKEN='@token%[email protected]' 

TARGET="@[email protected]@[email protected]@[email protected]" 

def rep(n,target): 
    src=TOKEN%n 
    if src not in target: 
     return [target] 

    ret = [] 
    for v in VALUES: 
     ret += rep(n+1, target.replace(src,v)) 
    return ret 

print rep(1,TARGET) 
Questions connexes