O jogo de cartas Guerra é interessante, pois o resultado final é inteiramente determinado pelo arranjo inicial do baralho, desde que certas regras sejam seguidas na ordem em que as cartas são retiradas do campo de jogo e movidas para os decks. Neste desafio, haverá apenas 2 jogadores, simplificando bastante as coisas.
O jogo
- Cada jogador recebe um baralho de 26 cartas.
- Cada jogador coloca a carta do topo no baralho com a face para cima. O jogador com a carta de melhor classificação (
Ace > King > Queen > Jack > 10 > 9 > 8 > 7 > 6 > 5 > 4 > 3 > 2
) vence a rodada e coloca a carta em cima da carta do oponente, vira-a e os adiciona ao fundo do baralho (para que a carta vencedora esteja no fundo do baralho) , e a carta perdida do outro jogador está logo acima dela). Isso é feito até que um dos jogadores fique sem cartas.- Se as cartas tiverem o mesmo valor, cada jogador coloca as 2 primeiras cartas do seu baralho com a face para cima em cima da carta anterior (de modo que a carta que estava no topo do baralho seja a segunda carta da pilha, e o o cartão que estava em segundo lugar está no topo). Em seguida, as classificações (da carta superior de cada pilha) são comparadas novamente, e o vencedor coloca sua pilha inteira no topo da pilha inteira do perdedor, vira a pilha de cabeça para baixo e a coloca no fundo do seu baralho. Se houver outro empate, mais cartas são jogadas da mesma maneira, até que um vencedor seja escolhido ou um jogador fique sem cartas.
Se a qualquer momento um dos jogadores precisar tirar uma carta do baralho, mas o baralho estiver vazio, eles imediatamente perderão o jogo.
O desafio
Dadas duas listas de cartas nos decks dos jogadores, em qualquer formato conveniente, produz um valor verdadeiro se o Jogador 1 vencer e um valor falso se o Jogador 2 vencer.
Por conveniência, uma carta de 10 será representada por a T
, e as cartas de face serão abreviadas ( Ace -> A, King -> K, Queen -> Q, Jack -> J
), para que todas as cartas tenham um caractere. Como alternativa, as classificações podem ser representadas com números inteiros decimais 2-14 ( Jack -> 11, Queen -> 12, King -> 13, Ace -> 14
) ou dígitos hexadecimais 2-E ( 10 -> A, Jack -> B, Queen -> C, King -> D, Ace -> E
). Como os fatos não importam, as informações dos fatos não serão fornecidas.
- Você pode presumir que todos os jogos terminarão em algum momento (embora isso leve muito tempo), e um jogador sempre ficará sem cartas antes do outro.
- Cada jogador coloca as cartas simultaneamente e uma por vez, para que nunca haja ambiguidade sobre qual jogador ficou sem cartas primeiro.
Casos de teste
Os casos de teste são usados 23456789ABCDE
para representar as classificações (em ordem crescente).
D58B35926B92C7C4C7E8D3DAA2, 8E47C38A2DEA43467EB9566B95 -> False
669D9D846D4B3BA52452C2EDEB, E747CA988CC76723935A3B8EA5 -> False
5744B95ECDC6D325B28A782A72, 68394D9DA96EBBA8533EE7C6C4 -> True
87DB6C7EBC6C8D722389923DC6, E28435DBEBEA543AA47956594A -> False
589EAB9DCD43E9EC264A5726A8, 48DC2577BD68AB9335263B7EC4 -> True
E3698D7C46A739AE5BE2C49286, BB54B7D78954ED526A83C3CDA2 -> True
32298B5E785DC394467D5C9CB2, 5ED6AAD93E873EA628B6A4BC47 -> True
B4AB985B34756C624C92DE5E97, 3EDD5BA2A68397C26CE837AD48 -> False
9A6D9A5457BB6ACBC5E8D7D4A9, 73E658CE2C3E289B837422D463 -> True
96E64D226BC8B7D6C5974BAE32, 58DC7A8C543E35978AEBA34D29 -> True
C2978A35E74D7652BA9762C458, 9A9BB332BE8C8DD44CE3DE66A5 -> False
BEDB44E947693CD284923CEA82, 8CC3B75756255A683A6AB9E7DD -> False
EEDDCCBBAA8877665544332299, EEDDCCBBAA9988776655443322 -> False
EEDDCCBBAA9988776655443322, DDCCBBAA9988776655443E3E22 -> True
Implementação de referência
Essa implementação de referência é escrita em Python 3 e recebe entrada no mesmo formato dos casos de teste (exceto separados por uma nova linha em vez de vírgula e espaço).
#!/usr/bin/env python3
from collections import deque
p1, p2 = [deque(s) for s in (input(),input())]
print(''.join(p1))
print(''.join(p2))
try:
while p1 and p2:
p1s = [p1.popleft()]
p2s = [p2.popleft()]
while p1s[-1] == p2s[-1]:
p1s.append(p1.popleft())
p2s.append(p2.popleft())
p1s.append(p1.popleft())
p2s.append(p2.popleft())
if p1s[-1] > p2s[-1]:
p1.extend(p2s+p1s)
else:
p2.extend(p1s+p2s)
except IndexError:
pass
finally:
print(len(p1) > 0)
1, 2, 3
o jogo não tem fim, pois você continua ganhando o do seu oponente1
. Isso é uma peculiaridade de ter um número ímpar de cartas?1
?Respostas:
JavaScript (ES6), 134 bytes
Retorne
undefined
se o Jogador 2 vencer,true
caso contrário. Aceita iteradores comparáveis, geralmente matrizes de números inteiros ou seqüências de caracteres hexadecimais. A resposta é composta por mais de 22% dos.
caracteres, o que acho que deve ser um recorde para mim.fonte
Python, 160 (155?) Bytes
Essa solução é teoricamente válida, mas exige que a profundidade máxima de recursão do python padrão seja aumentada para alguns dos casos de teste.
A segunda solução tem 5 bytes mais, mas funciona para todos os casos de teste.
Edit: Solução Ungolfed 1:
fonte
Python, 261 a 265 bytes
Conforme publicado, são 265 bytes e funciona no Python 2 e no Python 3. Você pode salvar 4 bytes no Python 2 substituindo os espaços por uma única guia no loop while.
Experimente online
fonte
Haskell, 372
Meu primeiro programa Haskell
(É a minha primeira programação funcional também ...)
Eu adoraria ter dicas de como melhorar.
Uso:
Haskell é rápido ... :)
fonte