Announcement

Collapse
No announcement yet.

Strings mit einer "Maske" durchsuchen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Strings mit einer "Maske" durchsuchen

    Hallo zusammen.

    Ich habe angefangen Javascript zu programmieren und komme bei dem Durchsuchen von Strings nicht weiter.

    Ich habe einen String der immer aus 7 Zeichen besteht. Diese 7 Zeichen möchte ich nun mit einer Art Maske durchsuchen. Dabei geht es darum Pokerhände zu erkennen.

    ZB. habe ich in den String "25779JK". Im Poker hat man hier dann mit denn beiden 7 ein Paar. Bei dem String "444QAA" wärde das mit den 3 x 4 und 2 x A ein Fullhouse. Gibt es eine einfache Möglichkeit den String, einfach ausgedrückt, auf diese Art zu durchsuchen.

    wenn im string 2 mal das gleich zeichen dann paar = 1 oder wenn im string 3 mal das gleiche zeichen dann drilling = 1

    Warscheinlich sehe ich den Wald vor lauter Bäumen nicht. Aber ich finde gerade keinen Ansatz.

    Danke für Tipps
    Jan

  • #2
    Nein
    Üblicherweise nimmt man für sowas eine Hashmap
    Man geht den String Zeichen für Zeichen durch und der Key der Map ist der Buchstabe. Für jedes gefundene Zeichen wird in die Hashmap aufgenommen und der Value des Keys um 1 erhöht.
    Am Ende hat man Keys und in den Values "wie oft dieser Key vorgekommen ist"

    https://www.google.com/search?client...script+hashmap
    Zuletzt editiert von Christian Marquardt; 26.08.2020, 19:24.
    Christian

    Comment


    • #3
      Soll der string wirklich eine Poker Hand darstellen? Wie würde in deinem string z.B. ein Flush aussehen (5 beliebige Karten einer Farbe). Ich sehe nicht das dein string die Farbe berücksichtigt.

      Für eine allgemeine Lösung ist es eigentlich egal was der string genau darstellt. Ich frage nur deshalb weil im allgemeinen die Antwort von Christian richtig ist. Das ist aber die allgemeine Lösung die auch funktioniert wenn große Zahlenräume betroffen sind um das performance und reourcenmäßig in Grenzen zu halten. Poker ist aber kein wirklich größer Raum von Varianten (5 aus 52 oder in deiner Variante scheinbar 7 aus 52). Und die Anzahl Varianten die man nachhalten will ist noch kleiner.

      Also was und welche Varianten (Untermenge von Poker) sollen erkannt werden? Anhand dessen können wir möglicherweise eine einfache speziellere Lösung vorschlagen die dir beim programmieren lernen mehr hilft.
      Nebenbei willst du davon ausgehen das dein string so wie angedeutet immer nach irgendwelchen Kriterien sortiert ist?





      Comment


      • #4
        Hallo.

        Ganz so einfach wie ich es geschrieben habe ist es nicht. Ich habe eine Array Karten welches ich in verschachtelten Schleifen so fülle:

        karten[i] = {
        kartenwert : i + 1,
        kartentyp : kartentyp[i],
        kartenfarbe : farben[0],
        aktiv : true,
        };

        Hier werden die 52 Karten dann von 2 - Ass und den Farben Herz - Pik gefüllt. Die "Farben" sind über Konstanten als Symbol gespeichert.

        const pik = "♠";
        const herz = "♥";
        const karo = "♦";
        const kreuz = "♣";
        var farben = new Array(pik, herz, karo, kreuz);

        In .kartentyp wird einfach die Karte selber abgelegt, also 2, 3, 4 ..... T, J, Q, K, A.


        Dann ziehe ich per Zufall 7 Karten, die dann die "Pokerhand" darstellen, und lege sie in einem neuen Array ab.

        Zur Zeit übergebe hier ab hier .kartentyp und .kartenfarbe der 7 Karten in einen String der dann zB. so aussieht:

        A♣2♠3♠7♥K♦K♠J♣

        Und diesen String oder eben das Array der gezogen Karten möchte ich nun auf Pokerhände prüfen.

        Gruß
        Jan

        Comment


        • #5
          Doch es ist einfach.
          Den String in 2er Schritten durchlaufen und als Key eben die beiden Buchstaben/Zeichen nehmen
          Christian

          Comment


          • #6
            Beispiel wie ich vorgehe würde.
            Das ist jetzt nicht vollständig oder Javascript spezifisch sondern komplett abstrakt hilft dir aber vielleicht einen vollständigen Algorithmus auszudenken und zu implementieren.
            Je nach Prüfung willst du manchmal nur Wissen welchen Werte du hast (für Paare, Drillinge, Vierlinge) und manchmal nur welche Farbe (Flush) und manchmal leider auch eine Mischung aus beidem (Straights zum Beispiel)

            Beispiel: A♣2♠3♠7♠K♦K♠J♠ (ein ♠ Flush das Paar Könige ist also eigentlich uninteressant)

            Ich würde den String jetzt parsen (zählen) und in eine Key/Value Liste packen.
            Sowohl für Werte als auch für Farben unabhängig. Ob das hier die gleiche Liste ist für Werte und Farben oder 2 getrennte ist ein Detail das du dir
            selbst überlegen kannst. Während dem implementieren fällt die wahrscheinlich auf welche Variante besser ist. Hier gehe ich jetzt mal einfacher weise davon aus das es die gleiche Liste ist

            Key Value
            A 1
            2 1
            3 1
            7 1
            K 2
            J 1

            ♣ 1
            ♠ 5
            ♦ 1

            Und da du auch sowas wie Straights erkennen willst mal farbabhängig(als Straight Flush) und mal farbunabhängig(normaler Flush) eine zweite Liste
            in dem die vorhanden Werte einer Farbe stehen und einmal farbunabhängig alle Werte (eindeutig ohne duplikate) in absteigender Reihenfolge. Absteigende Reihenfolge weil ein 34567 Straight wertvoller ist als eine 23456 Strasse.
            Heißt ich kann das testen abbrechen wenn ich eine Reihe von 5 Werten gefunden habe und muß mir die weiteren möglichen 2 Karten nicht anschauen.
            Auch wenn die auch in einen noch längere Strasse passen würden sie wäre weniger Wert also die die ich schon gefunden habe.

            Key Value
            ♣ A
            ♠ KJ732
            ♦ K
            X AKJ732 (x hier für beliebige Farbe um hier auf entsprechende Straights testen zu können)

            Mit diesen beiden (oder drei) Listen kann man anfangen in der Reihenfolge der Pokerhände vom wertvollsten zur billigsten Hand die alle durchzugehen und zu prüfen.

            Am wertvollsten wäre der Royal Flush. Auf dem Weg dazu muss man aber eigentlich die gleichen Prüfungen machen wie für einen Straight Flush und für den einen auf Flush.
            Das sinnvollste wäre also zuerst auf Flush zu testen.

            Heißt in eine der Listen schauen ist bei den Farben mindestens eine 5.
            Und ja im Beispiel gibt es 5♠. Es ist also mindestens ein Flush.

            Jetzt wollen wir testen ob es den sogar ein Straight Flush ist.
            wie schauen uns
            ♠ KJ732
            an und gehen den Wert von links nach rechts durch. Auf den König folgt keine Dame also erstmal kein Straight. Ich müßte jetzt von der Dame aus theoretisch weiter prüfen wenn mehr als 5 ♠ in der Liste wären sind aber nicht also habe ich nicht mehr genug Karten für eine Strasse und kann abbrechen. Es gibt keinen Straight. Hätte ich jetzt einen Straight würde man noch schauen ob ein Ass am Anfang der Liste ist und würde Wissen es ist ein Royal Flush und nicht nur ein Straight Flush.

            Feststellung hier : Wir haben einen Flush aber keinen höherwertigen Straight oder Royal Flush. Ergebnis ist nicht Flush sondern nur vorläufig Flush. Denn wir müßen weiter testen weil ein Vierling oder Full House höherwertiger ist als ein Flush nur bei den höherwertigeren Flushs hätten wir abbrechen können.
            Also müßen wir jetzt testen ob wir einen Vierling haben. Dazu schauen wir in die erste Liste und würden zumindest in diesem Beispiel enttäuscht.
            Jetzt würden wir auf einen Full House testen dabei müsste man unter anderem auf Drillinge testen also würde man das hier vorziehen so wie wir das oben gemacht haben beim Royal Flush wo man den testen auf Flush vorzieht.

            Nach dem Test auf Drillinge(für das Full House) würde man hier abbrechen da wir nichts mehr finden können das wertvoller als ein Flush hätten wir keinen Flush gehabt hätten man entsprechenden weiter testen müßen ... und weiter ... und weiter



            Ich hoffe die Idee wird klar und du hast einen Ansatzpunkt um dein Problem in kleinere lösbare Einzelprobleme zu zerlegen und das anzugehen.
            Vielleicht wäre es für dich hilfreich erstmal auf einem Block aufzuschreiben welche Hände es eigentlich alle gibt und in welcher Reihenfolge man die am besten testet. Grob wäre es ja erstmal nach Wertigkeit aber wie ich oben im Freitext beschrieben habe ist es möglicherweise hilfreich bestimmte Test vorzuziehen weil sie Teil des Test der eigentlich höherwertigen Hand sind.

            Viel Spass

            Comment


            • #7
              Hallo zusammen.

              Danke für die Anregungen. Ich werde er über eine Hashmap machen. Ist dann ja doch einfacher als gedacht.

              Gruß
              Jan

              Comment

              Working...
              X