Sprawdź wartości rozdań dla pojedynczego koloru Mahjong

12

Mahjong to gra w płytki, która jest niezwykle popularna w Azji. Zwykle gra się w czterech graczy, a celem gry jest bycie pierwszą osobą, która ukończy ważne rozdanie za pomocą płytek. W mahjongu są trzy kolory i płytki honoru - w tym wyzwaniu rozważymy tylko ręce uformowane z płytek z jednego koloru.

Płytki są ponumerowane od 1do 9i są dokładnie cztery kopie każdego kafelka. Ważna ręka składa się z czterech zestawów trzech i pary, w sumie czternaście płytek.

Zestaw trzech może być:

  • Triplet, trzy z tej samej płytki (np. 444) Lub
  • Sekwencja trzech kolejnych płytek (np. 123Lub 678nie 357). Sekwencje nie są zawijane (więc 912są nieprawidłowe).

Para to po prostu dwie identyczne płytki (np 55.).

Wyzwanie

Biorąc pod uwagę prawidłową rękę czternastu kafelków, określ jej wynik na podstawie następujących kryteriów:

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

(Punktacja jest oparta na japońskich regułach mahjonga, ale znacznie uproszczona, aby specyfikacja była mniej chaotyczna).

Wynik rozdania jest sumą punktów za warunki, które spełnia. Jeśli dłoń może zostać rozłożona na więcej niż jeden sposób, weź rozkład o najwyższym wyniku.

Ręka wejściowa jest na pewno ważna, tj. Czternaście płytek od 1 do 9, a każda płytka pojawia się maksymalnie cztery razy, i można założyć, że jest już posortowana. Dane wejściowe to lista cyfr (jako ciąg znaków lub pojedyncza płaska lista liczb całkowitych) za pośrednictwem STDIN, argumentu funkcji lub wiersza poleceń. Wyjściem może być STDOUT lub wartość zwracana.

Przypadki testowe

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

W piątym przykładzie, pomimo posiadania dwóch par identycznych sekwencji, tylko jedna musi być obecna, aby osiągnąć cel. Rozkład 345 345 345 345 66uzyskałby taki sam wynik, a 333 345 444 555 66wyniki gorsze.

Punktacja

To jest , więc wygrywa rozwiązanie w najmniejszej liczbie bajtów. Obowiązują standardowe luki .


Powiązane wyzwanie: na co czekasz? (Mahjong solver)

Sp3000
źródło

Odpowiedzi:

1

J (241 bajtów)

W przeglądarce musi być najnowsza wersja J zainstalowany.

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'

Wywołaj funkcję sz listą liczb całkowitych. Na przykład poniższy przykładowy skrypt weryfikuje powyższe przypadki testowe:

#!/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''
Legendre
źródło