Cuando empezamos a hablar de solvers como infraestructura de PuzzleHub podía sonar a que acabaríamos construyendo una especie de algoritmo universal. La realidad ha sido más interesante. Cuanto más amplio se vuelve el catálogo, más evidente resulta que la representación correcta de cada puzzle importa tanto como la búsqueda.
Dominosa y Stitches pueden describirse como problemas de emparejamiento, pero sus restricciones no son idénticas. Slant necesita vigilar ciclos mientras coloca diagonales. Aquarium impone una geometría de niveles de agua. Str8ts combina unicidad de filas y columnas con secuencias dentro de compartimentos. Kropki convierte cada frontera entre celdas en una relación.
La parte compartida no es el algoritmo
Lo que sí se repite es el contrato. Un motor candidato debe poder responder preguntas concretas: ¿este estado cumple las reglas?, ¿existe al menos una solución?, ¿existe exactamente una cuando el juego lo exige?, ¿podemos reproducir el caso?, ¿la dificultad que anunciamos tiene alguna relación con el trabajo lógico?
Ese contrato permite que dos implementaciones internas completamente distintas se integren en la misma plataforma y pasen por gates similares.
La abstracción útil no es «todos los puzzles son backtracking». Es «todos deben poder demostrar propiedades sobre lo que publican».
Dominosa: cuando el tablero se convierte en exact cover
En Dominosa cada casilla debe pertenecer a un dominó y cada pareja de valores permitida debe utilizarse exactamente una vez. Visto así, el puzzle deja de ser una cuadrícula decorada y se convierte en una selección de piezas candidatas que deben cubrir simultáneamente posiciones y tipos de dominó.
Esta formulación encaja de manera natural con exact cover. Cada colocación posible cubre un conjunto de requisitos; resolver significa elegir un subconjunto compatible que cubra todos exactamente una vez. La representación reduce mucha lógica especial a un problema combinatorio más limpio.
Stitches: emparejar sin confundirlo con Dominosa
Stitches también conecta celdas o regiones, pero la semántica del enlace es diferente. El solver debe respetar qué regiones pueden conectarse, cuántas puntadas necesita cada una y qué pares siguen disponibles.
El aprendizaje aquí fue evitar una abstracción prematura. Compartir utilidades de búsqueda o conteo puede ser útil; forzar ambos juegos dentro del mismo modelo porque «los dos emparejan cosas» habría hecho el código menos claro, no más.
Slant: una restricción global escondida entre diagonales locales
Slant parece un puzzle de decisiones binarias: cada celda contiene / o \. Las pistas numéricas en los vértices imponen cantidades locales. El problema es que una configuración puede satisfacer todas esas cuentas y aun así ser inválida si las diagonales forman un ciclo.
Eso obliga al solver a combinar dos escalas. Las pistas permiten podar decisiones locales; una estructura de conectividad debe impedir que aparezcan bucles. Es un buen ejemplo de por qué validar solo el aspecto más visible de las reglas produce falsos positivos.
Aquarium: el agua no se decide celda por celda
Aquarium utiliza pistas de filas y columnas, pero las regiones que representan acuarios obedecen una propiedad física estilizada: el agua queda nivelada. Si una celda de un acuario está llena a cierta altura, las celdas del mismo acuario situadas por debajo también deben estarlo.
Tratar cada celda como una variable independiente desperdicia estructura. Modelar niveles posibles por región reduce estados imposibles desde el principio y hace que el solver piense en la misma unidad conceptual que el jugador.
Str8ts: las casillas blancas forman intervalos
Str8ts hereda parte del vocabulario de los puzzles latinos —sin repetir números por fila o columna—, pero su restricción decisiva vive dentro de cada compartimento blanco: los valores deben formar una secuencia consecutiva, aunque puedan aparecer en cualquier orden.
Eso permite razonar con intervalos. Si un compartimento de tres casillas ya contiene un 4 y los candidatos restantes solo permiten 2, 3, 5 o 6, no todas las combinaciones tienen sentido: necesitamos algún conjunto de tres valores consecutivos que incluya el 4.
Kropki: las fronteras también son variables de información
En Kropki, puntos blancos y negros relacionan vecinos, pero la ausencia de punto también restringe cuando usamos la regla negativa completa. El solver no puede mirar únicamente el contenido de las celdas; tiene que interpretar cada frontera ortogonal como una relación explícita.
La heurística de elegir primero la celda con menos candidatos funciona bien aquí porque cada número colocado activa restricciones en fila, columna y vecinos. Pero la eficacia procede del modelo de candidatos, no de que el backtracking tenga algo especial por sí mismo.
Solución única: el segundo resultado importa más que el primero
En muchos de estos juegos el solver se usa durante generación. Encontrar una solución significa que el candidato no está roto. Encontrar una segunda significa que todavía no está terminado.
Por eso varios contadores se detienen en dos. No necesitamos enumerar todo el espacio; solo distinguir cero, una o más de una solución. Esta pequeña decisión transforma al solver en una herramienta práctica para el build y para la generación en navegador.
Los motores nativos también mejoran el producto alrededor del tablero
Sustituir una plantilla fija por un motor verificado no solo añade niveles. Permite tener semillas reproducibles, cuatro dificultades coherentes, botón de nueva partida, estadísticas comparables y onboarding que puede trabajar sobre estados reales.
Es una de las razones por las que estamos priorizando profundidad antes que aumentar el catálogo sin control. Un juego deja de ser una demo cuando puede producir suficientes partidas fiables para sostener una sesión real.
No buscamos un framework de solvers por deporte
Hay una tentación muy de ingeniería: después de implementar varios algoritmos, extraer inmediatamente un framework capaz de representarlos todos. Estamos intentando resistirla. Compartimos contratos, instrumentación y piezas que ya han demostrado repetirse; dejamos que la lógica específica siga siendo específica.
Una abstracción vale la pena cuando elimina repetición sin borrar información importante. En puzzles, la información importante suele ser precisamente la forma particular de la restricción.
La diversidad del catálogo está refinando la arquitectura
Aquarium, Str8ts, Dominosa, Kropki, Stitches y Slant llegaron casi seguidos, y esa concentración ha funcionado como una prueba de estrés. Hemos tenido que alternar entre grafos, matching, exact cover, intervalos y relaciones locales sin perder el contrato de producto.
La conclusión no es que tengamos seis trucos algorítmicos nuevos. Es que PuzzleHub empieza a tener una forma consistente de incorporar algoritmos distintos, demostrar que hacen lo que prometen y rodearlos de una experiencia común. Esa diferencia es mucho más importante para los próximos 75 juegos que cualquier solver aislado.