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

Messages postés
7
Date d'inscription
vendredi 19 novembre 2010
Dernière intervention
24 février 2012
- 23 févr. 2012 à 05:56 - Dernière réponse :
Messages postés
12280
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 novembre 2018
- 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
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
Messages postés
12280
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 novembre 2018
24 févr. 2012 à 12:22
3
Merci
Bonjour

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


Whismeril

Merci Whismeril 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 91 internautes ce mois-ci

Commenter la réponse de Whismeril
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Dernière intervention
8 juillet 2016
23 févr. 2012 à 08:36
0
Merci
et tu as essayé cette recherche??
Commenter la réponse de cormandyr
Messages postés
14240
Date d'inscription
lundi 11 juillet 2005
Dernière intervention
21 novembre 2018
23 févr. 2012 à 08:53
0
Merci
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...
Commenter la réponse de BunoCS
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Dernière intervention
8 juillet 2016
23 févr. 2012 à 09:00
0
Merci
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 ^^
Commenter la réponse de cormandyr
Messages postés
7
Date d'inscription
vendredi 19 novembre 2010
Dernière intervention
24 février 2012
23 févr. 2012 à 14:30
0
Merci
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
Commenter la réponse de Xabaat
Messages postés
12280
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 novembre 2018
23 févr. 2012 à 15:10
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
7
Date d'inscription
vendredi 19 novembre 2010
Dernière intervention
24 février 2012
23 févr. 2012 à 22:57
0
Merci
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
Commenter la réponse de Xabaat
Messages postés
12280
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 novembre 2018
23 févr. 2012 à 23:29
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
7
Date d'inscription
vendredi 19 novembre 2010
Dernière intervention
24 février 2012
24 févr. 2012 à 08:49
0
Merci
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
Commenter la réponse de Xabaat
Messages postés
7
Date d'inscription
vendredi 19 novembre 2010
Dernière intervention
24 février 2012
24 févr. 2012 à 14:40
0
Merci
Salut,

Pourquoi passer par 4 chemins comme j'ai fait?

Merci à toi whismeril
Commenter la réponse de Xabaat
Messages postés
12280
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 novembre 2018
24 févr. 2012 à 14:42
0
Merci
De rien


Whismeril
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.