Mit 3! (3 Fakultät programmieren?)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Visual_Prog.

    Mit 3! (3 Fakultät programmieren?)

    Wollte einmal nachfragen ob Jemand einen Weg kennt durch einsatz von Fakultäten(Mahte) sich viel Schreibarteit zu sparen.
    Habe hier eine If schleife, die sich genau wie 3! verhält. Dabei stehe eins, zwei und drei für drei verschiedene string möglichkeiten. sind nur als zahl ausgeschrieben, weil so die kombinationen deutlicher werden.


    VB.NET-Quellcode

    1. If teilaussage1.Contains("eins") And teilaussage2.Contains("zwei") And teilaussage3.Contains("drei") Then
    2. ElseIf teilaussage1.Contains("eins") And teilaussage2.Contains("drei") And teilaussage3.Contains("zwei") Then
    3. ElseIf teilaussage1.Contains("zwei") And teilaussage2.Contains("eins") And teilaussage3.Contains("drei") Then
    4. ElseIf teilaussage1.Contains("zwei") And teilaussage2.Contains("drei") And teilaussage3.Contains("eins") Then
    5. ElseIf teilaussage1.Contains("drei") And teilaussage2.Contains("zwei") And teilaussage3.Contains("eins") Then
    6. ElseIf teilaussage1.Contains("drei") And teilaussage2.Contains("eins") And teilaussage3.Contains("zwei") Then
    7. End If

    Ich Fakultät nur als Multiplikation aller Zahlen von 1 bis n, also 3! wäre 3*2*1 = 6. Bin mir nicht sicher, wie das hier zutrifft. Ich denke, Du meinst Permutationen. Also welche Anordnungen von n Elementen gibt es. (Die Anzahl an Anordnungen von n Elementen ist n!, aber das hilft hier nicht wirklich weiter.)
    Also in VB gibt's keinen hinten angestellten !-Operator. Du kannst Dir aber eine Funktion basteln, die das macht, was Du hier prüfst. Das könnte so aussehen:

    VB.NET-Quellcode

    1. Shared Function CheckTheThing(Teilaussage1 As Irgendwas, Teilaussage2 As Irgendwas, Teilaussage3 As Irgendwas) As Boolean
    2. For Each i As String() In Permutations({"eins", "zwei", "drei"})
    3. If Teilaussage1.Contains(i(0)) AndAlso _
    4. Teilaussage2.Contains(i(1)) AndAlso _
    5. Teilaussage3.Contains(i(2)) Then
    6. Return True
    7. End If
    8. Next
    9. Return False
    10. End Function

    Permutations ist dann einfach ein Algorithmus, der die Permutationen der angegbebenen Elemente zurückgibt. Solche Algorithmen gibt's zu Hauf im Forum.

    Du könntest auch ausführlicher erklären, was Du vor hast. Dann können wir möglicherweise besser Tipps geben.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ja genau, es geht um Permutationen! Es sing nicht um ein spezielles Problem, sondern ist mir aufgefallen, dass dieses man immer wieder auf dieses Problem trifft. Wenn man 3 Möglichkeiten hat, also 3! = 6 ist das ja in ordnung. Aber wer schreibt schon 5! = 120 Möglichkeiten aus?
    Danke für den Code-Vorschlag, so genau hätte ich das nicht getroffen.
    HIer noch ein Vorschlag:

    VB.NET-Quellcode

    1. Public Function CheckTheThing(Teilaussage1 As String, Teilaussage2 As String, Teilaussage3 As String) As Boolean
    2. For Each i As String() In permutations("eins", "zwei", "drei")
    3. If Teilaussage1.Contains(i(1) Or i(2) Or i(3) And _
    4. Teilaussage2.Contains(i(2)) Or i(1) Or (3) And _
    5. Teilaussage3.Contains(i(3)) Or i(1) Or i(2)) Then
    6. Return True ' fuer true brauchen wir ja mehrere fälle, es kann ja sein dass z.b. in teilaussage1 die zwei order drei vorkommt
    7. End If
    8. Next
    9. For Each i As String() In permutations("eins", "zwei", "drei")
    10. If Teilaussage1.Contains(i(1) AndAlso Teilaussage2.Contains(i(1)) AndAlso Teilaussage3.Contains(i(1))) Then
    11. ElseIf Teilaussage1.Contains(i(2) AndAlso Teilaussage2.Contains(i(2)) AndAlso Teilaussage3.Contains(i(2))) Then
    12. ElseIf Teilaussage1.Contains(i(3) AndAlso Teilaussage2.Contains(i(3)) AndAlso Teilaussage3.Contains(i(3))) Then
    13. Return False ' habe hier die pfade "eins eins eins" , "zwei zwei zwei" und "drei drei drei" blockiert, weil es ja sonst insgesamt 9 Permutationen gäbe. aber es geht ja um 3! alsu dürfen es nur 6 Permutationen sein.
    14. End If
    15. Next
    16. Return False
    17. End Function

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

    Ich glaube, Du bist da mit den Klammern etwas durcheinander gekommen.

    VB.NET-Quellcode

    1. Teilaussage1.Contains(i(1) Or i(2) Or i(3)
    Das wird erstens nicht kompilieren, und zweitens ist es nicht nötig.
    Die Permutations({"eins", "zwei", "drei"})-Funktion gibt ja schon alle möglichen Kombinationen zurück. Du musst die nicht nochmal herumdrehen. Als Beispiel:

    VB.NET-Quellcode

    1. For Each i In Permutations({"eins", "zwei", "drei"})
    2. Console.WriteLine(String.Join(", ", i)) 'Verknüpft alle Teile in dieser Permutation mit einem Beistrich
    3. Next
    4. 'Gibt folgendes aus:
    5. 'eins, zwei, drei
    6. 'eins, drei, zwei
    7. 'zwei, eins, drei
    8. 'zwei, drei, eins
    9. 'drei, eins, zwei
    10. 'drei, zwei, eins
    11. Das heißt, wenn man die For-Schleife ausrollt, wird das geprüft:
    12. If Teilaussage1.Contains("eins") AndAlso Teilaussage2.Contains("zwei") AndAlso Teilaussage3.Contains("drei") Then Return True
    13. If Teilaussage1.Contains("eins") AndAlso Teilaussage2.Contains("drei") AndAlso Teilaussage3.Contains("zwei") Then Return True
    14. If Teilaussage1.Contains("zwei") AndAlso Teilaussage2.Contains("eins") AndAlso Teilaussage3.Contains("drei") Then Return True
    15. If Teilaussage1.Contains("zwei") AndAlso Teilaussage2.Contains("drei") AndAlso Teilaussage3.Contains("eins") Then Return True
    16. If Teilaussage1.Contains("drei") AndAlso Teilaussage2.Contains("eins") AndAlso Teilaussage3.Contains("zwei") Then Return True
    17. If Teilaussage1.Contains("drei") AndAlso Teilaussage2.Contains("zwei") AndAlso Teilaussage3.Contains("eins") Then Return True
    18. Return False

    Möchtest Du eigentlich unterscheiden können, welche der Kombinationen es sein soll?

    Wie gesagt, wenn Du uns erklärst, was Du eigentlich vor hast, dann können wir Dir vielleicht besser Tipps geben. Dass Deine Teilaussagen Strings sind ist z.B. schon mal sehr ungewöhnlich. Das lässt darauf schließen, dass man da einiges verbessern kann. Und vielleicht wir die Sache mit den Permutationen sogar unnötig.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Habe noch kurz fragen zum Code:
    - Permutations muss man irgendwo deklarieren? Wie?

    VB.NET-Quellcode

    1. For Each i In Permutations({"eins", "zwei", "drei"})
    2. Console.WriteLine(String.Join(", ", i)) 'Verknüpft alle Teile in dieser Permutation mit einem Beistrich
    3. Next

    Es geht eigentlich nur um Konjunktionen. Bei bestimmten Zahlenkombinationen gibt die Kosole dann zurück, ob die aussage "true" ist oder "false".
    Sei meinetwegen gesagt, die Kombinationen 123 und 132 geben "true" wieder und alle andere "false".