Controlla i valori delle mani per Mahjong monouso


12

Mahjong è un gioco a tessere che è immensamente popolare in Asia. In genere si gioca con quattro giocatori e l'obiettivo del gioco è quello di essere la prima persona a completare una mano valida usando le tessere. Nel mahjong ci sono tre semi delle tessere più le tessere onore - per questa sfida considereremo solo le mani formate usando le tessere di un singolo seme.

Le tessere sono numerate da 1a 9, e ci sono esattamente quattro copie di ogni tessera. Una mano valida è composta da quattro serie da tre e una coppia, per un totale di quattordici tessere.

Un set di tre può essere:

  • Una tripletta, tre della stessa tessera (es. 444), Oppure
  • Una sequenza di tre tessere consecutive (ad esempio 123o 678no 357). Le sequenze non vanno a capo (quindi 912non sono valide).

Una coppia è semplicemente due tessere identiche (ad es 55.).

La sfida

Data una mano valida di quattordici tessere, determinane il punteggio in base ai seguenti criteri:

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

(Il punteggio qui si basa sulle regole del mahjong giapponese, ma fortemente semplificato per rendere le specifiche meno disordinate.)

Il punteggio di una mano è la somma dei punti per le condizioni che soddisfa. Se una mano può essere scomposta in più di un modo, prendi la decomposizione con il punteggio più alto.

La lancetta di input è garantita, vale a dire quattordici tessere da 1 a 9 e ogni tessera appare al massimo quattro volte e si può presumere che sia già stata ordinata. L'input è un elenco di cifre (come una stringa o un singolo elenco di numeri interi) tramite STDIN, argomento della funzione o riga di comando. L'output può essere su STDOUT o sul valore di ritorno.

Casi test

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

Per il quinto esempio, pur avendo due coppie di sequenze identiche, solo uno deve essere presente per raggiungere il punto. La decomposizione 345 345 345 345 66segnerebbe lo stesso, mentre i 333 345 444 555 66punteggi peggiori.

punteggio

Questo è , quindi vince la soluzione nel minor numero di byte. Si applicano scappatoie standard .


Sfida correlata: cosa stai aspettando? (Un risolutore di mahjong)

Risposte:


1

J (241 byte)

È necessaria l'ultima versione di J installata.

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'

Chiamare la funzione scon un elenco di numeri interi. Ad esempio, il seguente script di esempio verifica i casi di test sopra riportati:

#!/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''
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.