Antecedentes
En el juego de Nim , los jugadores alternan quitando "piedras" de las "pilas": en cada turno, un jugador debe quitar entre una y todas las piedras de una sola pila. El objetivo de Nim es tomar la última piedra o, en la variante misere, obligar a tu oponente a hacerlo; sin embargo, resulta que las estrategias son casi idénticas.
Nim hace un divertido juego de bar. Puede usar fósforos o monedas para las "piedras", y las "pilas" generalmente están dispuestas en una línea. A continuación se muestra una configuración clásica con pilas de 1, 3, 5 y 7:
Si nunca antes has jugado a Nim, puedes probarlo antes de intentar este desafío. Aquí hay una versión llamada "Perlas antes de los cerdos" .
Estrategia
La estrategia óptima en Nim es lo suficientemente complicada como para que la mayoría de los laicos pierdan constantemente ante un experto, pero simple de describir con aritmética binaria .
Sin embargo, hacer operaciones XOR mentales binarias es difícil, por lo que afortunadamente hay una forma equivalente de visualizar la estrategia correcta que es más fácil de implementar en tiempo real, incluso cuando está borracho.
Solo hay tres pasos:
- Agrupe mentalmente las "piedras" en cada línea en subgrupos cuyos tamaños son potencias de 2, comenzando con el tamaño más grande posible: 8, 4, 2 y 1 son suficientes para la mayoría de los juegos.
- Intenta hacer coincidir cada grupo con un gemelo en otra línea, para que cada grupo tenga un par.
- Si esto no es posible, elimine las "piedras" no emparejadas de una sola línea (esto siempre será posible; consulte el enlace de Wikipedia para saber por qué) para que el paso 2. sea posible.
O, dicho de otra manera: "Quite algunas piedras de una pila de tal manera que si luego agrupa las pilas en poderes de 2, todos los grupos pueden ser emparejados con un grupo en otra pila". Con la advertencia de que no puedes dividir potencias mayores de 2 en unidades más pequeñas, por ejemplo, no puedes agrupar una línea con 8 piedras en dos grupos de 4.
Por ejemplo, así es como visualizarías el tablero de arriba:
Este tablero está perfectamente equilibrado, por lo que querrás que tu oponente se mueva primero.
El reto
Dada una lista de enteros positivos que representan el tamaño de las "pilas" de Nim, devuelva una visualización en texto plano del tablero de Nim como lo ve un experto.
Lo que constituye una visualización válida se explica mejor con un ejemplo, pero debe:
- Asigne un carácter distinto a cada "subgrupo de potencia de 2" y su par (los subgrupos no emparejados no califican), y use ese carácter para representar las "piedras" tanto en el subgrupo como en el par.
- Representar cualquier "piedras" no apareados (es decir, los que un experto eliminaría al jugar normales - no misere - Nim) usando un guión:
-
.
Habrá múltiples formas de lograr una visualización válida, y todas son válidas. Analicemos algunos casos de prueba:
Casos de prueba
Entrada: 1, 3, 5, 7
Salida posible 1:
A
BBA
CCCCD
CCCCBBD
Opcionalmente, puede incluir espacios entre los caracteres, así como líneas en blanco entre las filas:
Salida posible 2:
A
B B A
C C C C D
C C C C B B D
Entrada: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
El orden y la elección de los personajes pueden ser lo que quieras:
Salida posible 1:
G
E E
E E G
C C C C
C C C C F
B B B B D D
B B B B D D F
H H I - - - - -
A A A A A A A A I
A A A A A A A A H H
Los símbolos Unicode también están bien:
Salida posible 2:
◎
◈ ◈
◈ ◈ ◎
△ △ △ △
△ △ △ △ ◉
◐ ◐ ◐ ◐ ◀ ◀
◐ ◐ ◐ ◐ ◀ ◀ ◉
▽ ▽ ◒ - - - - -
▥ ▥ ▥ ▥ ▥ ▥ ▥ ▥ ◒
▥ ▥ ▥ ▥ ▥ ▥ ▥ ▥ ▽ ▽
Entrada: 7
De las reglas se deduce que cualquier "pila única" debe eliminarse por completo.
Salida posible 1:
-------
Salida posible 2:
- - - - - - -
Entrada: 5, 5
Salida posible:
A A A A B
A A A A B
Reglas Adicionales
- Este es el código de golf con reglas estándar. El código más corto gana.
- La entrada es flexible y puede tomarse en cualquier forma de lista que le resulte conveniente.
- La salida también es flexible, como lo ilustran los ejemplos anteriores. Se permitirán variaciones más razonables. Pregunta si no estás seguro de algo.
["H","EE","EEH","CCCC","CCCCI","DDDDFF","DDDDFFI","AAAAAAAA","AAAAAAAA-","----------"]
AAAABBBB
realidad no es válido, yABB
no lo es, pero hace que la salida sea menos legible, así que creo que hacer que disminuir dentro de una línea sea una regla explícita es lo mejor.Respuestas:
Ruby,
169164148 bytesPruébalo en línea!
Primero, inicializamos
s=eval a*?^
(que es más corto quea.reduce:^
)c
, que almacena el primer carácter único no utilizadom
que asigna potencias de dos longitudes a los caracteres utilizados para representarlosLuego, recorriendo cada pila, ejecutamos lo siguiente:
Según la estrategia de Wikipedia , si la pila XOR de nim-sum es menor que la pila , debemos eliminar las piedras de esa pila de modo que su longitud se convierta en la pila XOR de nim-sum . Al almacenar la diferencia en la variable
z
, podemos probar para ver si esta diferencia es positiva, y si es así 1.) imprima tantos guiones, 2.) reste del montón y 3.) establezca la variable nim-sum en cero para evitar más remoción de cálculos.Ahora "recorremos" cada bit y hacemos un seguimiento de sus valores dividiendo repetidamente
x
por2
y multiplicando el acumuladorn
por2
. El ciclo es en realidad una cadena evaluadax
veces, que es mucho mayor que laslog2(x)
veces que es necesario, pero no se hace daño (aparte de la ineficiencia). Para cada bit, ejecutamos lo siguiente si el bit es 1 (x&1>0
):Imprimir un personaje
n
veces. Si ya imprimimos un grupo no emparejado de tantas piedras, use ese carácter; de lo contrario, use el siguiente carácter no utilizado (avanzandoc
en el lugar debido a!
).Si
m[n]
existió (es decir, acabamos de completar un par), entoncesm[n]
se restablece. De lo contrario, acabamos de comenzar un nuevo par, así que establecemosm[n]
el carácter que usamos (*1
es una forma corta de hacer una copiac
).fuente
Python 2 ,
150196206 bytesPruébalo en línea!
fuente
4, 9, 10
.14, 21, 35
.There will be multiple ways to achieve a valid visualization, and all are valid
JavaScript (ES6), 215 bytes
Solo visualiza hasta 36 personajes diferentes. Me alivia que esto funcione
1, 3, 4, 5
.fuente
Limpio , 454 bytes
todavía jugando al golf
Pruébalo en línea!
Define la función
$ :: [Int] -> String
, toma los tamaños de pila y devuelve una cadena donde-
denotan piedras a eliminar, y los grupos están representados por caracteres ASCII ascendentes-
. Si se necesitan suficientes grupos, los caracteres finalmente se reintegrarán, y debido afoldr
que requiere más de un gigabyte de memoria para ejecutar el segundo caso de prueba.Versión con sangría de la comprensión gigante:
fuente