Afficher toutes les possibilités d'une chaîne [Résolu]

Signaler
Messages postés
7
Date d'inscription
vendredi 19 novembre 2010
Statut
Membre
Dernière intervention
24 février 2012
-
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
-
Bonjour à tous,

Ça fait longtemps que je cherche mais j'ai juste trouvé des codes qui font juste mélanger.

Je cherche un moyen d'afficher toutes les combinaisons possibles d'un chaîne donnée.
Ex: J'ai 1,2,3 et sa donne :
111
222
333
112
113
121
131
211
311
122
etc..

Merci

11 réponses

Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
420
Bonjour

je suis têtu et je trouve ton code compliqué.
Donc je te propose ça


Whismeril
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
9
et tu as essayé cette recherche??
Messages postés
14738
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
3 juillet 2020
92
Hello,
@Xabaat: si tu cherches une fonction standard, y'en a pas. Il te faut autant de boucles for que de caractères dans ta chaine, plus éventuellement un traitement pour supprimer les doublons
@cormandyr: ici, c'est du C#


@+
Buno, Admin CS
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
9
Hoooooooooooooo,


oups, me suis trompé ^^ navré le ferai plus... Enfin, je vais essayer...
Cela n'empeche, je peux comprendre qu'il n'ait donc pas fait cette recherche, mais le code java est assez facilement transposable en C#...


encore désolé de l'erreur ^^
Messages postés
7
Date d'inscription
vendredi 19 novembre 2010
Statut
Membre
Dernière intervention
24 février 2012

Bah, je suis asser bon en c# pour prendre du java comme exemple et elle est très bien ta recherche, mais ce script ne répète pas les lettres plusieurs fois et c'est ce que je cherche...

Merci quand même
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
420
Bonjour,

et si tu te créais une base.
Tu écris la méthode de conversion.
Tu calcules le nombre d'itérations et tu n'as plus qu'à compter.

Petit exemple avec 1 et 2. (Une base de 2 chiffres ça te rappelle quelque chose?).
La méthode de conversion dans ce cas est: je transforme en binaire et j'ajoute 1 à chaque caractère.

Les permutations à 3 caractères sont au nombre de 2 puissance 3 soit 8.

Alors on compte:
0 -> 111
1 -> 112
2 -> 121
3 -> 122
4 -> 211
5 -> 212
6 -> 221
7 -> 222

et voilà!



Whismeril
Messages postés
7
Date d'inscription
vendredi 19 novembre 2010
Statut
Membre
Dernière intervention
24 février 2012

Bonne idée whismeril mais si alors j'ai plus que trois chiffre et qu'en plus j'ai des lettres? Ça ne peut pas marcher dans toutes les situations... Je pense que je dois préciser un peux tout de même. Ce serait plus du genre :

fonction melange(int nbcaractere, string[] lettres)
nbcaractere = 9
lettres = {"A", "4", "c", "0", "P", "W", "p"}

Résultat :
AAAAAAAAA PPPPPPPPP AAAAAAAAc AAAAAAAAp
444444444 WWWWWWWWW AAAAAAAA0 AAAAAAA4A
ccccccccc ppppppppp AAAAAAAAP AAAAAAAcA
000000000 AAAAAAAA4 AAAAAAAAW etc..

Et puisqu'il y a des répétitions, cela donne beaucoup de possibilités, je le sais et plus que n! (c'est ((!9)/2 + (!8)/2 + (!7)/2 + (!6)/2).. de possibilités me semble) J'ai cherché pendant une autre heure ce matin et j'ai toujours rien trouvé..

Merci
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
420
Ca doit pouvoir marcher aussi avec des chiffres et des lettres.
Le tout est de bien écrire la méthode de conversion.
Il y'a bien des lettres en Hexa...

Quand aux nombre de permutations c'est base à la puissance nombre de caractères, si le nombre de caractères est fixe.

Pour mon exemple, je n'ai pas pris compte ces permutations:

1
2
11
12
21
22

Mais là encore c'est assez facilement gerrable.
Le nombre de permutations est 2 puissance 1 (pour 1 caractère) + 2 puissance 2 (pour 2 caractères) + 2 puissance 3,
Il faut alors compter de 0 à 1 avec 1 caractère, puis de 0 à 4 avec 2 caractères et de 0 à 7 avec 3 caractères.

Si lettres = {"A", "4", "c", "0", "P", "W", "p"} est un tableau de caractères alors tu as un base 7 et chaque caractère "vaut" la valeur de son indice, lettres[0]="A" est A "vaut" 0, voilà pour le principe de conversion.


Whismeril
Messages postés
7
Date d'inscription
vendredi 19 novembre 2010
Statut
Membre
Dernière intervention
24 février 2012

Bonjour,
J'ai trouvé quelquechose d'utile.. mais c'est en PHP ce qui cause un problème car tout code en PHP s'arrête après 45 sec d'exécution. J'essaye de convertir ce code en C# mais je reste pris.

function permutations($letters,$num){
    $last = str_repeat($letters{0},$num);
    $result = array();
    while($last != str_repeat(lastchar($letters),$num)){
        $result[] = $last;
        $last = char_add($letters,$last,$num-1);
    } 
    $result[] = $last; 
    return $result; 
} 
function char_add($digits,$string,$char){
    if($string{$char} != lastchar($digits)){
        $string{$char} = $digits{strpos($digits,$string{$char}) + 1};
        return $string;
    }else{ 
        $string = changeall($string,$digits{0},$char);
        return char_add($digits,$string,$char-1); 
    } 
} 
function lastchar($string){ 
    return $string{strlen($string)-1}; 
} 
function changeall($string,$char,$start 0,$end 0){ 
    if($end 0) $end strlen($string)-1; 
    for($i=$start;$i<=$end;$i++){ 
        $string{$i} = $char; 
    } 
    return $string; 
}

$Array=permutations("ABC", 3); //Pour afficher les résultats 
for($i=0 ; $i < count($Array) ; $i++) { 
        echo "$i. " . $Array[$i] . "
"; 
}


et moi j'ai :

//array = permutations("ABC", 3);

        private string[] permutations(string letters, int num)
        {
            string last null, last2 null;
            string str_repeat = null;
            string[] result = new string[1000000];
            int i = 0;

            foreach (char c in letters)
            {
                if (i == 0)
                {
                    str_repeat = c.ToString();
                }
                i++;
            }
            i = 0;

            while (i != num)
            {
                last = last + str_repeat;
                last2 = last2 + lastchar(letters);
                i++;
            }



            i = 0;
            while (last != last2)
            {
                result[i] = last;
                last = char_add(letters, last, num - 1);
                i++;
            }

            result[i + 1] = last;
            return result;
        }

        private string char_add(string digits, string string2, int char2)//
        {
            int i = 0;
            string lastone = null;
            foreach (char c in string2)
            {
                if (i == char2)
                {
                    lastone = c.ToString();
                }
                i++;
            }

            if (lastone != lastchar(digits))
            {
                string[] letters2 = new string[char2 + 1];
                string charofstring null, digitspos null, nstring = null;//
                int pos = 0;
                i = 0;

                foreach (char c in string2)
                {
                    if (i == char2)
                    {
                        charofstring = c.ToString();
                    }
                    i++;
                }
                i = 0;
                foreach (char c in digits)
                {
                    if (c.ToString() == charofstring)
                    {
                        pos = i + 1;
                    }
                    i++;
                }
                i = 0;
                foreach (char c in digits)
                {
                    if (i == pos)
                    {
                        digitspos = c.ToString();
                    }
                    i++;
                }
                i = 0;
                foreach (char c in string2)
                {
                    letters2[i] = c.ToString();
                    if (i == pos)
                    {
                        letters2[i] = digitspos;
                    }
                    i++;
                }
                i = 0;
                while (letters2.Length != i)
                {
                    nstring = nstring + letters2[i];
                    i++;
                }

                return nstring;
            }
            else
            {
                i = 0;
                string first = null;
                foreach (char c in digits)
                {
                    if (i == 0)
                    {
                        first = c.ToString();
                    }
                    i++;
                }
                string2 = changeall(string2, first, char2);
                return char_add(digits, string2, char2 - 1);
            }
        }

        private string changeall(string string2, string char2, int start 0, int end 0)
        {
            if (end == 0)
                end = string2.Length - 1;
            int i = start;
            string[] letters2 = new string[10000000];

            foreach (char c in string2)
            {
                letters2[i] = c.ToString();
                letters2[i] = char2;
                i++;
            }
            string2 = null;
            i = 0;
            while (letters2.Length != i)
            {
                string2 = string2 + letters2[i];
                i++;
            }

            return string2;

        }
        
        private string lastchar(string string2)
        {
            int i = 0;
            string lastc = null;
            foreach (char c in string2)
            {
                if (i == string2.Length - 1)
                {
                    lastc = c.ToString();
                }
                i++;
            }

            return lastc;
        }

sa donne : AAA ABA ABA ABA etc. jusqu'à un IndexOutOfRangeExecption
C'est peut-être pas très, comment dire.. orthodoxe comme façon mais c'est un début.
Si quelqu'un peut m'aider?
Merci

PS Dites-moi le si je m'éloigne un peu trop du sujet et je ferai un autre post
Messages postés
7
Date d'inscription
vendredi 19 novembre 2010
Statut
Membre
Dernière intervention
24 février 2012

Salut,

Pourquoi passer par 4 chemins comme j'ai fait?

Merci à toi whismeril
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
420
De rien


Whismeril