Algorithme :
- Comptez de 1 à 2^n.
- Convertir chaque chiffre en sa représentation binaire.
- Traduisez chaque bit "on" en éléments de votre jeu, en fonction de leur position.
En C# :
void Main()
{
var set = new [] {"A", "B", "C", "D" }; //, "E", "F", "G", "H", "I", "J" };
var kElement = 2;
for(var i = 1; i < Math.Pow(2, set.Length); i++) {
var result = Convert.ToString(i, 2).PadLeft(set.Length, '0');
var cnt = Regex.Matches(Regex.Escape(result), "1").Count;
if (cnt == kElement) {
for(int j = 0; j < set.Length; j++)
if ( Char.GetNumericValue(result[j]) == 1)
Console.Write(set[j]);
Console.WriteLine();
}
}
}
Pourquoi cela fonctionne-t-il ?
Il existe une bijection entre les sous-ensembles d'un ensemble à n éléments et les séquences à n bits.
Cela signifie que nous pouvons déterminer combien de sous-ensembles il y a en comptant les séquences.
Par exemple, l'ensemble de quatre éléments ci-dessous peut être représenté par {0,1} X {0, 1} X {0, 1} X {0, 1} (ou 2^4) séquences différentes.
Alors tout ce que nous avons à faire est de compter de 1 à 2^n pour trouver toutes les combinaisons. (Nous ignorons l'ensemble vide.) Ensuite, traduisez les chiffres en leur représentation binaire. Ensuite, remplacez les éléments de votre ensemble par des bits "on".
Si vous ne voulez que les résultats de k éléments, n'imprimez que lorsque k bits sont activés.
(Si vous voulez tous les sous-ensembles au lieu des sous-ensembles de longueur k, supprimez la partie cnt/kElement).
(Pour la preuve, voir le didacticiel gratuit du MIT Mathematics for Computer Science, Lehman et al, section 11.2.2. https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-fall-2010/readings/ )
4 votes
Une préférence pour un langage de programmation ?
9 votes
Comment voulez-vous traiter les lettres en double ?
0 votes
Pas de préférence de langage, je vais le coder en ruby mais une idée générale des algorithmes à utiliser serait bien. Deux lettres de même valeur peuvent exister mais pas la même lettre deux fois.
0 votes
Solution flash as3 stackoverflow.com/questions/4576313/
0 votes
En php, ce qui suit devrait faire l'affaire : stackoverflow.com/questions/4279722/
0 votes
Un peu de ma sagesse Le programme mentionné dans le lien peut être étendu pour résoudre tout problème de nature exponentielle. Voici la structure de base. chamanchindi.blogspot.in/2008/10/
0 votes
Abacus (sur github) une bibliothèque de combinatoire pour Node.JS, Python, PHP, Actionscript (ps je suis l'auteur)
0 votes
@wcm Je n'ai pas trouvé de solution ici pour traiter les lettres en double. Je suis allé de l'avant et j'ai répondu à la question nécessitant les doublons (et nécessitant du C++) : stackoverflow.com/q/29967202/2642059
0 votes
Il y a un bon article convaincant avec ce qui semble être une implémentation efficace en C# ici : msdn.microsoft.com/fr/us/library/aa289166(v=vs.71).aspx