cs_hastalavista
Messages postés38Date d'inscriptionmardi 7 mars 2006StatutMembreDernière intervention26 février 2008
-
28 déc. 2007 à 13:52
Kristof_Koder
Messages postés918Date d'inscriptionvendredi 3 août 2007StatutMembreDernière intervention27 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
Kristof_Koder
Messages postés918Date d'inscriptionvendredi 3 août 2007StatutMembreDernière intervention27 octobre 200810 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)
Kristof_Koder
Messages postés918Date d'inscriptionvendredi 3 août 2007StatutMembreDernière intervention27 octobre 200810 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
Kristof_Koder
Messages postés918Date d'inscriptionvendredi 3 août 2007StatutMembreDernière intervention27 octobre 200810 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é !!!!!
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_hastalavista
Messages postés38Date d'inscriptionmardi 7 mars 2006StatutMembreDernière intervention26 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
Kristof_Koder
Messages postés918Date d'inscriptionvendredi 3 août 2007StatutMembreDernière intervention27 octobre 200810 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 !!
Kristof_Koder
Messages postés918Date d'inscriptionvendredi 3 août 2007StatutMembreDernière intervention27 octobre 200810 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 ?