Verifique os valores das mãos para Mahjong de um único naipe

12

Mahjong é um jogo de peças imensamente popular na Ásia. Normalmente é jogado com quatro jogadores, e o objetivo do jogo é ser a primeira pessoa a completar uma mão válida usando as peças. No mahjong, existem três naipes e azulejos de honra - para este desafio, consideraremos apenas as mãos formadas usando peças de um único naipe.

Os blocos são numerados de 1a 9e existem exatamente quatro cópias de cada bloco. Uma mão válida consiste em quatro conjuntos de três e um par, para um total de catorze peças.

Um conjunto de três pode ser:

  • Um trigêmeo, três do mesmo bloco (por exemplo 444), ou
  • Uma sequência de três blocos consecutivos (por exemplo, 123ou 678não 357). As sequências não são agrupadas (por isso 912é inválido).

Um par é simplesmente duas peças idênticas (por exemplo 55).

O desafio

Dada uma mão válida de catorze peças, determine sua pontuação com base nos seguintes critérios:

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

(A pontuação aqui é baseada nas regras japonesas de mahjong, mas muito simplificada para tornar as especificações menos confusas.)

A pontuação de uma mão é a soma dos pontos pelas condições que ela satisfaz. Se uma mão puder ser decomposta em mais de uma maneira, faça a decomposição com a pontuação mais alta.

O ponteiro de entrada é garantido como válido, ou seja, catorze peças de 1 a 9 e cada peça aparece no máximo quatro vezes, e pode-se presumir que já está classificada. Entrada é uma lista de dígitos (como uma sequência ou uma única lista plana de números inteiros) via STDIN, argumento de função ou linha de comando. A saída pode ser STDOUT ou retornar valor.

Casos de teste

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 o quinto exemplo, apesar de ter dois pares de seqüências idênticas, apenas um precisa estar presente para atingir o objetivo. A decomposição 345 345 345 345 66teria a mesma pontuação, enquanto a pontuação seria 333 345 444 555 66pior.

Pontuação

Isso é , então a solução com o menor número de bytes vence. Aplicam-se brechas padrão .


Desafio relacionado: O que você está esperando? (Um solucionador de mahjong)

Sp3000
fonte

Respostas:

1

J (241 bytes)

Você precisa da versão mais recente do 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'

Chame a função scom uma lista de números inteiros. Por exemplo, o script de exemplo a seguir verifica os casos de teste acima:

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