Ideia graças a @ MartinBüttner de uma discussão no chat
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. Para esse desafio, consideraremos uma versão simplificada do jogo - PPCG mahjong.
Em PPCG mahjong, existem três fatos - m
, p
e s
- e as telhas são numerados de 1
a 9
. Há exatamente quatro cópias de cada peça, e as peças são indicadas por seu número seguido por seu naipe (por exemplo 3m
, 9s
).
Uma mão de mahjong PPCG concluída consiste em quatro conjuntos de três e um par, para um total de 14 peças.
Um conjunto de três pode ser:
- Três do mesmo bloco (por exemplo
4s 4s 4s
, mas não4m 4p 4s
), ou - Uma sequência de três peças consecutivas no mesmo naipe (por exemplo,
1s 2s 3s
ou6p 7p 8p
mas não3s 4m 5m
ou3p 5p 7p
). As sequências não são agrupadas (por isso9m 1m 2m
é inválido).
Um par é simplesmente duas peças idênticas (por exemplo 5s 5s
).
O desafio
Seu programa receberá uma mão separada por espaço de 13 blocos, com cada bloco aparecendo no máximo quatro vezes. Você pode escrever um programa completo ou uma função que aceita uma string.
Sua tarefa é encontrar todas as 14as peças possíveis ("espera") que, quando adicionadas à mão, formariam uma mão de mahjong PPCG concluída. Os blocos gerados devem ser separados por espaço, mas podem estar em qualquer ordem. Espaços em branco à esquerda ou à direita são permitidos.
Seu programa deve ser executado em um período de tempo razoável, não mais que um minuto.
Exemplos
Input: 1m 1m 1m 4s 4s 4s 7p 7p 7p 3m 3m 3m 9s
Output: 9s
Input: 1m 1m 1m 3m 3m 3m 5m 5m 5m 2s 3s 7p 8p
Output:
Input: 1m 2m 2m 3m 3m 3m 3m 4m 1s 1s 9s 9s 9s
Output: 1s
Input: 1m 1m 1m 2m 3m 4m 5m 6m 7m 8m 9m 9m 9m
Output: 1m 2m 3m 4m 5m 6m 7m 8m 9m
Input: 1m 1m 1m 5p 2m 3m 5p 7s 8s 5p 9s 9s 9s
Output: 1m 4m 6s 9s
No primeiro exemplo, 1m 4s 7p 3m
todos formam trigêmeos existentes, deixando o solitário 9s
para formar um par.
No segundo exemplo, o 2s 3s
e 7p 8p
pode formar apenas sequências, e os blocos restantes podem formar apenas trigêmeos. Portanto, nenhum par pode ser formado e não há saída.
No terceiro exemplo, a mão se divide em 1m2m3m 2m3m4m 3m3m 1s1s 9s9s9s
. Normalmente, isso seria uma espera 3m 1s
, mas, como todos os quatro 3m
foram usados, a única espera disponível é 1s
.
No quarto exemplo, todas as m
peças completam a mão. Por exemplo, para 1m
, poderia-se ter 1m1m1m 1m2m3m 4m5m6m 7m8m9m 9m9m
uma mão completa.
Tente elaborar o restante do quarto exemplo e do quinto exemplo :)
Pontuação
Isso é código-golfe , então a solução com o menor número de bytes vence. Aplicam-se brechas padrão .
Respostas:
Pitão,
312281 bytesW
pega uma string como entrada e retorna uma string como saída.O pequeno número de peças (27) torna rápido o suficiente para testar se cada uma delas completa a mão. O problema passa a verificar se uma mão é válida. A função usa um algoritmo de retorno simples que considera todas as opções possíveis de conjuntos e verifica se algum deles é uma mão completa.
As mãos são representadas como histogramas de ladrilhos, ou seja, uma lista de contagens de ladrilhos (para todos os ladrilhos, não apenas os presentes na mão.) Isso facilita a verificação de se temos um determinado número de um determinado ladrilho e se ter uma sequência de peças adjacentes (o preenchimento entre peças de roupas diferentes evita seqüências de várias peças).
fonte
map
em alguns lugares, como:H(map((S+t).count,T))
JavaScript (E6) 306
Explicado
Teste no console do FireFox / FireBug
Resultado
fonte