Em uma festa, fui apresentado ao jogo LCR. Agora não é um ótimo jogo, pois não há habilidade, mas apenas chance aleatória. Mas isso me fez pensar: eu poderia codificar isso e fiz um rápido programa em R para modelar o jogo.
Regras do jogo modificadas da Wikipedia para combinar com a forma como jogamos:
Cada jogador recebe pelo menos 3 fichas. Os jogadores jogam três dados de seis lados, cada um deles marcado com "L", "C", "R" de um lado e um ponto nos três lados restantes. Para cada "L" ou "R" jogado, o jogador deve passar uma ficha para o jogador à sua esquerda ou direita, respectivamente. Um "C" indica um chip para o centro (pote). Um ponto não tem efeito.
Se um jogador tiver menos de três fichas restantes, ele ainda estará no jogo, mas seu número de fichas é o número de dados que eles jogam no turn, em vez de jogar as três. Quando um jogador tem zero fichas, eles passam os dados no seu turno, mas podem receber fichas de outros e fazer o próximo turno de acordo. O vencedor é o último jogador a colocar fichas no centro.
Concurso: escreva um programa no seu idioma de escolha que inclua o número de jogadores e o número de fichas iniciais e simule um jogo de LCR, mostrando o estado do jogo após o lançamento de cada jogador.
Por exemplo, um jogo pode ser exibido como:
[[[3,3,3,3],0],[[1,4,3,4],0],[[1,4,3,4],0],[[1,4,1,4],2],[[1,4,1,2],4],
[[0,4,1,3],4],[[0,3,2,3],4],[[0,3,0,3],6],[[0,3,1,1],7],[[0,3,1,1],7],
[[2,0,1,1],8],[[2,0,0,1],9],[[2,0,0,0],10],[[0,1,0,0],11],
[[1,0,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[0,0,0,0],12]]
ht: JonathanAllan
A saída não precisa ser exatamente assim, mas deve ser fácil discernir a rolagem de dados, quantas fichas cada jogador tem e quantas fichas o centro tem para cada turno.
É código de golfe, então o código mais curto vence.
[[[3,3,3,3],0],[[1,4,3,4],0],[[1,4,3,4],0],[[1,4,1,4],2],[[1,4,1,2],4],[[0,4,1,3],4],[[0,3,2,3],4],[[0,3,0,3],6],[[0,3,1,1],7],[[0,3,1,1],7],[[2,0,1,1],8],[[2,0,0,1],9],[[2,0,0,0],10],[[0,1,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[0,0,0,0],12]]
- é esse o caso?Respostas:
Emacs Lisp , 279 bytes
Use esta função como
(f 4 3)
.Versão melhor legível:
Exemplo de saída:
fonte
Java 8,
281277275274253 bytesVersão que gera o mesmo estado quando um jogador do turno tem 0 fichas restantes:
Inicia com o terceiro jogador na matriz.
Experimente online.
Versão que pula jogadores com 0 fichas restantes (274 bytes):
Inicia no primeiro jogador da matriz.
Experimente online.
-7 bytes graças a @ OlivierGrégoire .
Explicação (da segunda versão):
fonte
s=0;for(int C:c)s+=C;
(21 bytes) pode ser substituída pors=A.stream(c).sum();
(20 bytes)c[i%p]-=r<3?1:0
→c[i%p]-=1-r/3
. Isso economizaria 2 bytes.A
dejava.util.Arrays
. : D E colocando-o no loop para economizar o ponto e vírgula, é de -2 bytes. E1-r/3
é realmente correto ( veja aqui ). Obrigado.s=c[u=(i+r-1+p)%p]+=1-r&1-r/4
(salva 2 bytes, em comparação coms=c[u=(i+r%2*2-1+p)%p]+=r<2?1:0
)Python 2 ,
159148 bytesExperimente online!
Imprime todas as fichas dos jogadores após cada jogada
fonte
n*c - sum(players)
. Se eu precisar escrever explicitamente, eu irei #Geléia , 39 bytes
+2 para corrigir o comportamento de repetição (
¡
deve ser precedido por um nilad, para«3Ḣ$
->⁸FḢ«3
)Se pudermos definir as listas de saída a serem rotacionadas para que as fichas pertencentes ao jogador que agiu anteriormente à esquerda, podemos eliminar a posição mais à direita 6 bytes por 33 bytes (no entanto, na minha opinião, é um pouco estranho ler isso).
Um link diádico aceitando fichas por jogador à esquerda e número de jogadores à direita, que gera uma lista de fichas de jogadores no início do jogo e após cada turno (incluindo turnos em que 0 fichas força um passe) .
Experimente online!
Como?
Cada jogador, por sua vez, até três vezes, dependendo da contagem de fichas, joga uma moeda. Quando um jogador vira cara, ele não faz nada, mas se vira coroa, joga um dado de três lados, perdendo uma ficha para L, C ou R. (Observe que 0 vira quando um jogador tem 0 fichas é equivalente a passar.)
Isso é repetido até que a soma das fichas dos jogadores seja 0.
A implementação gira os jogadores deixados um lugar a cada turno e, em seguida, gira os estados resultantes de volta para todos estarem alinhados como se não estivessem.
fonte
Ø.X¤?
está aninhada na instrução de repetição até 3 vezes⁸«3Ḣ¤¡
,.C #, 356? +13? Bytes
Requer
using System;
um total de +13 bytes para o código mostrado abaixo, se precisar contar isso. Caso contrário, basta digitar em qualquer classe e ligarL(players, starting chips);
.Exemplo de saída para um jogo de 2,2:
Versão menos golfe:
fonte
C # (compilador interativo do Visual C #) ,
201199 bytesExperimente online!
fonte
Carvão , 61 bytes
Experimente online! Link é a versão detalhada do código. Alterna entre a saída dos dados e fichas restantes (nem o número inicial de fichas nem o número de fichas no centro estão incluídos na saída). Explicação:
Comece com o primeiro jogador.
Repita até que ninguém tenha mais fichas.
Jogue até três dados para o jogador atual. Esses dados são rotulados como 0-5, onde 0-2 representa o ponto, 3 é passado para a esquerda, 4 é para o centro, 5 é para a direita.
Adicione o número de fichas que o jogador à direita passou à esquerda e o número de fichas que o jogador à esquerda passou à direita, mas subtraia o número de fichas que o próprio jogador passou.
Avança para o próximo jogador.
Saída o novo número de fichas mantidas pelos jogadores.
Na verdade, é mais fácil para todos rolar seus dados simultaneamente, o que pode ser feito em 50 bytes, incluindo a impressão dos dados e as fichas restantes:
Experimente online! Link é a versão detalhada do código.
fonte
05AB1E (herdado) ,
58504952 bytesVersão que gera o mesmo estado quando um jogador do turno tem 0 fichas restantes (
504952 bytes ):Experimente online.
Versão que pula jogadores com 0 fichas restantes (
585760 bytes ):Experimente online.
Ambos os +3 bytes usando a versão herdada, porque a nova versão 05AB1E tem um bug estranho. Ele deve funcionar com
Ws\
(push mínimo sem pular; troca; lista de descarte) substituído porß
(lista pop e push mínimo) e0›
(verifique se maior que 0) e substituído pord
(verifique se não é negativo / maior que ou igual a 0) no nova versão, mas por algum motivo a ordem da lista é alterada após o final¼
!! : S (e a nova versão também é extremamente lenta e atinge o tempo limite após 60 segundos antes de terminar o resultado ..>.>)A primeira entrada é a quantidade de jogadores, a segunda entrada, a quantidade de fichas por jogador.
Explicação (da segunda versão):
fonte
[2, 3, 3, 3]
seguida por[2, 2, 2, 6]
..: S Vou ver se consigo encontrar a causa e corrigi-la. Se não, eu sempre pode excluí-lo e só usar o legado, uma vez que gera muito mais de qualquer maneira .. A nova versão é bastante lento com loops complexos, por algum motivo ..>>.counter_variable
. Tentei reproduzir o problema em um exemplo mais simples, mas não consigo. Tem algo a ver com as instruções if e os mapas aninhados dentro do loop infinito, mas é definitivamente estranho. De qualquer forma, removi essa versão e agora resta apenas a versão legada (e mais rápida), que funciona conforme o esperado.