Alle möglichen Kombinationen durchgehen

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Alle möglichen Kombinationen durchgehen

    Ich erhalte über meinen ByVal zahlen As String() Parameter die vom Nutzer angegebenen bekannten und unbekannten Zahlen. Der String-Array wird dann für die Verarbeitung in einen Integer-Array-Array umgewandelt.

    Der String-Array sieht zum Beispiel so aus:

    (0) 5000 (dieser Wert wird nicht geändert)
    (1) 3000-7000 (von 3000 bis 7000)
    (2) 1000 (dieser Wert wird nicht geändert)
    (3) 2500 (dieser Wert wird nicht geändert)
    (4) ? (unbekannter Wert, die Parameter ByVal minValue As Integer und ByVal maxValue As Integer bestimmen den Minimal- und Maximalwert)
    (5) 1500-3000 (von 1500 bis 3000)
    (6) 9000 (dieser Wert wird nicht geändert)

    Der Integer-Array-Array sieht zum Beispiel so aus:

    (0)(0) 5000 (dieser Wert wird nicht geändert)
    (1)(0) 3000 (Minimalwert)
    (1)(1) 7000 (Maximalwert)
    (2)(0) 1000 (dieser Wert wird nicht geändert)
    (3)(0) 2500 (dieser Wert wird nicht geändert)
    (4)(0) minValue (Wert des minValue-Parameters)
    (4)(1) maxValue (Wert des maxValue-Parameters)
    (5)(0) 1500 (Minimalwert)
    (5)(1) 3000 (Maximalwert)
    (6)(0) 9000 (dieser Wert wird nicht geändert)

    Ich möchte nun alle möglichen Kombinationen durchgehen. Das Problem für mich ist, dass ich keine Ahnung habe wie der Code für sowas aussehen soll (die Umwandlung nicht miteinbezogen).

    Wenn Ihr mir bei diesem Problem weiterhelfen könntet, wäre ich Euch sehr dankbar!
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Vultrax“ ()

    Eh ... wat? Also nochmal zum Mitschreiben: Du hast Private Sub WieAuchImmerDieFunktionHeisst(zahlen As String(), minValue As Integer, maxValue As Integer). Und dann schreibst Du zum Aufruf:

    VB.NET-Quellcode

    1. WieAuchImmerDieFunktionHeisst({"1000","2000","3000-5000","?"}, 500, 10000)

    Und dann willst Du rausbekommen:

    VB.NET-Quellcode

    1. DeinIntegerFeld(0)(0) = 1000
    2. DeinIntegerFeld(1)(0) = 2000
    3. DeinIntegerFeld(2)(0) = 3000
    4. DeinIntegerFeld(2)(1) = 5000
    5. DeinIntegerFeld(3)(0) = 500
    6. DeinIntegerFeld(3)(1) = 10000

    Wenn dem so ist, dann sind Deine Stichworte (ja, FFF, diesmal präsentiere ich tatsächlich (noch?) keinen fertigen Code ;) ) : If und String.Split("-"c)Ich hoffe nur, dass ein 2-D-Array für Deine wasAuchImmerDabeiRumkommenSoll-Aufgabe das Richtige ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke Dir erstmal für Deine Antwort!

    VaporiZed schrieb:

    Eh ... wat? Also nochmal zum Mitschreiben: Du hast Private Sub WieAuchImmerDieFunktionHeisst(zahlen As String(), minValue As Integer, maxValue As Integer). Und dann schreibst Du zum Aufruf:

    VB.NET-Quellcode

    1. WieAuchImmerDieFunktionHeisst({"1000","2000","3000-5000","?"}, 500, 10000)

    Richtig, so wird die Funktion aufgerufen.

    VaporiZed schrieb:

    Und dann willst Du rausbekommen:

    VB.NET-Quellcode

    1. DeinIntegerFeld(0)(0) = 1000
    2. DeinIntegerFeld(1)(0) = 2000
    3. DeinIntegerFeld(2)(0) = 3000
    4. DeinIntegerFeld(2)(1) = 5000
    5. DeinIntegerFeld(3)(0) = 500
    6. DeinIntegerFeld(3)(1) = 10000

    Wenn dem so ist, dann sind Deine Stichworte (ja, FFF, diesmal präsentiere ich tatsächlich (noch?) keinen fertigen Code ;) ) : If und String.Split("-"c)Ich hoffe nur, dass ein 2-D-Array für Deine wasAuchImmerDabeiRumkommenSoll-Aufgabe das Richtige ist.

    Wie ich den String-Array in einen Integer-Array-Array umwandel weiß ich.
    Ich möchte nun jede mögliche Kombination durchgehen und überprüfen (der Code mit der Überprüfung ist kein Problem).
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Vultrax“ ()

    Vultrax schrieb:

    Ich möchte nun jede mögliche Kombination durchgehen und überprüfen (der Code mit der Überprüfung ist kein Problem).
    Aber was meinst Du damit? Werd mal bitte so konkret wie möglich, ggf. mit neuem Beispiel, weil ich nicht verstehe, was Du mit Kombinationen effektiv meinst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Aber was meinst Du damit? Werd mal bitte so konkret wie möglich, ggf. mit neuem Beispiel, weil ich nicht verstehe, was Du mit Kombinationen effektiv meinst.

    Die Funktion wir zum Beispiel mit folgenden Parametern aufgerufen:
    {"3", "2-5", "?"} (zahlen)
    3 (minValue)
    7 (maxValue)

    Die unbekannten Zahlen werden im Integer-Array-Array so lange modifiziert bis alle Kombinationen durchlaufen wurden. Die bekannten Zahlen ändern sich dabei nicht.
    (0)(0) 3 (die erste Zahl wird nicht geändert weil sie bekannt ist)
    (1)(0) 2 (der Minimalwert der zweiten Zahl)
    (1)(1) 5 (der Maximalwert der zweiten Zahl)
    (2)(0) minValue (da der Nutzer hier "?" angegeben hat, legt der minValue-Parameter den Wert fest)
    (2)(1) maxValue (da der Nutzer hier "?" angegeben hat, legt der maxValue-Parameter den Wert fest)

    3
    2
    3
    (Kombination wird überprüft)
    3
    2
    4
    (Kombination wird überprüft)
    3
    2
    5
    (Kombination wird überprüft)
    ...
    3
    5
    5
    (Kombination wird überprüft)
    3
    5
    6
    (Kombination wird überprüft)
    3
    5
    7
    (Kombination wird überprüft)
    (keine weitere Kombination möglich, die Schleife wird beendet)
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford

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

    Aha, ok. Also ggf. so ne Art Tresorknacker(spiel?). Oder was ganz anderes.
    Und wo ist das Problem? Das ist ne Rekursion mit For-Schleifen, die von x bis y gehen, wobei x eben der Arraywert an einer bestimmten Stelle mit Index 0 ist, und y mit Index 1. Die Integer-Array-Werte hast Du. Dann eben die For-Schleifen; ggf ohne Rekursion, wenn Du weißt, dass Du immer eine konstante Menge an zahlen hast.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed
    Es ist ziemlich schwierig zu erklären, aber es geht dabei um Datenwiederherstellung.

    Kannst du mir ein Beispiel zeigen (oder es Step-By-Step beschreiben)? Wie man mit den verschiedenen Schleifen umgeht weiß ich, nur blicke ich den Code überhaupt gar nicht ... Ich denke womöglich viel zu kompliziert. Was ist denn wenn der erste unbekannte Wert größer als der zweite ist? Beispiel: {"450-900", "5-20", "100-150", "115", "?", [...]}.
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Vultrax“ ()

    Ich würd mal sagen: schlechtes Beispiel. Da gibt es nur ein ?. Oder meinst Du die Bereiche? Jetzt mach doch mal ne einfache For-Schleife für das erste BrautZahlenpaar. Also nicht nur einfach hardcoded die Werte, sondern ausgedrückt als Teile Deines Integer-Arrays. Bevorzugt in ner Sub, der Du als Parameter Anfang und Ende der For-Schleife übergibst und zusätzlich noch, welche Position des Arrays gerade durchgezählt wird. Und in der Schleife rufst Du dieselbe Funktion mit veränderten Parametern auf. Zeig mal, dass Du das hinbekommst. Dann können wir sinnvoll weitermachen. Es sei denn jemand der Mitleser hat einen komplett anderen/besseren Vorschlag.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ein Ansatz. Den Rest wirst sicher fertig bringen.

    Freundliche Grüsse

    exc-jdbi


    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Option Strict On
    2. Option Explicit On
    3. Public Module TestKombi
    4. Private Rand As New Random
    5. Public Sub Main()
    6. Dim t() As Int32 = Nothing
    7. Dim nums = RngKombi()
    8. Dim res = New List(Of Int32())
    9. For i As Int32 = nums(1)(0) To nums(1)(1)
    10. For j As Int32 = nums(2)(0) To nums(3)(0)
    11. t = {nums(0)(0), i, j}
    12. res.Add(t)
    13. Next
    14. Next
    15. PrintOut(res)
    16. Console.ReadLine()
    17. End Sub
    18. Private Sub PrintOut(lst As List(Of Int32()))
    19. For Each t() As Int32 In lst
    20. t.ToList.ForEach(Sub(x) Console.Write("{0} ", x))
    21. Console.WriteLine()
    22. Next
    23. End Sub
    24. Private Function RngKombi() As Int32()()
    25. Dim z1 = 3, z2 = 2, z3 = 5
    26. Dim min = 3, max = 7
    27. Dim res = New Int32(3)() {}
    28. res(0) = {z1}
    29. res(1) = {z2, z3}
    30. res(2) = {min}
    31. res(3) = {max}
    32. Return res
    33. End Function
    34. End Module