Cacul et affichage d'une combinaison

cs_hastalavista Messages postés 38 Date d'inscription mardi 7 mars 2006 Statut Membre Dernière intervention 26 février 2008 - 28 déc. 2007 à 13:52
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 - 28 déc. 2007 à 16:16
bonjour tout le monde
je cherche un code permettant de calculer de et d'afficher une combinaison de 13 element avec 3 possibilités, en fait le probleme avec les codes que j'ai trouvé c'est qu'il ne gére pas toutes les possibilités, de plus aprés avoir lu certains codes maintenant je sais plus s'il me faut une combinaison ou une permutation. ce que je veux c'est un code permettant de gerrer tout les cas :
3 possibilité : 1 ou 2 ou X
> exemples :
1 1 2 1 X 1 2 2 2 X X X  1
2 2 1 1 X X X X 1 1 1 1 2
....
ATTENTION :
les cas de :
1 1 1 1 1 1 1 1 1 1 1 1 1
et
X X X X X X X X X X X X X
...
doivent figurer
pouvez vous m'aider -svp-
merci

12 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
28 déc. 2007 à 14:50
3^13 possibilités soit 1 594 323 possibilités, ça risque d'être long à calculer et à afficher

Ceci dit, tu devrais y arriver avec 13 boucles For imbriquées. Pas très optimiser comme méthode mais pour l'instant je vois pas autre chose.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
28 déc. 2007 à 15:03
Voici une petite option récursive assez rapide à priori :
Private Function Combine(ByRef Buffer() As String, ByVal Lim As Long) As String()
Dim i As Long, Sol() As String

If Len(Buffer(0)) = Lim Then
Combine = Buffer
Else
ReDim Sol(((UBound(Buffer) + 1) * 3) - 1)
For i = 0 To UBound(Buffer)
Sol(i * 3) = Buffer(i) & "1"
Sol((i * 3) + 1) = Buffer(i) & "2"
Sol((i * 3) + 2) = Buffer(i) & "X"
Next
Combine = Combine(Sol, Lim)
End If
Exit Function
End Function

fonction à appeler de la façon suivante :

Private Sub Command_Click()
Dim T() As String
ReDim T(2)
T(0) = "1"
T(1) = 2
T(2) = "X"
T = Combine(T, 13)
Dim i As Long
MsgBox (CStr(UBound(T) + 1) & " solutions")
Open "c:\combinaison.txt" For Output As #1
For i = 0 To UBound(T)
Print #1, T(i)
Next
Close #1
Shell "notepad.exe c:\combinaison.txt"
End Sub

ATTENTION le fichier de sortie fait à peu près 23Mo sur disque.
Le temps de calcul en mode debug est très honorable : moins de 5 secondes (sur mon turion 64 X2 avec 2Go de ram)
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
28 déc. 2007 à 15:09
voici une nouvelle version ou j'ai viré le "Exit Function" qui ne servait à rien et dépalcé le test de sortie de récursivité pour éviter un appel pour rien (le dernier tour de récursivité en l'occurence)

Private Function Combine(ByRef Buffer() As String, ByVal Lim As Long) As String()
Dim i As Long, Sol() As String

ReDim Sol(((UBound(Buffer) + 1) * 3) - 1)
For i = 0 To UBound(Buffer)
Sol(i * 3) = Buffer(i) & "1"
Sol((i * 3) + 1) = Buffer(i) & "2"
Sol((i * 3) + 2) = Buffer(i) & "X"
Next
If Len(Sol(0)) < Lim Then
Combine = Combine(Sol, Lim)
Else
Combine = Sol
End If
End Function
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
28 déc. 2007 à 15:12
Casy < C'est marrant ca ! On s'est ddéjà croisé sur ce genre de question sur le forum et à chaque fois, tu trouve une solution linéaire avec des boucles imbriquées et moi une solution récursive !
Je dois reconnaitre que, perso, j'adooooooore la récursivité !!!!!
0

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

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
28 déc. 2007 à 15:19
Moi aussi, mais il me faut réfléchir un peu plus pour proproser quelque chose de correct, voire faire un bout de code de test.

et au boulot, j'ai pas toujours le temps de prendre le temps de bien poser le problème.

Avec la récursivité, attention au problème de la pile quand même, sa taille n'est pas illimitée

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
cs_hastalavista Messages postés 38 Date d'inscription mardi 7 mars 2006 Statut Membre Dernière intervention 26 février 2008
28 déc. 2007 à 15:23
bon merci tout le monde mais qui dit colonne dit excel :
j'ai créer 39 colonnes avec X 2 1 X 2 1 .....
puis j'ai remplie les colonnes avec
0 0
0 0
0 0
0 1
. .
. .
. .
. .
. .
0 1
le principe du calcul binaire avec 1594323 Excel supporte ca
puis devant chaque ligne j'ai define 13 cellule avec la formule :
CONCATENER(SI(CONCATENER(AK3;AL3;AM3)"001";"1";"");SI(CONCATENER(AK3;AL3;AM3)="010";"2";"");SI(CONCATENER(AK3;AL3;AM3)="100";"X";""))
bien sur AK, AL et AM doivent etre a jour avec la cellule
puis je trouve mes 1594323 lignes

bon en tout cas merci a tout le monde
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
28 déc. 2007 à 15:33
"bon merci tout le monde mais qui dit colonne dit excel"



AH ? Tiens, c'est nouveau, çà ! Seul Excel aurait des colonnes, maintenant ...

Mais aussi et surtout :
Comparer avant de permuter ...

Comparer par exemple :
"bon merci tout le monde mais qui dit colonne dit excel "
avec :
Thèmes / Visual Basic 6
0
cs_hastalavista Messages postés 38 Date d'inscription mardi 7 mars 2006 Statut Membre Dernière intervention 26 février 2008
28 déc. 2007 à 15:41
hey jmfmarques essaye ca avec VB et tu aura un plantage (surtout si t'as une machine 2.4G et 500Ram comme moi)
avant de parler il faut tester non ?
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
28 déc. 2007 à 16:03
Moi, ce que je ne comprends pas, c'ets que tu nous parles maintenant de 39 colonnes !! alors qu'à la base, la longueur d ela combinaison était de 13 caractères ! A noter qu'avec 3 caractères possibles sur 39 positions, on obtient tout de même 4 052 555 153 018 976 267 soit plus de 4 milliard de milliard de combinaisons : Ton Excel va en baver dur pour te pondre ca !!
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
28 déc. 2007 à 16:09
même avec 13 colonnes, ça fait 1594323 lignes sous Excel, et ça Excel ne supporte pas pour les version 2003 et inférieures.

Pour rappel, les limites jusqu'à la version 2003 inclue, c'est 256 colonnes et 65535 lignes.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
cs_hastalavista Messages postés 38 Date d'inscription mardi 7 mars 2006 Statut Membre Dernière intervention 26 février 2008
28 déc. 2007 à 16:16
oui vous avez raison


desolé je me suis trompé
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
28 déc. 2007 à 16:16
après un petit calcul rapide, pour stocker 4 milliard de dmilliard de combinaisons à 39 caractères, il faudrait plus de 140 000 PetaOctet (1Po = 1024 TeraOctet, sachant que 1To = 1024Go !!)
ca commence à fair eun peu trop pour Excel, ca, non ?
0
Rejoignez-nous