Verifique los valores de mano para Mahjong de un solo palo

12

Mahjong es un juego de fichas que es inmensamente popular en Asia. Por lo general, se juega con cuatro jugadores, y el objetivo del juego es ser la primera persona en completar una mano válida usando las fichas. En Mahjong hay tres trajes de fichas más fichas de honor: para este desafío solo consideraremos las manos formadas con fichas de un solo palo.

Las fichas están numeradas de 1a 9, y hay exactamente cuatro copias de cada ficha. Una mano válida consta de cuatro juegos de tres y un par, para un total de catorce fichas.

Un conjunto de tres puede ser:

  • Un triplete, tres del mismo mosaico (por ejemplo 444), o
  • Una secuencia de tres mosaicos consecutivos (por ejemplo, 123o 678no 357). Las secuencias no se ajustan (por 912lo que no es válido).

Un par es simplemente dos fichas idénticas (por ejemplo 55).

El reto

Dada una mano válida de catorce fichas, determine su puntuación en función de los siguientes criterios:

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

(La puntuación aquí se basa en las reglas japonesas de mahjong, pero está muy simplificada para que la especificación sea menos complicada).

El puntaje de una mano es la suma de puntos por las condiciones que satisface. Si una mano puede descomponerse de más de una manera, tome la descomposición de mayor puntuación.

Se garantiza que la manecilla de entrada es válida, es decir, catorce fichas del 1 al 9 y cada ficha aparece como máximo cuatro veces, y se puede suponer que ya está ordenada. La entrada es una lista de dígitos (como una cadena o una única lista plana de enteros) a través de STDIN, argumento de función o línea de comando. La salida puede ser STDOUT o valor de retorno.

Casos de prueba

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

Para el quinto ejemplo, a pesar de tener dos pares de secuencias idénticas, solo uno debe estar presente para alcanzar el punto. La descomposición 345 345 345 345 66obtendría el mismo puntaje, mientras que los 333 345 444 555 66puntajes son peores.

Puntuación

Este es el , por lo que la solución en la menor cantidad de bytes gana. Se aplican lagunas estándar .


Desafío relacionado: ¿Qué estás esperando? (Un solucionador de mahjong)

Sp3000
fuente

Respuestas:

1

J (241 byes)

Necesita la última versión de J instalada.

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'

Llama a la función scon una lista de enteros. Por ejemplo, el siguiente script de ejemplo verifica los casos de prueba anteriores:

#!/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
fuente