Afficher toutes les possibilités d'une chaîne

Résolu
Xabaat Messages postés 7 Date d'inscription vendredi 19 novembre 2010 Statut Membre Dernière intervention 24 février 2012 - 23 févr. 2012 à 05:56
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 24 févr. 2012 à 14:42
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

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
24 févr. 2012 à 12:22
Bonjour

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


Whismeril
3
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
23 févr. 2012 à 08:36
et tu as essayé cette recherche??
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
23 févr. 2012 à 08:53
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...
0
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
23 févr. 2012 à 09:00
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 ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Xabaat Messages postés 7 Date d'inscription vendredi 19 novembre 2010 Statut Membre Dernière intervention 24 février 2012 1
23 févr. 2012 à 14:30
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
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
23 févr. 2012 à 15:10
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
0
Xabaat Messages postés 7 Date d'inscription vendredi 19 novembre 2010 Statut Membre Dernière intervention 24 février 2012 1
23 févr. 2012 à 22:57
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
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
23 févr. 2012 à 23:29
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
0
Xabaat Messages postés 7 Date d'inscription vendredi 19 novembre 2010 Statut Membre Dernière intervention 24 février 2012 1
24 févr. 2012 à 08:49
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
0
Xabaat Messages postés 7 Date d'inscription vendredi 19 novembre 2010 Statut Membre Dernière intervention 24 février 2012 1
24 févr. 2012 à 14:40
Salut,

Pourquoi passer par 4 chemins comme j'ai fait?

Merci à toi whismeril
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
24 févr. 2012 à 14:42
De rien


Whismeril
0
Rejoignez-nous