soit un tableau qui contient un nombre non défini de lignes (en fait 6 à
10, pour l'intant 6) de chaine que l'on notera A B C D E (dans le cas ou il
y en a 5)
(en fait ce tableau contient aussi une valeur numérique rattaché à ces
chaines dy type 1 2 4 8 16 32 64 .. pour faire des sommes logiques)
Je cherche un algo qui permette (si possible quelque soit le nombre de
lignes) de trouver toutes les combinaisons possibles , celle-ci pouvant être
de 1 à n caractères (n étant le nombre de lignes). l'ordre doit être gardé
et pour moi AB = BA.
Pour commencer l'exemple
A
AB
ABC
ABCD
ABCDE
AC
ACD
ACDE
AD
ADE
AE
B
BC
BCD
BCDE
BD
BDE
BE
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
jean-marc
"Driss HANIB" wrote in message news:ebpMD$
Bonjour à tous,
soit un tableau qui contient un nombre non défini de lignes (en fait 6 à 10, pour l'intant 6) de chaine que l'on notera A B C D E (dans le cas ou il y en a 5) (en fait ce tableau contient aussi une valeur numérique rattaché à ces chaines dy type 1 2 4 8 16 32 64 .. pour faire des sommes logiques)
Je cherche un algo qui permette (si possible quelque soit le nombre de lignes) de trouver toutes les combinaisons possibles , celle-ci pouvant être de 1 à n caractères (n étant le nombre de lignes). l'ordre doit être gardé et pour moi AB = BA.
Hello,
un grand classique dont la solution est toute simple, mais il faut y penser !
Il suffit d'utiliser le fait que l'écriture en binaire d'un nombre sur n bits fait apparaitre toutes les combinaisons possibles des dits bits.
Ainsi, considérons 3 chaines: A (1) en binaire 001 B (2) en binaire 010 C (4) en binaire 100
Comptons maintenant de 1 à 2^3-1 (cad de 1 à 7) et exprimons les nombres du compatge en binaire: 1 001 2 010 3 011 4 100 5 101 6 110 7 111
Maintenant faisons apparaitre la lettre concernée à chauqe position, en utilisant la combinaison binaire comme un masque (si 1, je mets la lettre, sinon, non) :
C B A ----- 0 0 1 => A 0 1 0 => B 0 1 1 => B A = A B 1 0 0 => C 1 0 1 => C A = A C 1 1 0 => C B = B C 1 1 1 => C B A = A B C
Et voila, le tour est joué.
Donc pour implémenter, il sufit de: - compter de 1 à 2^N - 1, en binaire - Parcourir la valeur binaire trouvée caractère par caractère et placer la lettre au besoin.
Si tu as besoin des AB <=> BA, il suffit de générer la chaine à l'envers pour chaque chaine.
"Driss HANIB" <dhanib@club-internet.fr> wrote in message
news:ebpMD$qVIHA.1184@TK2MSFTNGP04.phx.gbl...
Bonjour à tous,
soit un tableau qui contient un nombre non défini de lignes (en fait 6 à
10, pour l'intant 6) de chaine que l'on notera A B C D E (dans le cas ou
il
y en a 5)
(en fait ce tableau contient aussi une valeur numérique rattaché à ces
chaines dy type 1 2 4 8 16 32 64 .. pour faire des sommes logiques)
Je cherche un algo qui permette (si possible quelque soit le nombre de
lignes) de trouver toutes les combinaisons possibles , celle-ci pouvant
être
de 1 à n caractères (n étant le nombre de lignes). l'ordre doit être gardé
et pour moi AB = BA.
Hello,
un grand classique dont la solution est toute simple,
mais il faut y penser !
Il suffit d'utiliser le fait que l'écriture en binaire
d'un nombre sur n bits fait apparaitre toutes les
combinaisons possibles des dits bits.
Ainsi, considérons 3 chaines:
A (1) en binaire 001
B (2) en binaire 010
C (4) en binaire 100
Comptons maintenant de 1 à 2^3-1 (cad de 1 à 7)
et exprimons les nombres du compatge en binaire:
1 001
2 010
3 011
4 100
5 101
6 110
7 111
Maintenant faisons apparaitre la lettre concernée
à chauqe position, en utilisant la combinaison
binaire comme un masque (si 1, je mets la lettre,
sinon, non) :
C B A
-----
0 0 1 => A
0 1 0 => B
0 1 1 => B A = A B
1 0 0 => C
1 0 1 => C A = A C
1 1 0 => C B = B C
1 1 1 => C B A = A B C
Et voila, le tour est joué.
Donc pour implémenter, il sufit de:
- compter de 1 à 2^N - 1, en binaire
- Parcourir la valeur binaire trouvée
caractère par caractère et placer la lettre
au besoin.
Si tu as besoin des AB <=> BA, il suffit de générer
la chaine à l'envers pour chaque chaine.
soit un tableau qui contient un nombre non défini de lignes (en fait 6 à 10, pour l'intant 6) de chaine que l'on notera A B C D E (dans le cas ou il y en a 5) (en fait ce tableau contient aussi une valeur numérique rattaché à ces chaines dy type 1 2 4 8 16 32 64 .. pour faire des sommes logiques)
Je cherche un algo qui permette (si possible quelque soit le nombre de lignes) de trouver toutes les combinaisons possibles , celle-ci pouvant être de 1 à n caractères (n étant le nombre de lignes). l'ordre doit être gardé et pour moi AB = BA.
Hello,
un grand classique dont la solution est toute simple, mais il faut y penser !
Il suffit d'utiliser le fait que l'écriture en binaire d'un nombre sur n bits fait apparaitre toutes les combinaisons possibles des dits bits.
Ainsi, considérons 3 chaines: A (1) en binaire 001 B (2) en binaire 010 C (4) en binaire 100
Comptons maintenant de 1 à 2^3-1 (cad de 1 à 7) et exprimons les nombres du compatge en binaire: 1 001 2 010 3 011 4 100 5 101 6 110 7 111
Maintenant faisons apparaitre la lettre concernée à chauqe position, en utilisant la combinaison binaire comme un masque (si 1, je mets la lettre, sinon, non) :
C B A ----- 0 0 1 => A 0 1 0 => B 0 1 1 => B A = A B 1 0 0 => C 1 0 1 => C A = A C 1 1 0 => C B = B C 1 1 1 => C B A = A B C
Et voila, le tour est joué.
Donc pour implémenter, il sufit de: - compter de 1 à 2^N - 1, en binaire - Parcourir la valeur binaire trouvée caractère par caractère et placer la lettre au besoin.
Si tu as besoin des AB <=> BA, il suffit de générer la chaine à l'envers pour chaque chaine.
Pour compléter, tu trouveras dans la FAQ une fonction pour converir un nombre d'une base à l'autre, sous forme de chaine (donc de 10 à 2 dans ton cas): http://faq.vb.free.fr/index.php?question
J'ai aussi écrit un programme qui permet de résoudre des trucs de scrabble ou de Literati en générant des permuations de lettres, utilisant le principe sus-mentionné. Le code est ici: http://www.vbfrance.com/codes/JOUER-LITERATI-TEXTEXPRESS-MOT-PLUS-LONG-ETC_36617.aspx
"Driss HANIB" <dhanib@club-internet.fr> wrote in message
news:ebpMD$qVIHA.1184@TK2MSFTNGP04.phx.gbl...
Pour compléter, tu trouveras dans la FAQ une fonction
pour converir un nombre d'une base à l'autre, sous
forme de chaine (donc de 10 à 2 dans ton cas):
http://faq.vb.free.fr/index.php?question
J'ai aussi écrit un programme qui permet de
résoudre des trucs de scrabble ou de Literati
en générant des permuations de lettres, utilisant le
principe sus-mentionné.
Le code est ici:
http://www.vbfrance.com/codes/JOUER-LITERATI-TEXTEXPRESS-MOT-PLUS-LONG-ETC_36617.aspx
Pour compléter, tu trouveras dans la FAQ une fonction pour converir un nombre d'une base à l'autre, sous forme de chaine (donc de 10 à 2 dans ton cas): http://faq.vb.free.fr/index.php?question
J'ai aussi écrit un programme qui permet de résoudre des trucs de scrabble ou de Literati en générant des permuations de lettres, utilisant le principe sus-mentionné. Le code est ici: http://www.vbfrance.com/codes/JOUER-LITERATI-TEXTEXPRESS-MOT-PLUS-LONG-ETC_36617.aspx
Je complète encore: tu n'es pas obligé de t'embêter avec la représentation sous forme de chaine des valeurs binaires. Il suffit de savoir que pour savoir si le bit b d'un nombre N est à 1, il suffit de faire
SI (N AND (2^b)) = (2^b), alors b est à 1
Du coup, c'est trivial.
Voici un programme qui calcul ce que tu veux, dans mon exemple les permutations de 4 chaines:
Option Explicit
Const N As Long = 4
Private Sub Command1_Click() Dim t(N) As String Dim i As Long, j As Long
t(1) = "J" t(2) = "E" t(3) = "A" t(4) = "N"
For i = 1 To (2 ^ N) - 1 Debug.Print i; " "; For j = 0 To N - 1 If (i And (2 ^ j)) = (2 ^ j) Then Debug.Print t(j + 1); End If Next j Debug.Print Next i End Sub
Qui produit :
1 J 2 E 3 JE 4 A 5 JA 6 EA 7 JEA 8 N 9 JN 10 EN 11 JEN 12 AN 13 JAN 14 EAN 15 JEAN
Il y a 15 solutions, c'est bien ça. et elles sont toutes la, aux inversions près.
"Driss HANIB" <dhanib@club-internet.fr> wrote in message
news:ebpMD$qVIHA.1184@TK2MSFTNGP04.phx.gbl...
Bonjour à tous,
Je complète encore:
tu n'es pas obligé de t'embêter avec la représentation
sous forme de chaine des valeurs binaires.
Il suffit de savoir que pour savoir
si le bit b d'un nombre N est à 1, il suffit de faire
SI (N AND (2^b)) = (2^b), alors b est à 1
Du coup, c'est trivial.
Voici un programme qui calcul ce que tu veux, dans
mon exemple les permutations de 4 chaines:
Option Explicit
Const N As Long = 4
Private Sub Command1_Click()
Dim t(N) As String
Dim i As Long, j As Long
t(1) = "J"
t(2) = "E"
t(3) = "A"
t(4) = "N"
For i = 1 To (2 ^ N) - 1
Debug.Print i; " ";
For j = 0 To N - 1
If (i And (2 ^ j)) = (2 ^ j) Then
Debug.Print t(j + 1);
End If
Next j
Debug.Print
Next i
End Sub
Qui produit :
1 J
2 E
3 JE
4 A
5 JA
6 EA
7 JEA
8 N
9 JN
10 EN
11 JEN
12 AN
13 JAN
14 EAN
15 JEAN
Il y a 15 solutions, c'est bien ça. et elles sont
toutes la, aux inversions près.
Je complète encore: tu n'es pas obligé de t'embêter avec la représentation sous forme de chaine des valeurs binaires. Il suffit de savoir que pour savoir si le bit b d'un nombre N est à 1, il suffit de faire
SI (N AND (2^b)) = (2^b), alors b est à 1
Du coup, c'est trivial.
Voici un programme qui calcul ce que tu veux, dans mon exemple les permutations de 4 chaines:
Option Explicit
Const N As Long = 4
Private Sub Command1_Click() Dim t(N) As String Dim i As Long, j As Long
t(1) = "J" t(2) = "E" t(3) = "A" t(4) = "N"
For i = 1 To (2 ^ N) - 1 Debug.Print i; " "; For j = 0 To N - 1 If (i And (2 ^ j)) = (2 ^ j) Then Debug.Print t(j + 1); End If Next j Debug.Print Next i End Sub
Qui produit :
1 J 2 E 3 JE 4 A 5 JA 6 EA 7 JEA 8 N 9 JN 10 EN 11 JEN 12 AN 13 JAN 14 EAN 15 JEAN
Il y a 15 solutions, c'est bien ça. et elles sont toutes la, aux inversions près.
"jean-marc" wrote in message news:478b7075$0$29256$
"Driss HANIB" wrote in message news:ebpMD$
Bonjour à tous,
Je complète encore:
et encore !
La même chose sous forme d'une jolie fonction qui remplit un tableau dynamique (avec en plus les inversions : (ABC <=> CBA) ) :
Option Explicit
Const n As Long = 4
Private Function reverse_string(ByVal s As String) Dim i As Long Dim rs As String
For i = Len(s) To 1 Step -1 rs = rs & Mid$(s, i, 1) Next i reverse_string = rs End Function
Private Function GenereCombi(t() As String, n As Long) As String() Dim i As Long, j As Long Dim nb As Long Dim r As String Dim res() As String
ReDim res(n + (2 ^ n - 1 - n) * 2)
For i = 1 To (2 ^ n) - 1 r = "" For j = 0 To n - 1 If (i And (2 ^ j)) Then r = r & t(j + 1) End If Next j nb = nb + 1 res(nb) = r
' pour les permuations, commenter si nécessaire If Len(r) >= 2 Then nb = nb + 1 res(nb) = reverse_string(r) End If ' fin generation inversion Next i GenereCombi = res End Function
Et voici l'utilisation, simplissime :
Private Sub Command1_Click() Dim a(4) As String Dim t() As String Dim i As Long
a(1) = "A": a(2) = "B": a(3) = "C": a(4) = "D"
t() = GenereCombi(a, 4) For i = 1 To UBound(t()) Debug.Print i & vbTab & t(i) Next i End Sub
"jean-marc" <jean_marc_n2@yahoo.fr.invalid> wrote in message
news:478b7075$0$29256$ba620e4c@news.skynet.be...
"Driss HANIB" <dhanib@club-internet.fr> wrote in message
news:ebpMD$qVIHA.1184@TK2MSFTNGP04.phx.gbl...
Bonjour à tous,
Je complète encore:
et encore !
La même chose sous forme d'une jolie fonction qui
remplit un tableau dynamique (avec en plus les
inversions : (ABC <=> CBA) ) :
Option Explicit
Const n As Long = 4
Private Function reverse_string(ByVal s As String)
Dim i As Long
Dim rs As String
For i = Len(s) To 1 Step -1
rs = rs & Mid$(s, i, 1)
Next i
reverse_string = rs
End Function
Private Function GenereCombi(t() As String, n As Long) As String()
Dim i As Long, j As Long
Dim nb As Long
Dim r As String
Dim res() As String
ReDim res(n + (2 ^ n - 1 - n) * 2)
For i = 1 To (2 ^ n) - 1
r = ""
For j = 0 To n - 1
If (i And (2 ^ j)) Then
r = r & t(j + 1)
End If
Next j
nb = nb + 1
res(nb) = r
' pour les permuations, commenter si nécessaire
If Len(r) >= 2 Then
nb = nb + 1
res(nb) = reverse_string(r)
End If
' fin generation inversion
Next i
GenereCombi = res
End Function
Et voici l'utilisation, simplissime :
Private Sub Command1_Click()
Dim a(4) As String
Dim t() As String
Dim i As Long
a(1) = "A": a(2) = "B": a(3) = "C": a(4) = "D"
t() = GenereCombi(a, 4)
For i = 1 To UBound(t())
Debug.Print i & vbTab & t(i)
Next i
End Sub
"jean-marc" wrote in message news:478b7075$0$29256$
"Driss HANIB" wrote in message news:ebpMD$
Bonjour à tous,
Je complète encore:
et encore !
La même chose sous forme d'une jolie fonction qui remplit un tableau dynamique (avec en plus les inversions : (ABC <=> CBA) ) :
Option Explicit
Const n As Long = 4
Private Function reverse_string(ByVal s As String) Dim i As Long Dim rs As String
For i = Len(s) To 1 Step -1 rs = rs & Mid$(s, i, 1) Next i reverse_string = rs End Function
Private Function GenereCombi(t() As String, n As Long) As String() Dim i As Long, j As Long Dim nb As Long Dim r As String Dim res() As String
ReDim res(n + (2 ^ n - 1 - n) * 2)
For i = 1 To (2 ^ n) - 1 r = "" For j = 0 To n - 1 If (i And (2 ^ j)) Then r = r & t(j + 1) End If Next j nb = nb + 1 res(nb) = r
' pour les permuations, commenter si nécessaire If Len(r) >= 2 Then nb = nb + 1 res(nb) = reverse_string(r) End If ' fin generation inversion Next i GenereCombi = res End Function
Et voici l'utilisation, simplissime :
Private Sub Command1_Click() Dim a(4) As String Dim t() As String Dim i As Long
a(1) = "A": a(2) = "B": a(3) = "C": a(4) = "D"
t() = GenereCombi(a, 4) For i = 1 To UBound(t()) Debug.Print i & vbTab & t(i) Next i End Sub
Eh bien quel festival avec la progression crescendo.. Je vais regarder tous tes posts qui sont tous de belle facture Merci pour cet exercice de style On voit les pros.. et les autres (où je suis bien sur..)
Merci beaucoup
Driss
"jean-marc" a écrit dans le message de news:478b92ce$0$22312$
"jean-marc" wrote in message news:478b7075$0$29256$ > > "Driss HANIB" wrote in message > news:ebpMD$ >> Bonjour à tous, > > Je complète encore:
et encore !
La même chose sous forme d'une jolie fonction qui remplit un tableau dynamique (avec en plus les inversions : (ABC <=> CBA) ) :
Option Explicit
Const n As Long = 4
Private Function reverse_string(ByVal s As String) Dim i As Long Dim rs As String
For i = Len(s) To 1 Step -1 rs = rs & Mid$(s, i, 1) Next i reverse_string = rs End Function
Private Function GenereCombi(t() As String, n As Long) As String() Dim i As Long, j As Long Dim nb As Long Dim r As String Dim res() As String
ReDim res(n + (2 ^ n - 1 - n) * 2)
For i = 1 To (2 ^ n) - 1 r = "" For j = 0 To n - 1 If (i And (2 ^ j)) Then r = r & t(j + 1) End If Next j nb = nb + 1 res(nb) = r
' pour les permuations, commenter si nécessaire If Len(r) >= 2 Then nb = nb + 1 res(nb) = reverse_string(r) End If ' fin generation inversion Next i GenereCombi = res End Function
Et voici l'utilisation, simplissime :
Private Sub Command1_Click() Dim a(4) As String Dim t() As String Dim i As Long
a(1) = "A": a(2) = "B": a(3) = "C": a(4) = "D"
t() = GenereCombi(a, 4) For i = 1 To UBound(t()) Debug.Print i & vbTab & t(i) Next i End Sub
Eh bien quel festival avec la progression crescendo..
Je vais regarder tous tes posts qui sont tous de belle facture
Merci pour cet exercice de style
On voit les pros.. et les autres (où je suis bien sur..)
Merci beaucoup
Driss
"jean-marc" <jean_marc_n2@yahoo.fr.invalid> a écrit dans le message de
news:478b92ce$0$22312$ba620e4c@news.skynet.be...
"jean-marc" <jean_marc_n2@yahoo.fr.invalid> wrote in message
news:478b7075$0$29256$ba620e4c@news.skynet.be...
>
> "Driss HANIB" <dhanib@club-internet.fr> wrote in message
> news:ebpMD$qVIHA.1184@TK2MSFTNGP04.phx.gbl...
>> Bonjour à tous,
>
> Je complète encore:
et encore !
La même chose sous forme d'une jolie fonction qui
remplit un tableau dynamique (avec en plus les
inversions : (ABC <=> CBA) ) :
Option Explicit
Const n As Long = 4
Private Function reverse_string(ByVal s As String)
Dim i As Long
Dim rs As String
For i = Len(s) To 1 Step -1
rs = rs & Mid$(s, i, 1)
Next i
reverse_string = rs
End Function
Private Function GenereCombi(t() As String, n As Long) As String()
Dim i As Long, j As Long
Dim nb As Long
Dim r As String
Dim res() As String
ReDim res(n + (2 ^ n - 1 - n) * 2)
For i = 1 To (2 ^ n) - 1
r = ""
For j = 0 To n - 1
If (i And (2 ^ j)) Then
r = r & t(j + 1)
End If
Next j
nb = nb + 1
res(nb) = r
' pour les permuations, commenter si nécessaire
If Len(r) >= 2 Then
nb = nb + 1
res(nb) = reverse_string(r)
End If
' fin generation inversion
Next i
GenereCombi = res
End Function
Et voici l'utilisation, simplissime :
Private Sub Command1_Click()
Dim a(4) As String
Dim t() As String
Dim i As Long
a(1) = "A": a(2) = "B": a(3) = "C": a(4) = "D"
t() = GenereCombi(a, 4)
For i = 1 To UBound(t())
Debug.Print i & vbTab & t(i)
Next i
End Sub
Eh bien quel festival avec la progression crescendo.. Je vais regarder tous tes posts qui sont tous de belle facture Merci pour cet exercice de style On voit les pros.. et les autres (où je suis bien sur..)
Merci beaucoup
Driss
"jean-marc" a écrit dans le message de news:478b92ce$0$22312$
"jean-marc" wrote in message news:478b7075$0$29256$ > > "Driss HANIB" wrote in message > news:ebpMD$ >> Bonjour à tous, > > Je complète encore:
et encore !
La même chose sous forme d'une jolie fonction qui remplit un tableau dynamique (avec en plus les inversions : (ABC <=> CBA) ) :
Option Explicit
Const n As Long = 4
Private Function reverse_string(ByVal s As String) Dim i As Long Dim rs As String
For i = Len(s) To 1 Step -1 rs = rs & Mid$(s, i, 1) Next i reverse_string = rs End Function
Private Function GenereCombi(t() As String, n As Long) As String() Dim i As Long, j As Long Dim nb As Long Dim r As String Dim res() As String
ReDim res(n + (2 ^ n - 1 - n) * 2)
For i = 1 To (2 ^ n) - 1 r = "" For j = 0 To n - 1 If (i And (2 ^ j)) Then r = r & t(j + 1) End If Next j nb = nb + 1 res(nb) = r
' pour les permuations, commenter si nécessaire If Len(r) >= 2 Then nb = nb + 1 res(nb) = reverse_string(r) End If ' fin generation inversion Next i GenereCombi = res End Function
Et voici l'utilisation, simplissime :
Private Sub Command1_Click() Dim a(4) As String Dim t() As String Dim i As Long
a(1) = "A": a(2) = "B": a(3) = "C": a(4) = "D"
t() = GenereCombi(a, 4) For i = 1 To UBound(t()) Debug.Print i & vbTab & t(i) Next i End Sub