Isenção de responsabilidade: ModTen é um jogo de cartas fictício criado para o único objetivo deste desafio.
As regras do ModTen
O ModTen é jogado com um baralho de 52 cartas padrão. Como as regras completas ainda não foram inventadas, vamos nos concentrar exclusivamente no ranking das mãos.
Uma mão vencedora no ModTen. Gráficos da Wikipedia .
Valores do cartão
Os cartões têm os seguintes valores:
- 2 a 9 : vale o seu valor nominal
- Dez : 0 ponto
- Jack : 3 pontos
- Rainha ou rei : 8 pontos
- Ás : 9 pontos
Valores manuais
Uma mão ModTen é feita de duas cartas . O valor base de uma mão é obtido multiplicando o valor de ambas as cartas e mantendo apenas o último dígito (ou seja, aplicando o módulo 10).
Por exemplo, o valor de 7 ♥ - Q ♣ é " " porque .
A única outra regra no ModTen é que as cartas do mesmo naipe valem mais do que as não usadas . Por convenção, vamos acrescentar um "s" ao valor se ambas as cartas forem do mesmo naipe.
Por exemplo, o valor de 9 5 - 5 ♠ será anotado como " ", porque e as cartas são do mesmo naipe.
Classificação da mão e vencedor
As regras acima resultam em 18 posições distintas, resumidas na tabela a seguir, da mais forte à mais baixa (ou mais rara à mais comum). As probabilidades são fornecidas apenas para informação.
Dadas duas mãos, a mão com a classificação mais baixa ganha. Se ambas as mãos tiverem o mesmo valor, é um empate (não há desempate).
hand rank | hand value(s) | deal probability
-----------+---------------+------------------
1 | 9s | 0.30%
2 | 3s | 0.60%
3 | 1s | 0.90%
4 | 7s | 1.21%
5 | 5s | 1.51%
6 | 3 | 1.81%
7 | 9 | 2.26%
8 | 8s | 2.71%
9 | 6s | 3.02%
10 | 1 or 7 | 3.62% each
11 | 2s or 4s | 3.92% each
12 | 5 | 4.98%
13 | 0s | 5.43%
14 | 8 | 8.14%
15 | 6 | 9.95%
16 | 2 | 11.76%
17 | 4 | 13.57%
18 | 0 | 16.74%
O desafio
Dadas duas mãos ModTen , produza um dos três valores consistentes de sua escolha para dizer se:
- o primeiro jogador ganha
- o segundo jogador ganha
- É um empate
As seguintes regras se aplicam:
- O cartão deve ser descrito por sua posição em maiúsculas (
2
,3
, ...,9
,T
,J
,Q
,K
ouA
) seguido por seu terno em minúsculas (c
,d
,h
ous
, para os clubes, diamantes, corações e pás). - Você pode usar em
"10"
vez de,"T"
mas qualquer outra substituição é proibida. Desde que as regras acima sejam seguidas, você poderá tomar as mãos em qualquer formato razoável e inequívoco. Você tem a classificação e o naipe como dois caracteres distintos, em vez de uma única sequência.
Alguns formatos de entrada válidos são:
"7c Qh 8s Ks"
[["7c","Qh"], ["8s","Ks"]]
[[['7','c'], ['Q','h']], [['8','s'], ['K','s']]]
- etc.
Em vez de usar três valores distintos consistentes, sua saída também pode ser negativa , positiva ou zero . Especifique o formato de saída usado na sua resposta.
- Isso é código-golfe .
Casos de teste
Jogador 1 vence
["Js","3s"], ["Ks","Kh"]
["7h","9h"], ["9s","7c"]
["Ah","5s"], ["Ts","8s"]
["Ts","8s"], ["Jh","2s"]
["4h","8s"], ["Qh","Ks"]
Jogador 2 vence
["Th","8d"], ["6s","Kd"]
["Jc","5c"], ["3s","9s"]
["Jc","Jd"], ["9h","Ah"]
["2d","4d"], ["3h","3s"]
["5c","4c"], ["3c","2c"]
Desenhar
["Js","3s"], ["3d","Jd"]
["Ah","Ac"], ["3d","9s"]
["Qc","Kc"], ["6d","4d"]
["2d","3d"], ["3s","2s"]
["Ts","9c"], ["4h","5d"]
fonte
{{J, s}, {3, s}}
tudo bem?Respostas:
Python 3 ,
114110 bytesExperimente online!
A @Arnauld propôs a idéia de mesclar o valor do cartão e a sequência de tabelas da tabela. Depois de algumas tentativas, consegui criar uma string mesclada
R="T 2J45UNK9RL<3SLM;QAK:O>=/678"
, que tem o mesmo comprimento da string de valor do cartão original. A substringR[6:25]="UNK9RL<3SLM;QAK:O>=/"
serve como tabela de classificação, bem como uma tabela de pesquisa valor do cartão para3
,9
,A
,K
, eQ
. A decodificação de valor ASCII da nova tabela de classificação tem o mesmo efeito de classificação que a tabela de classificação anterior.Usar cadeias de bytes como entrada economiza 4 bytes.
O uso
cmp
no Python 2 pode reduzir a solução para 102 bytes, como mostra a solução do @ xnor .Python 3 ,
165142130129 bytesExperimente online!
-23 bytes graças a @ Jonathan Allan
-2 bytes graças a @ovs
-1 byte graças a @mypetlion
Ungolfed:
A função
f
aceita dois argumentos que representam a mão do jogador 1 e do jogador 2. Retorna um valor positivo, negativo ou zero no caso de uma vitória do jogador 1, uma vitória do jogador 2 ou um empate, correspondentemente. Cada ponteiro é codificado como uma única sequência, por exemplo, "7cQh".fonte
"HC92FA51GAB4E893D760"[s==t::2]
cmp
não está disponível no Python 3)str.find
vez destr.index
salvar um byte. A única diferença de comportamento entre os dois métodos é queindex
gera um erro quando o elemento não é encontrado, enquantofind
retorna-1
. Portanto, não será um problema para o seu código.x86-16 Assembly,
8783 bytesBinário:
Desmontado:
A entrada é como uma sequência, como
Js3sKsKh
, no ponteiroSI
. A saída éZF = 0 and SF = OF
(teste comJG
) se o jogador 1 vencer,SF ≠ OF
(teste comJL
) se o jogador 2 vencer ouZF
(teste comJE
) se um empate.Saída usando o programa de teste do DOS:
Faça o download e teste o MODTEN.COM para DOS.
fonte
05AB1E ,
4137 bytes-4 bytes graças a @Grimy .
Insira como uma lista da lista de caracteres, como o terceiro exemplo de formato de entrada na descrição do desafio. Ou seja, P1
7c Qh
e P28s Ks
seriam inseridos como[[["7","c"],["Q","h"]],[["8","s"],["K","s"]]]
. (E usa"10"
para10
.)Emite um número inteiro negativo se o jogador 1 vencer; um número inteiro positivo se o jogador 2 vencer; ou 0 se for um empate.
Experimente online ou verifique todos os casos de teste .
Explicação:
Consulte esta minha dica do 05AB1E (seções Como usar o dicionário? Como compactar números inteiros grandes? E Como compactar listas de números inteiros? ) Para entender por que
•V›{₆Ÿ&∊WÍj¸•
é36742512464916394906012008
,•V›{₆Ÿ&∊WÍj¸•19в
é[18,10,16,6,17,12,15,10,14,7,13,3,11,2,11,5,9,4,8,1]
,‘ߌQ‘
é"JAKEQ"
eŽćS
é39808
.fonte
T
como10
, para que você possa simplesmente excluir oT
fromJTQKA
(e usar o número inteiro comprimido 3889 em vez de 30889). Além disso,T* ... +
poderia ser... «
.10
vez deT
é permitido, mas não pensei em ! E o ser é óbvio agora que eu vejo ..>.> Obrigado!T*...+
...«
PHP ,
212185178149 bytesExperimente online!
A entrada é via linha de comando. A saída para
STDOUT
é negativa se o jogador 1 vencer, positiva se o jogador 2 vencer,0
se empatar. Exemplo:fonte
-1
,1
ou0
.Gelatina , 46 bytes
Experimente online!
Um programa completo, tomando como argumento, por exemplo,
["7h","Ks"],["4s","Ts"]
e imprimindo zero se os dois jogadores empatarem, positivo se o jogador 1 vencer e negativo se o jogador 2 vencer.fonte
C (gcc) ,
172167165164 bytesExperimente online!
2 bytes eliminados graças a @ceilingcat!
Basicamente, uma porta da solução Python3 do @ Joel, mas sem a codificação base18. Espera a entrada como uma sequência com um espaço que separa as mãos dos dois jogadores e gera um número inteiro positivo, negativo ou zero para indicar que o jogador 1 vence, o jogador 2 vence ou se é um empate.
fonte
Perl 6 ,
1011009488 bytes-1 byte graças a Jo King
Experimente online!
Toma entrada como
f(((<J ♠>, <3 ♠>), (<10 ♠>, <K ♥>)))
usar10
para dez. Retorna um valor <0 se o jogador 1 vencer,> 0 se o jogador 2 vencer, 0 se for um empate.Explicação
fonte
Carvão vegetal , 97 bytes
Experimente online! Link é a versão detalhada do código. Toma entrada como duas seqüências de caracteres de 4 caracteres, por exemplo,
QcKc
6d4d
e gera um número inteiro assinado. Explicação:A sequência compactada
2345678903889
representa os valores do cartão.Faça um loop sobre cada par de valores possível.
Faça um loop sobre cada segundo naipe possível. Sem perda de generalidade, podemos supor que a primeira carta tenha naipe 3, portanto a segunda carta pode variar de 0 a 3, a menos que os valores sejam os mesmos; nesse caso, ela pode variar apenas de 0 a 2.
Calcule a pontuação modificada da mão, que é o valor da mão dobrada, mais 1 se os naipes forem iguais (ou seja, a segunda carta tem o naipe 3).
A sequência compactada
23456789TJQKA
representa os caracteres do cartão. Os cartões de entrada são procurados nessa sequência e, em seguida, a posição é usada para indexar a primeira sequência para obter o valor do cartão.Inicialize o resultado para 0.
Laço nas duas mãos.
Calcule a pontuação modificada da mão e, portanto, sua frequência e subtraia o resultado disso.
Saída a diferença de frequência.
fonte
C # (compilador interativo do Visual C #) , 139 bytes
Experimente online!
fonte
Perl 5
-p
, 107 bytesExperimente online!
Entrada:
(Na verdade, a vírgula pode ser qualquer caractere.)
Saída:
fonte