Cheat é um jogo de cartas em que você está tentando se livrar da sua mão. Um turno é algo mais ou menos assim:
- Determine qual ranking de cartas você tem para jogar nesse turno. Na maioria das variantes, esse é um ranking mais alto que o turno anterior.
- Jogue 1-4 cartas, com a face para baixo. Eles não precisam corresponder à classificação válida. Se não, é considerado uma trapaça . Neste ponto, qualquer jogador pode desafiá- lo.
- Se ninguém te desafiar, o jogo continua para o próximo jogador.
- Se alguém o desafia e você não trapaceia, eles precisam pegar todas as cartas jogadas.
- Se alguém desafia você e você trapaceou, você deve pegar todas as cartas jogadas.
A estratégia é principalmente uma mistura de blefes e contagem de cartas. Eu sou ruim em matemática, então vou trapacear no Cheat e trazer um bot comigo.
Entrada
A entrada será, em qualquer ordem ou formato que você desejar:
- A mão do jogador. Se eu souber que eles devem ter cartões (por exemplo, eu os vi pegá-los), eles serão listados em ordem crescente. Quaisquer incógnitas serão listadas posteriormente como
?
. Por exemplo, se eles têm seis cartas e eu sei que duas são 1 e 1 é 4, uma representação válida da mão é114???
. ? sempre serão listados após os cartões conhecidos.141???
e11???4
são entradas inválidas e seu código não precisa lidar com elas. - As cartas que eu conheço definitivamente não fazem parte da mão delas (eu as tenho, vi alguém pegá-las, etc.). A lista estará em ordem crescente de classificação. A lista pode estar vazia.
- As cartas que o jogador alegou jogar. Se eles alegassem jogar 3 7, uma possível entrada aqui seria
777
. As cartas sempre terão o mesmo valor.
O número de cartas jogadas sempre será de 1 a 4 e as fileiras sempre serão de 0 a 9. Uma classificação nunca aparecerá mais de quatro vezes na mão + não na mão.
Este é um exemplo de entrada válida:
33577??
01555688
55
Este é um exemplo de entrada inválida:
35377?? # Out of order
7779 # Five 7's in total
23 # Two separate ranks played
Resultado
Um valor verdadeiro, se deveríamos definitivamente desafiar. Um valor falsey, se não quisermos desafiar.
Sempre desafiamos se sabemos que eles trapacearam. Sabemos que eles trapacearam se jogassem cartas que não poderiam ter:
12
3 # They don't have any 3's or ?'s
-------------
12?
33 # Fewer ?'s than played cards
-------------
123?
333
33 # Since we have three 3's they can't have two
A outra vez que desafiamos é se eles jogam suas últimas cartas. Mesmo que o jogo seja legítimo, ele terminaria o jogo, para que possamos desafiá-lo.
1
1 # They'd win, so challenge anyway
Mais casos de teste
Verdade (deve desafiar)
11445678?
22
-------------
????????
4
4444
-------------
12345678
9
Falsey (não deve desafiar)
1?
222
2
-------------
12?
22
22
-------------
?????
1111
Pontuação
O menor código vence.
fonte
Respostas:
Pitão, 22 bytes
Experimente online.
fonte
JavaScript (ES6), 93 bytes
Aceita três séries de cartas (caracteres
0
-9
ou?
); retorna1
para o desafio,0
caso contrário. Explicação:fonte
C # 6, 134 bytes
(Nota: De acordo com o exemplo do OP, essa resposta retorna falsa, mesmo que o oponente tenha mais de uma carta e esteja jogando toda a sua mão. Em termos de estratégia, isso deve retornar verdadeiro.)
Explicação:
a
: Mão do jogadorb
: Cartões que eu definitivamente conheço ...c
: Cartões que alegam jogarUngolfed:
fonte
a.Length==1
sera.Length==c.Length
. Você parece sugerir algo parecido em sua nota, mas não sei a qual exemplo do OP você está se referindo que torna possível que mais cartas estejam sendo jogadas do que a quantidade de cartas que o oponente tem na mão.Java 8,
169135 bytesExplicação:
Experimente aqui.
NOTA:
(s+0).split("c",-1).length-1
fornece a quantidade de vezes que o caracterec
ocorre em Strings
. Portanto, os comentários na explicação acima estão corretos, mas o código pode parecer diferente por causa disso. O(a+0).split(x+"|\\?",-1).length-1<C
é jogado(a+0).split(x+"|\\?",-1).length<=C
e o4-(b+0).split(""+x,-1).length-1<C
é jogado para5-(b+0).split(""+x,-1).length<C
.fonte