Combinaisons sans remises et sans ordres

Bonjour,

Je sollicite votre aide pour un projet.

J'ai une liste de 12 code erreurs. Pour simplifier, je les appelle A, B, C, ..., L . Ils sont en colonne B.

Je souhaiterai réussir à lister toutes les combinaisons possibles d'erreurs (de 1 à 3 caractères), sans remise (ex : pas de AAC) et sans ordre (ex: ABC est la même chose que ACB ou BCA et ne doit donc apparaitre qu'une fois).

Merci à toutes les personnes qui prendront le temps de lire mon problème!

image

Bonne fin de journée,

Bonjour,

Si ma mémoire est bonne et sauf erreur de ma part, le nombre d'occurrences devrait être :

capture

Merci aux matheux de me corriger...

La bonne formule, c'est :

capture
https://www.alloprof.qc.ca/fr/eleves/bv/mathematiques/les-permutations-les-arrangements-et-les-combinai-m1346
capture

bonsoir,

selon moi c'est 298

codes 3 lettres = 12*11*10/6 = 12!/(9!*3!)

codes 2 lettres =12*11/2 = 12!/(10!*2!)

codes 1 lettre =12 =12!/(11!*1!)

Bonjour h2so4,

On retrouve bien les 220 combinaisons à 3 lettres dans ta liste.

Je serais curieux de voir ton code car cela devrait intéresser pas mal de monde. Tu devrais le rajouter à la liste de tes fichiers.

Cordialement.

A tester :

Option Explicit

Sub DenombrerLesCombinaisonsA3()

Dim AireListe As Range
Dim I As Long, J As Long, K As Long, LigneEnCours As Long, ColonneResultat As Long
Dim MonDico As Object 'Scripting.Dictionary
Dim Trigramme As String, Trigramme3 As String

    Set AireListe = Range("t_Liste")
    Set MonDico = CreateObject("Scripting.Dictionary")

    LigneEnCours = 2
    ColonneResultat = 5
    Sheets("Feuil1").Columns(5).Clear

    With AireListe
         'Debug.Print .Address
         For I = 1 To AireListe.Count
             For J = 1 To AireListe.Count
                 For K = 1 To AireListe.Count
                     Trigramme = AireListe(I) & "-" & AireListe(J) & "-" & AireListe(K)
                     Trigramme3 = AireListe(I) & AireListe(J) & AireListe(K)
                     If Not MonDico.Exists(OrdreTrigramme(Trigramme)) And OrdreTrigramme(Trigramme) <> "Nok" Then
                           MonDico.Add OrdreTrigramme(Trigramme), Trigramme3
                           Sheets("Feuil1").Cells(LigneEnCours, ColonneResultat) = Trigramme3
                           LigneEnCours = LigneEnCours + 1
                     End If
                 Next K
             Next J
         Next I

    End With

    Set AireListe = Nothing
  Set MonDico = Nothing

End Sub

Function OrdreTrigramme(ByVal Trigramme2 As String) As String

Dim I As Integer, J As Integer, NbCar As Integer
Dim TabTri As Variant
Dim Temp As Variant

    TabTri = Split(Trigramme2, "-")

    For I = LBound(TabTri) To UBound(TabTri)
           If TabTri(0) = TabTri(1) Or TabTri(0) = TabTri(2) Or TabTri(1) = TabTri(2) Then
              OrdreTrigramme = "Nok"
              Exit Function
           End If
    Next I

    For I = LBound(TabTri) To UBound(TabTri)
        For J = I To UBound(TabTri)
           If TabTri(J) < TabTri(I) Then
              Temp = TabTri(J): TabTri(J) = TabTri(I): TabTri(I) = Temp
           End If
        Next J
    Next I
    OrdreTrigramme = Join(TabTri, "-")

End Function

bonjour à tous,

@Eric Kergresse,

voici mon code spécifique pour la question de Pauloea

Sub gen()
    Dim i&, j&, k&, s$, ctr&
    For i = 1 To 12 ' lettres pour 1ere position
        ctr = ctr + 1
        Cells(ctr, 1) = Chr(i + 64) 'code à une lettre
        For j = i + 1 To 12 ' lettres  pour 2ème position
            ctr = ctr + 1
            Cells(ctr, 1) = Chr(i + 64) & Chr(j + 64) 'code à 2 lettres
            For k = j + 1 To 12 'lettres pour 3ème position
                ctr = ctr + 1
                Cells(ctr, 1) = Chr(i + 64) & Chr(j + 64) & Chr(k + 64) ' code à 3 lettres
            Next k
        Next j
    Next i
End Sub

ou celui-ci plus générique (et basé sur un algorithme récursif)

Dim ctr&
Sub gen()
    Dim m$
    m$ = "ABCDEFGHIJKL" 'lettres possibles
    ctr = 0
    combi 1, m 'code à 1 lettre
    combi 2, m 'code à 2 lettres
    combi 3, m 'code à 3 lettres
End Sub

Sub combi(n&, m$, Optional niveau& = 1, Optional ni& = 1, Optional s$ = "")
    Dim olds$, i&
    olds = s
    For i = ni To Len(m)
        s = s & Mid(m, i, 1)
        If n = niveau Then
            ctr = ctr + 1
            Cells(ctr, 1) = s
        Else
            combi n, m, niveau + 1, i + 1, s
        End If
        s = olds
    Next i
End Sub

bonsoir,

selon moi c'est 298

codes 3 lettres = 12*11*10/6 = 12!/(9!*3!)

codes 2 lettres =12*11/2 = 12!/(10!*2!)

codes 1 lettre =12 =12!/(11!*1!)

@h2so4

Merci! effectivement c'est bien ça. J'ai bien toute la liste.

Par contre, pourrais-tu me montrer comment tu as fait sur excel pour editer la liste? Car je vais surement devoir rajouter des codes erreurs au fur et à mesure.

Merci à tous.

Bonne journée

bonjour Pauloea,

Par contre, pourrais-tu me montrer comment tu as fait sur excel pour editer la liste?

j'ai utilisé une macro, (voir codes que j'ai mis dans ma réponse précédente). Le premier code vite fait donne une réponse spécifique au problème que tu as posé, le 2ème est plus générique sur base des lettres dans la variable M, il peut générer les différentes combinaisons (combi x,m = générer toutes les combinaisons de x lettres en utilisant les lettres contenues dans la variable M.)

Rechercher des sujets similaires à "combinaisons remises ordres"