DES LETTRES ET PAS DE CHIFFRES ENCORE!

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 24 oct. 2008 à 15:04
rs0 Messages postés 2 Date d'inscription dimanche 25 mai 2008 Statut Membre Dernière intervention 30 octobre 2008 - 30 oct. 2008 à 22:37
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/48290-des-lettres-et-pas-de-chiffres-encore

rs0 Messages postés 2 Date d'inscription dimanche 25 mai 2008 Statut Membre Dernière intervention 30 octobre 2008
30 oct. 2008 à 22:37
Désolé Mikachu, j'ai fait une petite erreur de frappe, bonjours aura comme indexe bjnoorsu, 2 o et pas 2 n. Lorsqu'il y a des doubles lettres c'est dans la génértion des combinaisons que l'on élimine les combinaisons identiques. Regarde dans la procédure qui suit, je l'ai fait sous VB Excel puisque mot dictionnaire de mots est sous Excel, les différentes combinaisons sont affichées dans la fenêtre d'exécution de VB.

Private Sub Test()
Dim i As Integer, nElements As Integer
Dim nomtab() As String * 1
Dim nom As String

nom = "SSIGEEAN"
Ln = Len(nom)
ReDim nomtab(Ln)
For i 1 To Ln: nomtab(i) Mid$(nom, i, 1): Next i

'Tri en ordre croissant des lettres de nom
tri = True
While tri
tri = False
For i = 1 To Ln - 1
If nomtab(i) > nomtab(i + 1) Then
tmp = nomtab(i + 1)
nomtab(i + 1) = nomtab(i)
nomtab(i) = tmp
tri = True
End If
Next i
Wend
nom = ""
For i 1 To Ln: nom nom + nomtab(i): Next i
'nom avec lettres triées = AEEGINSS

'dimensionnement du tableau d'origine et remplissage
ReDim tablo_origine(Len(nom) - 1)
nElements = UBound(tablo_origine)
For i = 0 To nElements
tablo_origine(i) = Mid$(nom, i + 1, 1)
Next i
'dimensionnement des tableaux test et résultat
ReDim tablo_test(nElements)
ReDim tablo_resultat(1)
'lancement de la procédure récursive
indexe = 0
'Combinaison:
'Le nombre de combinaisons de p éléments d'un ensemble de n éléments est
'Cpn n(n-1)...(n-p+1)/p! n! / ((n-p)! p!)
'Permutation:
'Le nombre de permutation de n éléments est
'Pn = n!
'Arrangement:
'Le nombre d'arrangements de k éléments d'un ensemble F de n éléments est
'Akn n(n-1)(n-2)...(n-k+1) n! / (n-k)!

'Appel Combinaison avec argument (0, 0, nombre de lettre à combiner, 1=combinaison 0=permutation)
'SI permutation et Nb lettre à combiner <> de Nb lettre Max = arrangement
indexe = 0
For j = 0 To 3
Call Combinaison(0, 0, Ln - j, 1)
Next j
End Sub
----------------------------------------------------------------------------------------------
Sub Combinaison(n As Integer, x As Integer, z As Integer, c As Integer)
Dim i As Integer, i1 As Integer
Dim s As Variant

For i = x To UBound(tablo_origine)
DoEvents
If tablo_test(i) = False Then
tablo_resultat(n) = tablo_origine(i)
'si on a parcourru tout le tableau d'origine
If n = UBound(tablo_origine) - (UBound(tablo_origine) - (z - 1)) Then
'on construit la chaine d'affichage
s = ""
For i1 = 0 To n
s = s & tablo_resultat(i1)
Next

's contient la combinaison de lettre
If s1 <> s Then 'si s est différent de la combinaison précedente il est ok
'on affiche la chaine
Debug.Print s
s1 = s
End If

'sinon, on relance la procédure récursive
Else
'on coche la valeur déjà choisie
tablo_test(i) = True
'on prépare le tableau résultat
ReDim Preserve tablo_resultat(n + 1)
'on relance la procédure
If c Then
Call Combinaison(UBound(tablo_resultat), i, z, c)
Else
Call Combinaison(UBound(tablo_resultat), 0, z, c)
End If
'on rétablit le tableau résultat d'avant
ReDim Preserve tablo_resultat(n)
'on décoche la valeur déjà choisie
tablo_test(i) = False
End If
End If
Next
End Sub
cs_mikachu Messages postés 15 Date d'inscription jeudi 4 septembre 2003 Statut Membre Dernière intervention 25 octobre 2009
28 oct. 2008 à 17:42
Sympa RSO, j ai tout a fait compris ce que tu voulais dire, faire une recherche sur chaque mot trié alphabétiquement par rapport a la liste des lettre trié aussi. Mais je me heurte a un autre soucis, l'utilisation unque de chaque lettre comme dans tn exemple avec BONJOUR, qui compte 2 N, mais si dans les lettre aleatoire il y a qu'un N.... c est la ou je bug un peu, mais je penses etre sur le bon chemin, merci en tout cas
rs0 Messages postés 2 Date d'inscription dimanche 25 mai 2008 Statut Membre Dernière intervention 30 octobre 2008
28 oct. 2008 à 00:59
Salut Mikachu,
Pour touver tout les mots que tu peux faire avec les lettres, tu tries les lettres en ordre alphabétique croissant. En suite tu utilises une procédure récurcive pour générer des combinaisons uniques(car ABC=BAC=CAB..) de soit 4, 5, 6, etc lettres. ex: A B C D tu peux avoir ABCD en 4 lettres ou ABC, ABD, ACD ou BCD en 3 lettres et pour 2 lettres AB, AC, etc. Pour utiliser cette méthode, ta liste de mots doit avoir une colonne d'indexe qui contient le mot mais avec ses lettres triées dans l'ordre alphabétique croissant, ex: bonjours aura comme indexe bjnnorsu, et tu fais une recherche sur cet indexe avec les combinaisons de lettres crées par la procédure récurcive.
cs_mikachu Messages postés 15 Date d'inscription jeudi 4 septembre 2003 Statut Membre Dernière intervention 25 octobre 2009
24 oct. 2008 à 20:13
Salut,

Merci pour ton lien je vas y jeter un oeil
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
24 oct. 2008 à 15:04
Rejoignez-nous