Mancala es el nombre de una familia de juegos de mesa que generalmente implican una serie de tazas llenas de cuentas que los jugadores manipulan. Este desafío utilizará un conjunto de reglas específicas para una variante de solitario del juego.
El tablero consiste en una "canasta" en un extremo, seguido de un número infinito de tazas, numeradas a partir del 1. Algunas de las tazas tendrán cierto número de cuentas. Si la n
copa tiene exactamente n
cuentas, puede "sembrarlas". Sembrar significa sacar todas las n
cuentas de la taza, luego depositarlas una a la vez en cada taza hacia la canasta. La última cuenta irá a la canasta. El jugador gana cuando todas las cuentas en el tablero están en la canasta.
Claramente, hay muchas tablas que no se pueden ganar, como si hubiera exactamente una cuenta en la segunda copa. No hay jugadas legales porque no se pueden sembrar todas las copas con 0 cuentas, y la segunda copa no tiene suficientes cuentas para sembrar. Obviamente, esto no es divertido, por lo que su tarea será crear tableros ganables.
Tarea
Dado un número entero positivo que representa una cantidad de cuentas, se obtiene una lista de números enteros no negativos que representan la cantidad de cuentas que se deben colocar en cada taza para formar un tablero que se pueda ganar como se describió anteriormente. Esta lista no debe contener ceros finales.
Para cualquier número de cuentas, siempre hay exactamente una configuración de tablero que se puede ganar.
Demostración
Esta es una demostración de cómo jugar el tablero ganable y la entrada de 4. El tablero ganable es [0, 1, 3]
. Comenzamos con el único movimiento disponible, sembrando las cuentas de la tercera copa para obtener [1, 2, 0]
. Ahora tenemos realmente una opción, pero la única correcta es la siembra de la primera taza, consiguiendo: [0, 2, 0]
. Luego sembramos la segunda copa [1, 0, 0]
y finalmente sembramos la primera copa nuevamente para obtener todas las tazas vacías.
Casos de prueba:
1 => [1]
2 => [0, 2]
3 => [1, 2]
4 => [0, 1, 3]
5 => [1, 1, 3]
6 => [0, 0, 2, 4]
7 => [1, 0, 2, 4]
8 => [0, 2, 2, 4]
9 => [1, 2, 2, 4]
10 => [0, 1, 1, 3, 5]
11 => [1, 1, 1, 3, 5]
12 => [0, 0, 0, 2, 4, 6]
13 => [1, 0, 0, 2, 4, 6]
14 => [0, 2, 0, 2, 4, 6]
15 => [1, 2, 0, 2, 4, 6]
16 => [0, 1, 3, 2, 4, 6]
17 => [1, 1, 3, 2, 4, 6]
18 => [0, 0, 2, 1, 3, 5, 7]
19 => [1, 0, 2, 1, 3, 5, 7]
20 => [0, 2, 2, 1, 3, 5, 7]
¡ Muchas gracias a PeterTaylor por crear un programa para generar casos de prueba!
fuente
Respuestas:
CJam (21 bytes)
Demostración en línea
Explicación
Obtuve independientemente la técnica de "reproducción" mencionada en este artículo . Probamos por inducción que hay exactamente una tabla ganadora para un número dado de cuentas.
Caso base: con 0 cuentas, el único tablero ganador es el vacío.
Paso inductivo: si sembramos desde la copa
k
, en el próximo movimiento la copak
estará vacía y cada copa más cerca de la canasta contendrá al menos una cuenta. Por lo tanto, podemos encontrar el tablero ganador único conn
cuentas del tablero ganador conn-1
cuentas buscando la taza vacía con el número más bajo, tomando una cuenta de la canasta y una de cada taza debajo de esa taza vacía, y colocándolas todas en la taza vacía.Disección
fuente
Python,
4241 bytesfuente
JavaScript (ES6),
6337 bytesPuerto de la respuesta Python de @ orlp. Explicación: Considere el número total de cuentas en las
i
copas th y superiores. Cada jugada de una de estas tazas eliminará lasi
cuentas de ese total. (Por ejemplo, sii
es 3 y juegas desde la quinta copa, reduces el número de cuentas en esa copa en cinco, pero también agregas una a las copas cuarta y tercera). Por lo tanto, el total debe ser un múltiplo dei
. Ahora lai-1
copa no puede conteneri
o más cuentas, por lo que para que salga un múltiploi
debe contener el resto del módulo de cuentasi
.Explicación previa (del enlace de @ xnor): El enfoque ingenuo es la técnica de "juego inverso". Esto utiliza la observación de que hacer una jugada vacía una copa, por lo que el juego inverso recoge una cuenta de cada copa y las coloca en la primera copa vacía, así (63 bytes):
Ahora, solo considera las primeras
i
tazas. En el caso de que uno de ellos esté vacío, el juego inverso se sumará1
al número total de cuentas en esas tazas, mientras que en el caso de que ninguno de ellos esté vacío, el juego inverso se restarái
del total, sin embargo, esto es equivalente a agregar un1
móduloi+1
. Después de que losn
juegos inversos la suma de las cuentas en las primerasi
copas será, por lo tanto, equivalente aln
móduloi+1
, o dicho de otro modo, el número de cuentas en lai
copa th será equivalente an
menos la suma de las cuentas en las tazas anteriores, móduloi+1
. Ahora, para que lai
copa sea jugable, el número de cuentas no puede excederi
, por lo que de hecho será igual al número de cuentas restantes móduloi+1
. (Tenga en cuenta que lo usod=i+1
ya que usa menos bytes).fuente
+
no tiene nada en ES6?Ruby, 36 bytes
Un puerto de la respuesta de @ orlp porque es demasiado genial para mí pensar en algo mejor.
fuente