String - tester toutes les possibilités

Signaler
Messages postés
13
Date d'inscription
vendredi 8 juin 2001
Statut
Membre
Dernière intervention
26 juillet 2003
-
Messages postés
107
Date d'inscription
mardi 20 août 2002
Statut
Membre
Dernière intervention
15 octobre 2004
-
Je recherche le moyen d'afficher dans une textbox toutes les combinaisons possibles qu'il y a moyen de faire avec un string. Chui a cours d'idée... j'arrive pas à programmer cet algorythme...

Exemple :

Mystring = "abc"
Resultat :
a
b
c
aa
ab
ac
....
et enfin ccc

Merci d'avance.

11 réponses

Messages postés
107
Date d'inscription
mardi 20 août 2002
Statut
Membre
Dernière intervention
15 octobre 2004

*******Sébastien VALAT*********
*****Mon site : TI-NET : http://perso.wanadoo.fr/sebastien.valat/*****
0
Messages postés
13
Date d'inscription
vendredi 8 juin 2001
Statut
Membre
Dernière intervention
26 juillet 2003

Ok, je suppose que tu fais référence au prog de cryptage, mais ce que je voudrais, ce sont les sources afin de pouvoir l'intégrer dans un des mes prog.
0
Messages postés
13
Date d'inscription
vendredi 8 juin 2001
Statut
Membre
Dernière intervention
26 juillet 2003

Ok, je suppose que tu fais référence au prog de cryptage, mais ce que je voudrais, ce sont les sources afin de pouvoir l'intégrer dans un des mes prog.
0
Messages postés
107
Date d'inscription
mardi 20 août 2002
Statut
Membre
Dernière intervention
15 octobre 2004

OK, je suis désolé pour le message vide, le truc qui était marqué c'est ma signature par defaut, j'avais fait envoyer sans le faire exepres.

Bon, j'ai boss un peu dessu, ça m'a pris une heure, pour que ça marche avec autant de caractère que voulu. Voici le code source, c'est un peut long, si tu comprend pas un truc, demande.

Un coneil, fait un copier coller. Par contre faut tester, mais je crois qu'avec trop de caractere ca plante a cause du trop plain de la listbox, faudrai faire passe dans une variable et faire un tri different pour enlever celles qui sont en double.

*****le prgm commence ici

Dim Use(1 To 256)
Dim Deja As String
Dim a, b As Long
Dim Nb(1 To 256)
Dim Tr As String
'Pour que ça marche :
' -place un textbox nommer Text1
' -Une Listboc nommer List1 avec SORTED activé
' -un bouton nommer Command1
'tu peux changer les noms des objet, mais change le aussi dans les lignes qui suivent
'tu peut mettre une variable a la place du texte box, mais remplace "Text1" dans les ligne par le nom de la variable

Private Sub Command1_Click()
List1.Clear
List1.Visible = False
Deja = ""
a = 0
re = ""
'analyse la variable ou l'on entre les caractère au cas ou le même y soit plusieur fois
'si tu veux pouvoir mettre un caractère plsusieur fois, enleve ces ligne
For i = 1 To Len(Text1.Text)
If InStr(1, Deja, Mid(Text1.Text, i, 1)) = 0 Then
a = a + 1
Use(a) = Mid(Text1.Text, i, 1)
Deja = Deja & Mid(Text1.Text, i, 1)
End If
Next i
'jusqu'ici
Text1.Text = Deja
c = 0
'ici scan de toutes les possibilité et ajout de celle ci dans LIST1
For i = 1 To a
For j = 1 To 256
Nb(j) = 1
Next
Nb(1) = 0
'pour le calcule "a * i + 200 * a + 200 * i" j'avais mis a*i, mais ça m'en oubliai, alors j'ai augmenter, je sais pas pourquoi ca n'allait pas avant.
For j = 1 To a * i + 200 * a + 200 * i
Tr = ""
b = i
Nb(b) = Nb(b) + 1
For k = 1 To 256
If Nb(b) <= a Then Exit For
If Nb(b) > a Then
Nb(b) = 1
If b > 1 Then
b = b - 1
Nb(b) = Nb(b) + 1
End If
End If
Next k
For k = 1 To i
If Nb(k) <> 0 Then Tr = Tr & Use(Nb(k))
Next k
List1.AddItem Tr
Next j
Next i
'jusqu'ici

'ici je scan la listbox1 et je retire les combinaison qui reviennent
For i = 0 To List1.ListCount - 1
If i = List1.ListCount - 1 Then Exit For If List1.List(i) List1.List(i + 1) Then List1.RemoveItem (i + 1): i i - 1
Next i
'et ici c'est finit
MsgBox ("Nonbre de combinaison trouvé :" & List1.ListCount)
List1.Visible = True

End Sub

*****fin

*******Sébastien VALAT*********
*****Mon site : TI-NET : http://perso.wanadoo.fr/sebastien.valat/*****
0
Messages postés
13
Date d'inscription
vendredi 8 juin 2001
Statut
Membre
Dernière intervention
26 juillet 2003

A l'aise !!!!!!!!!!
c'est exactement ce que je voulais...
Un tout grand merci, t'es le meilleur !!!

@ plus
0
Messages postés
13
Date d'inscription
vendredi 8 juin 2001
Statut
Membre
Dernière intervention
26 juillet 2003

En fait, il y a quand même un petit problème...

Jusqu'a 4 caractere ca fonctionne, il trouve le bon nombre de resultats, mais apres il en oublie.

Pour connaitre le nombre de resultats possibles, il faut faire,

pour un len(string) = 5, par exemple :

5^1 plus 5^2 plus 5^3 plus 5^4 plus 5^5 = 3905 possibilites.

pour un len(string) = 6 :

6^1 plus 6^2 plus 6^3 plus... plus 6^6 = 55986 possibilites.

Ce que j'aimerai en plus c'est que cela test les valeurs par ordre croissant de longueur des possibilites, pas par ordre alphabetique. Donc pour un string = "abc", ça donne :
a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc
aaa
aab
...
etc...

C'est ca qui me pose un reel probleme, mais c'est clair que tu es dejà arrive plus loin que moi...

Donc, si t'as une solution, chui preneur... 8-)
0
Messages postés
13
Date d'inscription
vendredi 8 juin 2001
Statut
Membre
Dernière intervention
26 juillet 2003

ok j'ai resolu le probleme du nombre de possibilites trouvees, j'ai rajoute ceci au debut du code :

dim MyMax as long
dim MyMaxTemp as long

for i = 1 to len(Mystring)
     MyMaxTemp = len(mystring) ^ i
     MyMax = MyMax + MyMaxTemp
next i

'j'ai remplace l'endroit ou tu avais un probleme de formule

for j = 1 to a * i + 200 * a + 200 * i

par for j = 1 to MyMax



Mais j'aimerais toujours pouvoir tester par longueur et pas par ordre alphab.
0
Messages postés
107
Date d'inscription
mardi 20 août 2002
Statut
Membre
Dernière intervention
15 octobre 2004

*******Sébastien VALAT*********
*****Mon site : TI-NET : http://perso.wanadoo.fr/sebastien.valat/*****
0
Messages postés
107
Date d'inscription
mardi 20 août 2002
Statut
Membre
Dernière intervention
15 octobre 2004

merde, j'ai encore fait envoyer sans écrire, désolé. Bon pour le tri, je vois commet faire, mais ça va pas mal alourdir la procèdure, et bra vo pour la soluce. Pouir le code, je vais essayer de te faire ça ce week-end si ça te derange pas car j'ai pas mal de boulo en ce moment
A +

*******Sébastien VALAT*********
*****Mon site : TI-NET : http://perso.wanadoo.fr/sebastien.valat/*****

:)
0
Messages postés
13
Date d'inscription
vendredi 8 juin 2001
Statut
Membre
Dernière intervention
26 juillet 2003

okeydokey,

j'attends de tes nouvelles.
0
Messages postés
107
Date d'inscription
mardi 20 août 2002
Statut
Membre
Dernière intervention
15 octobre 2004

OK, j'ai fait ce que tu voulais, si tu comprend pas un truc, demande.
Bon tu prend le même truc que la dernière fois, mais tu enleve le tri automatique de la list box. Et remplace le code par :
J'y ai intergrer le calcule que tu avait trouvé, on a toutes les solutions.

Dim Use(1 To 256)
Dim Deja As String
Dim a, b As Long
Dim Nb(1 To 256)
Dim Tr As String
Dim Trouvé As String
Dim MyMax As Long
Dim MyMaxTemp As Long

'Pour que ça marche :
' -place un textbox nommer Text1
' -place une list box
' -un bouton nommer Command1
'tu peux changer les noms des objet, mais change le aussi dans les lignes qui suivent
'tu peut mettre une variable a la place du texte box, mais remplace "Text1" dans les ligne par le nom de la variable

Private Sub Command1_Click()
'ta ligne de commande
For i = 1 To Len(Text1.Text)
MyMaxTemp = Len(Text1.Text) ^ i
MyMax = MyMax + MyMaxTemp
Next i

Trouvé = ","
List1.Clear
List1.Visible = False
Deja = ""
a = 0
re = ""
'analyse la variable ou l'on entre les caractère au cas ou le même y soit plusieur fois
'si tu veux pouvoir mettre un caractère plsusieur fois, enleve ces ligne
For i = 1 To Len(Text1.Text)
If InStr(1, Deja, Mid(Text1.Text, i, 1)) = 0 Then
a = a + 1
Use(a) = Mid(Text1.Text, i, 1)
Deja = Deja & Mid(Text1.Text, i, 1)
End If
Next i
'jusqu'ici
Text1.Text = Deja
c = 0
'ici scan de toutes les possibilité et ajout de celle ci dans LIST1
For i = 1 To a
For j = 1 To 256
Nb(j) = 1
Next
Nb(1) = 0
'voila, j'ai pris ce que tu avait trouvé.
For j = 1 To MyMax
Tr = ""
b = i
Nb(b) = Nb(b) + 1
For k = 1 To 256
If Nb(b) <= a Then Exit For
If Nb(b) > a Then
Nb(b) = 1
If b > 1 Then
b = b - 1
Nb(b) = Nb(b) + 1
End If
End If
Next k
For k = 1 To i
If Nb(k) <> 0 Then Tr = Tr & Use(Nb(k))
Next k
'je vérifie que la combianaison est pas encore été trouvé.
'pour cela je cherche dans une variable contenant toutes les combin si la instr(..) revnoi 0 c'est qu'elle a pas été trouvé.
If InStr(1, Trouvé, "," & Tr & ",") = 0 Then
'j'avoute la compbinaison trouvé dans le liste des combinaaison trouvé.
Trouvé = Trouvé & Tr & ","
List1.AddItem Tr
End If
Next j
Next i
'jusqu'ici

'et ici c'est finit
MsgBox ("Nonbre de combinaison trouvé :" & List1.ListCount)
List1.Visible = True
'pour decharger la memoire.
Trouvé=""
End Sub

*******Sébastien VALAT*********
*****Mon site : TI-NET : http://perso.wanadoo.fr/sebastien.valat/*****
0