Buchstaben Kombinationen erstellen

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Siestaeg.

    Buchstaben Kombinationen erstellen

    Hallo Leute,



    habe folgendes Problem. Muß aus einer Buchstabenkette alle möglichen Kombinationen erstellen.

    Die Permutation nimmt ja immer alle Buchstaben.

    Hier ein Beispiel

    Aus den Buchstaben A B C D entstehen



    A;B;C;D;AB;AC;AD;BC;BD;CD;ABC;BCD;ACD;ABD;ABCD



    Die Kombiantionen ABC und z.B. BCA sind für mich gleich, das heisst nur eine davon sollte aufgelistet werden.



    Die Länge der Zeichenfolge varriert zwischen 2 und 10.



    Kann mir jemand helfen ? Plage mich schon seit mehreren Tagen damit rum.



    Danke
    Hallo!

    Ich verstehe nicht warum A; B; C; D ungleich, aber ABC und z.B. BCA, jedoch gleich sein sollen?
    Wie soll man denn so etwas unterscheiden?


    Hatte einmal einen Permutations-Algorhithmus geschrieben,
    vielleicht hilft er dir als Anregung:

    VB.NET-Quellcode

    1. Public Shared Function Permutate _
    2. (ByVal s As String) As Generic.List(Of String)
    3. Dim results = New Generic.List(Of String)
    4. Permutate(s, 1, results)
    5. Return results
    6. End Function
    7. Private Shared Sub Permutate _
    8. (ByVal s As String _
    9. , ByVal pos As Int32 _
    10. , ByVal results As Generic.List(Of String))
    11. If pos <= s.Length - 1 Then
    12. Permutate(s, pos + 1, results)
    13. Else
    14. If Not results.Contains(s) Then results.Add(s)
    15. End If
    16. For i = pos To s.Length - 1
    17. s = s.Substring(0, pos - 1) & s.Substring(pos) & s.Substring(pos - 1, 1)
    18. Permutate(s, pos + 1, results)
    19. Next i
    20. End Sub
    21. 'Aufruf
    22. For Each item In BCW.etc.Transform.Permutate("ABC")
    23. MsgBox(item)
    24. Next
    Hi Leute mit Permutation habe ich das schon probiert.

    Hinter jedem Buchtsaben steht ein Maß, eine Länge.



    z.B.

    A = 300mm

    B = 500mm

    C = 700mm

    D = 1000mm



    AB = 300 + 500 = 800 mm

    BA = 500 + 300 = 800 mm deshalb für mich gleich.



    Mein Problem ich habe eine rohe Stange (6000mm) und muß ermitteln welche Kombination von Teilstücken optimal ist.
    Ja, jedes Teilstück nur einmal, wobei ich natürlich auch zwei oder meherer gleich lange Teile haben kann, diese haben dann aber einen anderen Buchstaben.



    Die Maße waren theoretisch, und die 6000mm bei einer neuen Stange. Die Stange kann natürlich auch kürzer sein, wenn schon Stücke davon abgeschnitten wurden, und ein neuer Schnittvorgang beginnt.



    Die Teilstücke sin in der Regel zwischen 600 und 2500 mm lang. (2-10 Teilstücke)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Siestaeg“ ()

    Hallo!

    Ist vielleicht an einigen Stellen noch nicht ganz optimal, aber es funktioniert:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim parts = (New String() {"A", "B", "C", "D"}).ToList
    3. Dim result = New List(Of String)
    4. For x = 1 To parts.Count
    5. For y = 0 To parts.Count - 1
    6. Dim sb = New System.Text.StringBuilder
    7. For z = 0 To x - 1
    8. If y + z > parts.Count - 1 Then Continue For
    9. sb.Append(parts.Item(y + z))
    10. Next z
    11. If sb.Length >= x Then result.Add(sb.ToString)
    12. Next y
    13. Next x
    14. TreeView1.Nodes.Clear()
    15. For Each item In result
    16. TreeView1.Nodes.Add(item)
    17. Next
    18. End Sub



    EDIT: Wie ich gerade feststelle läuft es doch noch nicht ganz korrekt, aber schau trotdem einmal rein!
    Hallo vanitas-mundi,

    danke für den Code. Ich habe mir händisch mal die Combis von A B C D zusammangestellt und komme auf 15 Stück

    A B C D AB AC AD BC BD CD ABC BCD ACD ABD ABCD


    Die 10 Fettgeschriebenen sind im Treeview wenn ich das ganze starte
    Der Code ist wohl fehlerhaft...
    Ich versuchs mal (Stichwort: Produktmengen)

    VB.NET-Quellcode

    1. Private Function RekProd(main As Char, sub As String, Length As Integer) As List(Of String)
    2. Dim res As New List(Of String)
    3. If Length > 0 Then
    4. For i = 0 To sub.Length - 1
    5. For Each s As String In RekProd(sub.Chars(i), sub.Substring(i + 1), Length - 1)
    6. res.Add(main & s)
    7. Next
    8. Next
    9. Else
    10. res.Add("")
    11. End If
    12. Return res
    13. End Function
    14. Private Function Produktmenge(chars As String) As List(Of String)
    15. Dim res As New List(Of String)
    16. For i = 0 To chars.Length
    17. res.AddRange(RekProd("", chars, i).ToArray())
    18. Next
    19. Return res
    20. End Function


    Hopefully, it works...
    Teste mal mit "ABC"
    Ergebnis wäre Definitionsgemäß

    Quellcode

    1. -leerer String-
    2. A
    3. B
    4. C
    5. AB
    6. AC
    7. BC
    8. ABC
    Vielleicht geht irgendwie so in der Art

    A B C D
    0 0 0 1 = D
    0 0 1 0 = C
    0 1 0 0 = B
    1 0 0 0 = A

    0 0 1 1 = CD
    0 1 0 1 = BD
    1 0 0 1 = AD

    0 1 1 0 = BC
    1 0 1 0 = AC

    1 1 0 0 = AB

    0 1 1 1 = BCD
    1 1 1 0 = ABC
    1 1 0 1 = ABD
    1 0 1 1 = ACD

    1 1 1 1 = ABCD
    Geht (anscheinend ;) )

    VB.NET-Quellcode

    1. Private Sub ZieheEinen(ByVal quelle As String, ByVal prefix As String, ByVal l As HashSet(Of String))
    2. If String.IsNullOrEmpty(quelle) Then Exit Sub
    3. Dim tmp As String
    4. For i = 0 To quelle.Length - 1
    5. tmp = prefix & quelle(i)
    6. l.Add(tmp)
    7. ZieheEinen(quelle.Substring(i + 1), tmp, l)
    8. Next
    9. End Sub


    Aufruf:

    VB.NET-Quellcode

    1. Dim l As New HashSet(Of String)
    2. ZieheEinen("ABCD", "", l)



    Nachtrach:
    Ohne Rekursion als Bitkombination:

    VB.NET-Quellcode

    1. Private Sub Permute(ByVal s As String, ByVal l As HashSet(Of String))
    2. Dim tmp As Integer = 2 ^ s.Length - 1
    3. Dim lang As Integer = s.Length - 1
    4. Dim sb As System.Text.StringBuilder
    5. For i As Integer = 1 To tmp
    6. sb = New System.Text.StringBuilder
    7. For j = 0 To lang
    8. If (i And 2 ^ j) Then
    9. sb.Append(s(j))
    10. End If
    11. Next
    12. l.Add(sb.ToString)
    13. Next
    14. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „picoflop“ ()