421 é um jogo de dados bastante popular na França e em alguns outros países europeus. É tocado principalmente em bares e pubs para determinar quem vai comprar a próxima rodada de bebidas. O jogo completo geralmente é jogado em duas rodadas, com fichas das quais cada jogador tenta se livrar, mas isso é irrelevante aqui. ( Página da Wikipedia em francês.)
O jogo é jogado com 3 dados de cubo padrão.
Tarefa
Sua tarefa é classificar uma lista não vazia de jogadas distintas de 3 dados [X, Y, Z] do maior para o menor, aplicando as regras de pontuação deste jogo.
Pontuação básica
- 4,2,1 é a combinação mais alta possível. Dependendo das regras, pode marcar 8, 10 ou 11 pontos. Como estamos classificando as jogadas em vez de contar os pontos, o valor exato não importa.
- Three Ases: 1,1,1 é a segunda combinação mais alta e marca 7 pontos.
- Dois Ases: X, 1,1 (onde X é 2 a 6) marca X pontos.
- Três do tipo: X, X, X (onde X é 2 a 6) obtém X pontos.
- Retas: X, X + 1, X + 2 marcam 2 pontos.
- Todos os outros testes marcam 1 ponto.
Estabelecendo laços
Sempre que duas jogadas dão o mesmo número de pontos, as seguintes regras se aplicam:
- Um dois ases é melhor que um três. Exemplo: 5,1,1 bate 5,5,5 .
- O Three-of-a-Kind 2,2,2 é melhor que um straight. Exemplo: 2,2,2 bate 4,5,6 .
- As retas são ordenadas do menor para o maior. Exemplo: 4,5,6 bate 2,3,4 .
- Todos os outros lançamentos são resolvidos ordenando os dados do maior para o menor. Exemplo: 6,5,2 bate 6,4,3 . (Portanto, a menor combinação possível no jogo é 2,2,1 .)
Abaixo estão os 56 possíveis rolos distintos, ordenados do maior para o menor:
421 111 611 666 511 555 411 444 311 333 211 222 654 543 432 321
665 664 663 662 661 655 653 652 651 644 643 642 641 633 632 631
622 621 554 553 552 551 544 542 541 533 532 531 522 521 443 442
441 433 431 422 332 331 322 221
Regras do desafio
- Você pode fazer os testes em qualquer formato razoável, como uma lista de listas
[[3,2,1],[4,2,1]]
, uma lista de strings["321","421"]
, uma lista de números inteiros[321,421]
, etc. No entanto, cada dado deve ser claramente identificável com um valor de 1 a 6 . - Para cada rolagem, você pode assumir que os dados são classificados do menor para o maior ou do maior para o menor, desde que sejam consistentes. Informe na sua resposta qual ordem você espera, se houver.
- A resposta mais curta em bytes vence!
Casos de teste
Usando listas de strings com os dados classificados do mais alto para o mais baixo:
Entradas
[ "321", "654" ]
[ "222", "321", "211" ]
[ "333", "311", "331", "111" ]
[ "111", "222", "333", "444" ]
[ "321", "421", "521", "621" ]
[ "422", "221", "442", "421", "222" ]
[ "222", "111", "421", "211", "651", "652", "543" ]
Resultados esperados
[ "654", "321" ]
[ "211", "222", "321" ]
[ "111", "311", "333", "331" ]
[ "111", "444", "333", "222" ]
[ "421", "321", "621", "521" ]
[ "421", "222", "442", "422", "221" ]
[ "421", "111", "211", "222", "543", "652", "651" ]
012
vez de123
)?Respostas:
Python , 93 bytes
Experimente online!
fonte
sort
métodoRetina 0.8.2 , 67 bytes
Experimente online! O link inclui casos de teste. Explicação: A chave de classificação numérica é gerada da seguinte maneira:
fonte
Geléia ,
3734 bytesUm link monádico que aceita uma lista de listas de jogadas de dados (cada uma descendente classificada) que produz as jogadas ordenadas descendentes.
Experimente online! Ou consulte uma suíte de testes ... ou tente todos os rolos classificados lexicograficamente
Quão?
Esse método cria uma lista de todos os rolos do maior para o menor *, substituindo
[4,2,1]
por0
(um rolo de entrada inválido), para classificar cada rolo usando o primeiro átomo de Jelly do índice de Jellyi
,.* A lista também inclui entradas repetidas e redundantes que não afetam o comportamento:
fonte
R , 73 bytes
Experimente online!
421 ... 221
)x % 37
vez de111
Explicação:
Para cada um dos números, 5 chaves são calculadas e usadas hierarquicamente para classificar a matriz:
fonte
05AB1E ,
764845 bytesAcabou sendo muito mais longo do que o esperado, mas pelo menos é fácil de implementar. Vou ver se consigo encontrar uma solução melhor.Fiz a lista à mão agora, mas ainda um pouco longa.Experimente online ou verifique todos os casos de teste .
Explicação:
Aqui está a lista real que a primeira parte do código gera:
Experimente online.
Como você pode ver, ele contém itens vazios; números como
765
ou210
; e números no intervalo[216, 112]
. Mas todos podemos ignorá-los, porque os itens que realmente queremos classificar estão na ordem correta.Solução original de 76 bytes:
Experimente on-line
ou verifique todos os casos de teste(não há suíte de testes porque ainda há um erro de classificação por números compactados que não vê o colchete de fechamento para interromper a classificação ).Explicação:
Explicação
•X˜„Éε´õñ€9Ú ù?ä0₅9úd5àPÎøŒccuĆYÑ,o¾eíË¿¼À8@gID=vÆOΣxjF¨O‡J₃^εR™\èv•667в
:Tudo entre os dois
•
é um número compactado que é gerado com o seguinte programa:Experimente online.
Z>
: Tire o máximo da lista + 1 (667
neste caso)β
: Converta a lista da Base667
em um único número255B
: E converta esse número único em base255
(usando a página de códigos do 05AB1E), para que tenhamos nosso número compactado .Ao usá-
667в
lo, esse número compactado é convertido novamente na lista original.fonte
JavaScript (ES7), 96 bytes
Classifica os rolos aderindo de perto às regras de pontuação. Espera uma matriz de strings com rolos individuais em ordem decrescente de valor, por exemplo
["654"]
Experimente online!
Explicação
As categorias de rolos são aumentadas para os seguintes expoentes:
Ungolfed
Desembrulhar mentalmente as verificações condicionais me dá dor de cabeça, e tenho certeza de que de alguma forma pode ser ainda mais jogado ....
fonte
Javascript, 101 caracteres, 116 bytes (UTF-8)
Toma uma matriz de números representando os rolos como
[ 321, 654 ]
.Experimente online!
Explicação:
Tomei o primeiro 16 dos 56 possíveis rolos distintos (os que realmente não seguem qualquer ordem) e eu codificado-los como uma string:
"ƥoɣʚǿȫƛƼķōÓÞʎȟưŁ"
. Cada caractere dessa sequência corresponde aos 16 primeiros lançamentos possíveis (ƥ
é421
,o
é111
, ...). Agora, para cada dois elementosa
eb
da matriz, apenas verificamos seu índice a partir da string; se eles estão incluídos, o índice é usado; caso contrário (o índice é-1
), usamos o número do rolo (subtraímos o valor700
para inverter a ordem do não incluídas, ou seja , para classificá-las em ordem decrescente).fonte
Limpo ,
169102 bytesTodas as fugas octais são contadas como um byte, pois o compilador Clean as aceita dessa maneira, mas o TIO e o SE não o fazem porque não são UTF-8 bem formados.
Experimente online!
Usa o fato de que todos os lançamentos de dados, como números inteiros no módulo 256, são únicos.
Convenientemente,
Char
é tratado (principalmente) como um número inteiro de módulo 256.fonte
Pitão , 48 bytes
Espera a entrada como uma matriz aninhada, cada elemento ordenado decrescente. Experimente online aqui ou verifique todos os casos de teste de uma vez aqui .
fonte
05AB1E , 24 bytes
Experimente online!
Algoritmo geral:
Detalhes:
fonte