2010-01-04 5 views
1

J'essaie de comprendre le nombre de façons possibles de combiner divers éléments de cette chaîne.Détermination du nombre de combinaisons possibles

"{Hello|Hi|Hey} {world|earth}{!|.|?}" 

Lorsqu'un article (séparés par un tuyau/|) est sélectionné au hasard dans chaque groupe ({}) et combinés en une seule chaîne.

Ainsi, le « modèle » ci-dessus pourrait produire:

Hello world. 
Hi earth? 
Hey world. 
Hi world? 

Je devine que c'est un type de permutation, mais je veux vous assurer que je reçois ce droit.

Ce serait vraiment bien si cela fonctionnait avec "n" éléments imbriqués.

"{{Hello|Hi|Hey} {world|earth}|{Goodbye|farewell} {noobs|n3wbz|n00blets}}" 

Je préférerais une solution basée sur les mathématiques/statistiques plutôt que sur une boucle de force brute pour obtenir la réponse si possible.

Merci!

Répondre

6

Eh bien, il y a 3 x 2 x 3 = 18 combinaisons dans votre premier exemple.

Votre deuxième exemple est 3 x 4 x 2 x 3 = 72 combinaisons. Je ne suis pas tout à fait sûr de ce que vous voulez dire par {a|b}|{c|d} cependant, je suppose que vous voulez dire choisir l'un de (a ou b) ou (c ou d), qui est de 4 choix. Vous pouvez lire les combinaisons here ou here.


Mise à jour: Oui, c'est aussi simple que cela. Votre problème est exactement comme de compter le nombre de combinaisons de chiffres dans un nombre. Par exemple, si je veux trouver le nombre de combinaisons d'un code PIN ATM (4 chiffres décimaux), j'ai des ensembles {0-9}, {0-9}, {0-9}, {0-9}. Il y a 10 possibilités pour le premier choix (= 10). Pour chacun de ces nombres, il y a 10 possibilités pour le second choix (= 10 × 10). Pour chacun de ceux-ci, il y en a 10 pour le troisième (= 10 10) et 10 pour le quatrième (= 10 10 = 10 000). Il devrait être intuitivement clair qu'il existe 10 000 possibilités pour un nombre décimal à 4 chiffres. Votre exemple utilise des ensembles de mots au lieu d'ensembles de chiffres, mais le principe est le même. Le nombre de combinaisons est le nombre d'éléments dans le jeu 1 × nombre d'éléments dans l'ensemble 2 × ... × nombre d'éléments ensemble n, etc.

Il est plus compliqué lorsque vous commencez à mettre des restrictions, ou sont choisir plusieurs articles du même ensemble, etc.

+0

C'est vraiment aussi simple que ça? Je n'ai pas besoin d'utiliser une sorte de permutation? (http://en.wikipedia.org/wiki/Permutation) – erikcw

+0

@erikcw voir les mises à jour ci-dessus. – Seth

+0

Pour effectuer les sous-choix {world | earth} | {Goodbye | adieu}, exécutez récursivement l'algorithme d'analyse pour obtenir la valeur de sous-section et continuer le traitement. –

0

Le problème se décompose en deux sous-problèmes simples:

comte
  1. combien de combinaisons sont entre accolades et séparés à l'intérieur vbars, pour chaque accolades paire
  2. multiplier ces chiffres

So pour 1 J'irais avec une expression ordinaire simple + approche en boucle:

import re 

def docount(thestring): 
    x = re.compile(r'{([^}]}') 
    counts = [mo.group(0).count('|')+1 for mo in x.finditer(thestring)] 
    result = 1 
    for c in counts: result *= c 
    return result 

J'ai également intégré 2 car c'est la partie la plus triviale de toute façon (si vous voulez utiliser reduce à de telles fins, c'est OK aussi, au lieu des trois dernières lignes, je suppose ;-).

Questions connexes