miércoles, 20 de agosto de 2025

Oops Again

 


Este juego tiene 10 piezas y cada pieza consta de dos bolas unidas en un punto. Lo que diferencia unas piezas de otras son los colores de sus bolas. En el juego hay 5 colores diferentes y en las 10 bolas encontramos todas las formas posibles que hay de combinarlos de dos en dos (sin repetir colores en cada pieza).

El objetivo del puzzle es colocar las piezas formando una pirámide con base triangular de forma que dos bolas del mismo color nunca se toquen. El puzzle fue inventado por Mike Reilly y se comercializó en 1993 a través de Channel Craft. Bueno, en realidad se comercializaron dos juegos. La palabra Again dentro del nombre del puzzle hace referencia a otro juego de menor tamaño llamado Oops, con la mitad de piezas. Dejo aquí una imagen que conservo de hace bastante tiempo donde se ven los dos juegos (y que no recuerdo de dónde salió).


La verdad es que teniendo el juego grande, es muy fácil quedarse sólo con las 5 piezas necesarias para el pequeño y jugar. Simplemente eliminando todas las piezas que lleven uno de los colores (por ejemplo el lila) y otra pieza más (no importa cuál, por ejemplo el verde y azul).


Equivalencias y simetrías

Ambos juegos son bastante entretenidos y por supuesto es más difícil resolver el grande que el pequeño. Aunque ninguno de los dos nos llevará demasiado tiempo son muy entretenidos e interesantes. ¿Pero, cuántas soluciones tienen? Incluso contar las soluciones que vamos obteniendo no es fácil porque si tenemos una solución válida y hacemos una permutación de colores, obtendremos otra solución aparentemente diferente. Pero sólo aparentemente ya que supongo que todos coincidiremos en que se debería considerar como la misma ya que, por ejemplo en Oops again todos los colores son “simétricos” (en Oops hay dos grupos de colores).

Del mismo modo, si hacemos una rotación o cualquier otra simetría del tetraedro (de las 23 distintas de la identidad que tiene) obtendremos otra que también debería considerarse como equivalente. Es decir, tenemos dos formas de hacer que una misma solución parezca otra diferente pero sin serlo realmente (incluso una tercera que sería combinar las dos formas).

Al tener tantas soluciones equivalentes, lo primero que es importante es fijar una de ellas como “representante canónico” de todas. Y por supuesto pensar en algún método para poder anotarlas.


Buscando todas las soluciones

Desde que me fabriqué una copia de este juego (hace ya más de 22 años) siempre me ha intrigado saber el número total de soluciones del puzzle. Para Oops hice un pequeño análisis a mano y llegué a la conclusión de que tiene sólo dos soluciones, eliminando simetrías y permutaciones de colores (aunque como pondré al final de este post, este resultado no era correcto).

Pero con Oops again no he tenido tanta paciencia. Aunque empecé a analizarlo a mano, enseguida pude ver que tenía tantas posibilidades que no tuve valor a seguir intentándolo. Como siempre, teniendo BurrTools era obligado intentar hacer algo con este programa. Por lo menos conseguí ver que, considerando las piezas todas iguales e ignorando los colores, las piezas se podrían colocar de 213 formas diferentes para formar la pirámide.

Seguramente si intentase poner color a cada una de esas 213 soluciones para que cumpliese las restricciones del juego tendríamos que cada una (o muchas) se desdoblaría en varias coloraciones diferentes válidas. Con lo cual, efectivamente, eran demasiadas soluciones para hacerlo a mano. Sólo era razonable programarlo para que se resolviera con ordenador. Lo malo es que yo no sé nada de programación. Hace 10 años compartí en facebook una foto de este juego y animé a mis contactos a que buscasen el número de soluciones del puzzle. Pero imagino que nadie con los conocimientos necesarios se animó a hacerlo. Igual ya se conoce el número de soluciones, pero yo no he podido enterarme. También intenté contactar con Mike Reilly, pero no tuve éxito.


Programando en Python con IA

Finalmente, este invierno me enteré casualmente de que ChatGPT podía usarse para programar. Supongo que habrá otras IA que estarán más especializadas en programación, pero a mí se me cruzó esta en el camino y lo intenté con ella. Preparar la descripción de las piezas y las adyacencias dentro del tetraedro era lo más sencillo. Pero conseguir guiar a la IA para que el programa funcionase correctamente fue bastante trabajoso y a veces desesperante. Y supongo que alguien con bastantes conocimientos de programación lo haría con menos trabajo, más elegante y mejor.

Para empezar, pensé que sería bueno fijar una pieza concreta en un vértice de la pirámide (ya que todas las piezas son “equivalentes” en un principio. De ese modo ya habrá dos colores fijos y una pieza. Y para seguir “normalizando las soluciones” fijé también dos colores en las posiciones que forman un pequeño tetraedro con la pieza fijada en el vértice de la solución.

Con ese punto de partida y mucha ayuda por mi parte, la IA consiguió generar un programa con el que se obtenían 251626 soluciones y las pude guardar en un Excel para analizarlas. Según mi forma de “normalizar” los colores (eligiendo los 4 que formarían un vértice de la pirámide) ya se habrían eliminado las posibles permutaciones de colores.

Aún así, y dado que por el camino la IA había fallado con la implementación de mis requisitos en multitud de ocasiones, ese resultado me generaba bastante desconfianza. Por lo que intenté analizar un poco las soluciones del Excel obtenido. Lo primero que conseguí ver es que si ignoramos los colores, en la estructura de todas esas soluciones hay sólo 213 “estructuras” diferentes de las piezas. Es decir, la misma solución aportada por BurrTools. Eso me hizo tener algo más de confianza en el conjunto de soluciones que teníamos.

El siguiente paso que intenté fue modificar el programa (o mejor dicho, pedir a la IA que lo hiciera) para que en lugar de las piezas del puzzle usara sólo 20 bolas de colores sueltas. Es decir eliminar la “estructura” de las piezas y el puzzle para fijarnos sólo en cuántos coloraciones diferentes de la pirámide podían obtenerse. Resultado inicial: 3778 (ya eliminando las simetrías y partiendo de las soluciones “normalizadas”).


¿Cuántas soluciones tienen?

Y así creía haber concluido mi análisis del número de soluciones. Ya que en teoría las permutaciones de colores ya estaban tenidas en cuenta y también las 24 simetrías del tetraedro. Pero me faltaba probar también qué pasaba si las combinaba. Tomé una solución del juego, le apliqué una simetría y luego una permutación de colores adecuada para “normalizar” las solución (y así poder compararla con el listado de 251626 soluciones). De ese modo encontré que llegaba a otra solución teóricamente diferente de ese listado. Es decir, tenía que depurar esas soluciones ya que habría muchas equivalentes.

Es probable que lo mejor fuese modificar el programa para que tenga en cuenta esto. Pero yo tenía ya resultados en Excel y preferí seguir la vía de buscar otro programa que depurase estos resultados. Empecé con el que contenía las 3778 coloraciones diferentes del puzzle ya que me parecía más sencillo y de nuevo con Python conseguimos que esas soluciones se redujeran a 183 coloraciones.

De modo que 183 coloraciones diferentes y 213 “estructuras” diferentes podrían dar como máximo un total de 183*213=38979 soluciones (ya tenía una cota máxima para las soluciones del juego).

Y finalmente, después de bastantes equivocaciones y de casi tirar la toalla en varias ocasiones llegamos a reducir a 31617 las soluciones para Oops again (partiendo de las 251626 iniciales).

Y haciendo lo mismo (ahora a mano) con su hermano pequeño Oops pude comprobar que mis dos soluciones iniciales eran en el fondo equivalentes. Con lo cual, yo diría que Oops (10 bolas) tiene una solución única.


Estas son mis conclusiones y la verdad es que me gustaría que alguien con conocimientos de programación pudiera comprobar si son correctos o si estoy equivocado. Dar por correcto un resultado hecho con ordenador me resulta difícil si no se tiene confianza en el programa usado. Y en este caso, al no tener ni idea de programación mis inseguridades se multiplican. Pero lo que sí tengo claro es que todas las soluciones que he probado de mi listado son válidas y correctas.

Igualmente si alguien tiene algo que corregirme sobre mi forma de considerar soluciones equivalentes, lo debería hacer libremente.

martes, 12 de agosto de 2025

N52


 

Continúo con la serie de puzzles n-arios en este caso con el puzzle N52 de Jean Claude Constantin. Este puzzle es el segundo de una serie de puzzles ternarios donde tenemos un nivel inferior N5 de dificultad o de tamaño. Y, que yo sepa, se han fabricado también los niveles superiores: N522, N5222, N5, N52222222 y N522222222 (aunque el límite de las ampliaciones está sólo en la paciencia del jugador). 

 

Descripción.

Si conocías el juego seguro que la descripción que hago a continuación la necesitas, también puedes buscar algunos vídeos donde ver su manejo:

Como se puede ver en la fotografía de mi juego N52, el nombre deriva de “leer” las ranuras que aparecen en la línea inferior del puzzle orientado tal como aparece en la foto (y en la columna de la derecha). De modo que, por ejemplo N522 tiene una fila más y una columna más, y en la última línea se podrá “leer” el nombre del puzzle.

El puzzle consta de una serie de piezas en forma de listones horizontales que alternan los colores (3 en el caso de N52). Y por debajo de estos listones otros tres verticales que tienen una especie de pin metálico que hace de tope para limitar los movimientos. Estas piezas sólo pueden moverse deslizándose longitudinalmente sobre una base cuadrada de madera y por debajo de una cubierta transparente que permanecen fijas. En la posición inicial del puzzle (la de la primera fotografía) cada pin metálico de los 9 que tiene N52 se encuentra en la esquina superior derecha de esa especie de ranuras que son las que forman las figuras que le dan nombre al puzzle.

Observando la forma de estas ranuras vemos que se distribuyen siempre igual: una diagonal con lo que podríamos llamar la letra N. Por encima de esa diagonal aparece el simétrico de n, podríamos llamarlo U. Por debajo de esa diagonal principal tenemos otra diagonal con números 5 y por debajo de esta última todo son números 2. Toda la serie de Puzzles de esta familia mencionada cumple esta distribución.

El objetivo del puzzle es sacar una pequeña bola metálica que hay en un pequeño surco que tiene la primera pieza vertical (la primera por la izquierda). Esa bola se mueve junto con la pieza vertical en la que se encuentra. En algunos momentos durante la resolución del puzzle podremos inclinar el puzzle para que la bola pueda subir (y desplazarse en el hueco que tienen las horizontales a la izquierda) o bajar de nuevo según nos convenga. Para que al final podamos sacarla por el agujero superior que tiene la tapa de plexiglás del juego. (El otro agujero del plexiglás es para introducir la bola a su posición original una vez resuelto el puzzle y colocado convenientemente)

 






Notación, resolución y clasificación del puzzle

Según la clasificación que ha hecho de puzzles n-arios Goetz Schwandtner (y yo coincido con él), este puzzle es ternario. Esta clasificación se debe a que cada pieza deslizante vertical y horizontal podemos ponerla en tres posiciones diferentes (aunque realmente hay una que sólo la ponemos de dos formas). Y como consecuencia, para poder escribir los pasos que vamos dando en la resolución tendremos que usar 3 números (p ejemplo 0, 1, 2). Esos números describirán la posición de cada una de las piezas horizontales o verticales respecto de la posición inicial.

Así, para N52 usaremos una notación de 6 dígitos. El primero correspondería a la tira horizontal inferior, el segundo para la horizontal intermedia, luego la superior, después la vertical de la izquierda, y así seguiría con las dos que quedan. Además yo lo escribo con un espacio intermedio para distinguir mejor a simple vista las horizontales de las verticales.

De este modo la posición inicial (para mí) es 000 000. El primer movimiento nos permite pasar de golpe a la posición 000 200 (o si queremos podemos decir que pasamos por el camino por 000 100), Luego 100 200…

En un primer momento puede considerarse este código como un código Gray ternario (si consideramos los pasos intermedios por el 1 del cuarto dígito). Pero es bastante diferente a los que hemos usado otras veces para resolver los aros chinos o Cros&Crown.

La primera diferencia es que ahora no es estrictamente un código Gray reflejado (o por lo menos yo no he encontrado esa estructura). Aunque sí que hay subgrupos de movimientos repetitivos y que son reflejados de determinados movimientos anteriores. Esto hace que el puzzle dé una falsa sensación de que será repetitivo y elemental. En realidad hay que ir haciendo pequeñas variaciones, y es muy frecuente perdernos y acabar dando vueltas en círculo en los mismos movimientos.

Otra diferencia respecto a los mencionados aros chinos, Cross&Crown, etc es que el camino tampoco es totalmente lineal. En varios puntos a lo largo de la resolución, tenemos pequeñas alternativas para seguir otra vía, aunque son sólo de un paso y las dos nos acaban llevando al mismo sitio. También hay que mencionar que hay algunos callejones sin salida que a veces nos despistan. Todas estas diferencias hacen que el juego no nos lleve a recorrer el código gray ternario de 6 cifras completo, como sí sucedía con las series de juegos mencionados (vistos en mis post anteriores).

Además no se trata sólo de deslizar las piezas sino que no debemos perder de vista el objetivo del puzzle: sacar la bola. Por lo tanto hay que estar muy atento a los momentos en que tendremos que hacer que ésta cambie de nivel.

 

¿Número de pasos?

Goetz Schwandtner encontró una forma muy ingeniosa de modelizar esta serie de puzzles para ser resueltos por BurrTools (Su enlace directo para descargarlo: https://puzzles.schwandtner.info/compendium/extras/N_N5_N52_N522.xmpuzzle ).

(enlace sacado de aquí: Compendium of Chinese-Rings-Like puzzles )

Con un mismo modelo ha conseguido hacer que el programa encuentre las soluciones a N5, N52 y N522 (además de resolver lo que él ha llamado un nivel inferior a todos: N). En este archivo lo que no aparece es el movimiento de la bola.

El archivo está preparado para que el programa cuente los movimientos necesarios hasta hacer que todas las piezas horizontales lleguen hasta su posición extrema en la derecha. Además el programa mueve alguna vez (creo que sólo una vez) dos piezas al tiempo, con lo cual altera el recuento de pasos necesarios.

En resumen, según el programa el número de pasos es de:

    19 pasos para N5,

    68 para N52

    y 211 pasos para N522.

 Aunque yo creo que, si no me he equivocado en mi análisis, es posible sacar la bola usando 65 deslizamientos de las piezas horizontales y verticales de juego N52 (más 4 ó 7 movimientos de la bola, según cómo los contemos).

Aprovechando el archivo de Goetz y su idea en las piezas horizontales he hecho una pequeña modificación para obligar al programa a que siga analizando movimientos hasta llegar a la posición totalmente opuesta a la inicial. En este archivo podemos ver que se necesitan:

    29 pasos para llegar a 22 22 en N5,

    105 pasos para llegar a 222 222 en N52

    y 329 pasos para llegar a 2222 2222 en N522.

 En todo caso bastantes menos pasos de los que serían al recorrer el Gray binario completo. Ni siquiera transformando las secuencias que pasan de 0 a 2 directamente del cuarto dígito, en secuencias 0 - 1 - 2 (eso añadiría 31 códigos más en N52, llegando a 136).


Y ahora una conjetura: Esta familia de puzzles en la que podemos ir añadiendo filas y columnas subiendo el nivel de dificultad junto al número de pasos necesarios en la solución nos invita a buscar recursividad. Pues bien, me aventuro a decir que cada vez que añadimos un nivel, el número de pasos se triplica (sólo aproximadamente). Dividiendo el número de pasos para un cierto tamaño de juego (n) entre los pasos necesarios para el nivel anterior (n-1) ¿se va aproximando cada vez más a 3? ¿Alguien se anima a comprobarlo? De momento yo he probado a añadir un nivel más y en ese caso creo que serían unos 631 pasos depurados (631/211=2,99 usando el modelo de Goetz)