En una fiesta, me presentaron el juego LCR. Ahora no es un gran juego ya que no hay habilidad sino solo una oportunidad aleatoria. Pero me hizo pensar que podía codificar esto e hice un programa rápido en R para modelar el juego.
Reglas del juego modificadas de Wikipedia para coincidir con la forma en que jugamos:
Cada jugador recibe al menos 3 fichas. Los jugadores se turnan para lanzar tres dados de seis lados, cada uno de los cuales está marcado con "L", "C", "R" en un lado y un solo punto en los tres lados restantes. Por cada "L" o "R" lanzado, el jugador debe pasar una ficha al jugador a su izquierda o derecha, respectivamente. Una "C" indica una ficha al centro (bote). Un punto no tiene efecto.
Si a un jugador le quedan menos de tres fichas, todavía están en el juego, pero su número de fichas es el número de dados que tira en su turno, en lugar de tirar los tres. Cuando un jugador tiene cero fichas, pasa los dados en su turno, pero puede recibir fichas de otros y tomar su siguiente turno en consecuencia. El ganador es el último jugador en poner fichas en el centro.
Concurso: escriba un programa en el idioma de su elección que tome datos para el número de jugadores y el número de fichas iniciales y simule un juego de LCR, que muestre el estado del juego después de que cada jugador haya rodado.
Por ejemplo, un juego puede salir 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
La salida no tiene que verse exactamente así, pero debería ser fácil discernir el lanzamiento de dados, cuántas fichas tiene cada jugador y cuántas fichas tiene el centro para cada turno.
Es el código de golf, por lo que gana el código más corto.
[[[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]]
¿es ese el caso?Respuestas:
Emacs Lisp , 279 bytes
Use esta función como
(f 4 3)
.Versión mejor legible:
Ejemplo de salida:
fuente
Java 8,
281277275274253 bytesVersión que genera el mismo estado cuando un jugador de turno tiene 0 fichas restantes:
Comienza con el tercer jugador en la matriz.
Pruébalo en línea.
Versión que omite jugadores con 0 fichas restantes (274 bytes):
Comienza en el primer jugador de la matriz.
Pruébalo en línea.
-7 bytes gracias a @ OlivierGrégoire .
Explicación (de la segunda versión):
fuente
s=0;for(int C:c)s+=C;
(21 bytes) puede ser reemplazado pors=A.stream(c).sum();
(20 bytes)c[i%p]-=r<3?1:0
→c[i%p]-=1-r/3
. Esto ahorraría 2 bytes.A
dejava.util.Arrays
. : D Y al ponerlo en el bucle para guardar en el punto y coma son -2 bytes. Y de1-r/3
hecho es correcto ( ver aquí ). Gracias.s=c[u=(i+r-1+p)%p]+=1-r&1-r/4
(ahorra 2 bytes, en comparación cons=c[u=(i+r%2*2-1+p)%p]+=r<2?1:0
)Python 2 ,
159148bytesPruébalo en línea!
Imprime todas las fichas de los jugadores después de cada tirada
fuente
n*c - sum(players)
. Si necesito escribirlo explícitamente, lo haréJalea , 39 bytes
+2 para corregir el comportamiento de repetición (
¡
debe ir precedido de un nilad, así que«3Ḣ$
->⁸FḢ«3
)Si podemos definir las listas de salida que se rotarán para que las fichas pertenezcan al jugador que actuó previamente a la izquierda, podemos eliminar el más a la derecha 6 bytes por 33 bytes (sin embargo, en mi opinión, es algo incómodo leer eso).
Un enlace diádico que acepta fichas por jugador a la izquierda y número de jugadores a la derecha, lo que genera una lista de fichas de jugadores al comienzo del juego y después de cada turno (incluidos los turnos donde 0 fichas fuerzan un pase) .
Pruébalo en línea!
¿Cómo?
Cada jugador por turno, hasta tres veces, dependiendo de su conteo de fichas, lanza una moneda. Cuando un jugador voltea cabezas no hace nada, pero si lanza colas, tira un dado de tres lados y pierde una ficha a L, C o R. (Tenga en cuenta que 0 voltea cuando un jugador tiene 0 fichas es equivalente a pasar).
Esto se repite. hasta que la suma de las fichas de los jugadores sea 0.
La implementación gira a los jugadores a la izquierda un lugar cada turno y luego gira los estados resultantes para que todos estén alineados como si no lo estuvieran.
fuente
Ø.X¤?
se desliza por el interior de la repetición-up-to-3-times instrucción,⁸«3Ḣ¤¡
.C #, 356? +13? Bytes
Requiere
using System;
un total de +13 bytes para el código que se muestra a continuación, si debo contar eso. De lo contrario, simplemente colóquelo en cualquier clase y llameL(players, starting chips);
.Ejemplo de salida para un juego 2,2:
Versión menos golfizada:
fuente
C # (compilador interactivo de Visual C #) ,
201199 bytesPruébalo en línea!
fuente
Carbón , 61 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Alterna entre la salida de los dados y las fichas restantes (ni la cantidad inicial de fichas ni la cantidad de fichas en el centro se incluyen en la salida). Explicación:
Comience con el primer jugador.
Repita hasta que a nadie le queden fichas.
Lanza hasta tres dados para el jugador actual. Estos dados están etiquetados 0-5, donde 0-2 representa el punto, 3 se pasa a la izquierda, 4 es al centro, 5 es a la derecha.
Agregue la cantidad de fichas que el jugador de la derecha pasó a la izquierda y la cantidad de fichas que el jugador de la izquierda pasó a la derecha, pero reste la cantidad de fichas que el jugador pasó.
Avanza al siguiente jugador.
Salida de los nuevos números de fichas en poder de los jugadores.
En realidad, es más simple para todos lanzar sus dados simultáneamente, lo que se puede hacer en 50 bytes, incluida la impresión de los dados y las fichas restantes:
Pruébalo en línea! El enlace es a la versión detallada del código.
fuente
05AB1E (heredado) ,
58504952 bytesVersión que genera el mismo estado cuando un jugador de turno tiene 0 fichas restantes (
504952 bytes ):Pruébalo en línea.
Versión que omite jugadores con 0 fichas restantes (
585760 bytes ):Pruébalo en línea.
Ambos +3 bytes usando la versión heredada, porque la nueva versión 05AB1E tiene un error extraño. Debería funcionar con
Ws\
(empujar mínimo sin reventar; intercambiar; descartar lista) reemplazado conß
(lista pop y empujar mínimo) y0›
(verificar si es mayor que 0) reemplazado cond
(verificar si no es negativo / mayor que o igual a 0) en el nueva versión, pero por alguna razón, el orden de la lista cambia después del final¼
! .. : S (y la nueva versión también es extremadamente lenta y agota el tiempo de espera después de 60 segundos antes de terminar el resultado ..>.>)La primera entrada es la cantidad de jugadores, la segunda entrada es la cantidad de fichas por jugador.
Explicación (de la segunda versión):
fuente
[2, 3, 3, 3]
seguida de[2, 2, 2, 6]
...: S Veré si puedo encontrar la causa y solucionarlo. Si no, siempre puedo eliminarlo y solo usar el legado, ya que de todos modoscounter_variable
. Traté de reproducir el problema en un ejemplo más simple, pero no puedo. Tiene algo que ver con las declaraciones y mapas anidados dentro del bucle infinito, pero definitivamente es extraño ... De todos modos, he eliminado esa versión y ahora solo queda la versión heredada (y más rápida), que funciona según lo previsto.