Überprüfen Sie die Werte für die Handübergabe für einzeln geeignetes Mahjong


12

Mahjong ist ein Kachelspiel, das in Asien sehr beliebt ist. Es wird normalerweise mit vier Spielern gespielt, und das Ziel des Spiels ist es, die erste Person zu sein, die eine gültige Hand mit den Plättchen abschließt. In Mahjong gibt es drei Farben plus Ehrenfarben - für diese Herausforderung werden wir nur Hände berücksichtigen, die mit Farben aus einer Farbe geformt wurden.

Die Kacheln sind von 1bis nummeriert 9, und von jeder Kachel gibt es genau vier Exemplare. Eine gültige Hand besteht aus vier Sätzen zu je drei und einem Paar, also insgesamt vierzehn Plättchen.

Ein Satz von drei kann entweder sein:

  • Ein Triplett, drei gleiche Plättchen (zB 444) oder
  • Eine Folge von drei aufeinanderfolgenden Kacheln (z. B. 123oder 678nicht 357). Sequenzen werden nicht umbrochen ( 912ist also ungültig).

Ein Paar sind einfach zwei identische Kacheln (zB 55).

Die Herausforderung

Bei einem gültigen Blatt mit vierzehn Steinen wird die Punktzahl anhand der folgenden Kriterien ermittelt:

Condition                Description                                 Point/s
-------------------------------------------------------------------------------
Straight                 Contains the sequences 123 456 789          1
Identical sequences      Contains two identical sequences            1
All simples              Only 2-8, no 1s or 9s                       1
All sequences            All sets of three are sequences             1
All triplets             All sets of three are triplets              2
Flush                    Single-suit hand (always applies)           5

(Die Bewertung basiert hier auf japanischen Mahjong-Regeln, wurde jedoch stark vereinfacht, um die Spezifikation weniger chaotisch zu machen.)

Die Punktzahl einer Hand ist die Summe der Punkte für die Bedingungen, die sie erfüllt. Wenn eine Hand auf mehrere Arten zerlegt werden kann, nehmen Sie die Zerlegung mit der höchsten Punktzahl.

Die eingegebene Hand ist garantiert gültig, dh vierzehn Kacheln von 1 bis 9 und jede Kachel kommt höchstens viermal vor und es kann angenommen werden, dass sie bereits sortiert ist. Die Eingabe ist eine Liste von Ziffern (als Zeichenfolge oder einzelne flache Liste von Ganzzahlen) über STDIN, Funktionsargument oder Befehlszeile. Die Ausgabe kann auf STDOUT oder einen Rückgabewert erfolgen.

Testfälle

22233355777888  ->  8  # 222 333 55 777 888, flush + all simp. + all trip.
11112345678999  ->  6  # 111 123 456 789 99, flush + straight
11123456788999  ->  5  # 111 234 567 88 999, flush only (no straight)
23344455566788  ->  7  # 234 345 456 567 88, flush + all simp. + all seq.
33334444555566  ->  8  # 33 345 345 456 456, flush + all simp. + all seq. + identical seq.
11122233377799  ->  7  # 111 222 333 777 99, flush + all trip. (no identical seq.)
12344556678889  ->  8  # 123 456 456 789 88, flush + all seq. + straight + identical seq.
11344556678999  ->  5  # 11 345 456 678 999, flush only (no identical seq.)
22233344455566  ->  8  # 222 333 444 555 66, flush + all simp. + all trip.
11112233344555  ->  5  # 111 123 234 345 55, flush only

Für das fünfte Beispiel muss trotz zweier Paare identischer Sequenzen nur eines vorhanden sein, um den Punkt zu erreichen. Die Zersetzung 345 345 345 345 66würde das gleiche Ergebnis erzielen, während das 333 345 444 555 66Ergebnis schlechter ist.

Wertung

Das ist , also gewinnt die Lösung mit den wenigsten Bytes. Es gelten Standardlücken .


Verwandte Herausforderung: Worauf warten Sie noch? (Ein Mahjong-Löser)

Antworten:


1

J (241 byes)

Sie müssen die neueste Version von J installiert haben.

i=:>:@i.9
q=:,/^:4>@:{(i.9);(i.;i.;i.;i.)16
s=:3 :'(>./((5+([:(*./)(3*i.3)&e.)+(-.@:(-:~.))+((*./)@:(6&>:))+2*((*./)@:(6&<)))"1(}."1(y(-:/:~"1)"1((([:{&(i,.i){.),[:,/[:{&(((>:@i.7)+"0 1(i.3)),|:3 9$i)}.)"1 q))#q)))+([:(*./)[:-.((1 9)&e.))y'

Rufen Sie die Funktion smit einer Liste von ganzen Zahlen auf. Das folgende Beispielskript überprüft beispielsweise die obigen Testfälle:

#!/usr/bin/jconsole
i=:>:@i.9
q=:,/^:4>@:{(i.9);(i.;i.;i.;i.)16
s=:3 :'(>./((5+([:(*./)(3*i.3)&e.)+(-.@:(-:~.))+((*./)@:(6&>:))+2*((*./)@:(6&<)))"1(}."1(y(-:/:~"1)"1((([:{&(i,.i){.),[:,/[:{&(((>:@i.7)+"0 1(i.3)),|:3 9$i)}.)"1 q))#q)))+([:(*./)[:-.((1 9)&e.))y'


echo (s 2 2 2 3 3 3 5 5 7 7 7 8 8 8)=8
echo (s 1 1 1 1 2 3 4 5 6 7 8 9 9 9)=6
echo (s 1 1 1 2 3 4 5 6 7 8 8 9 9 9)=5
echo (s 2 3 3 4 4 4 5 5 5 6 6 7 8 8)=7
echo (s 3 3 3 3 4 4 4 4 5 5 5 5 6 6)=8
echo (s 1 1 1 2 2 2 3 3 3 7 7 7 9 9)=7
echo (s 1 2 3 4 4 5 5 6 6 7 8 8 8 9)=8
echo (s 1 1 3 4 4 5 5 6 6 7 8 9 9 9)=5
echo (s 2 2 2 3 3 3 4 4 4 5 5 5 6 6)=8
echo (s 1 1 1 1 2 2 3 3 3 4 4 5 5 5)=5

exit''
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.