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-","----------"]
AAAABBBBrealidad no es válido, y ABBno 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.

