Vérifier les valeurs de la main pour le mahjong à combinaison unique

12

Mahjong est un jeu de tuiles qui est immensément populaire en Asie. Il se joue généralement avec quatre joueurs, et le but du jeu est d'être la première personne à terminer une main valide en utilisant les tuiles. Dans le mahjong, il y a trois combinaisons de tuiles plus des tuiles d'honneur - pour ce défi, nous ne considérerons que les mains formées à l'aide de tuiles d'une seule combinaison.

Les tuiles sont numérotées de 1à 9, et il y a exactement quatre copies de chaque tuile. Une main valide se compose de quatre ensembles de trois et d'une paire, pour un total de quatorze tuiles.

Un ensemble de trois peut être soit:

  • Un triplet, trois de la même tuile (par exemple 444), ou
  • Une séquence de trois tuiles consécutives (par exemple 123ou 678pas 357). Les séquences ne sont pas bouclées (elles ne sont donc pas 912valides).

Une paire est simplement deux tuiles identiques (par exemple 55).

Le défi

Étant donné une main valide de quatorze tuiles, déterminez son score en fonction des critères suivants:

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

(Le score ici est basé sur les règles du mahjong japonais, mais fortement simplifié pour rendre la spécification moins salissante.)

Le score d'une main est la somme des points pour les conditions qu'elle remplit. Si une main peut être décomposée de plusieurs façons, prenez la décomposition ayant le score le plus élevé.

La main d'entrée est garantie pour être valide, c'est-à-dire quatorze tuiles de 1 à 9 et chaque tuile apparaissant au plus quatre fois, et peut être supposée être déjà triée. L'entrée est une liste de chiffres (sous forme de chaîne ou d'une seule liste plate d'entiers) via STDIN, argument de fonction ou ligne de commande. La sortie peut être vers STDOUT ou renvoyer une valeur.

Cas de 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

Pour le cinquième exemple, malgré deux paires de séquences identiques, une seule doit être présente pour atteindre le point. La décomposition 345 345 345 345 66aurait le même score, tandis que les 333 345 444 555 66scores seraient pires.

Notation

Il s'agit de , donc la solution dans le moins d'octets est gagnante. Des échappatoires standard s'appliquent.


Défi connexe: Qu'attendez-vous? (Un mahjong solveur)

Sp3000
la source

Réponses:

1

J (241 byes)

Vous devez installer la dernière version de J.

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'

Appelez la fonction savec une liste d'entiers. Par exemple, l'exemple de script suivant vérifie les cas de test ci-dessus:

#!/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
la source