Cómo se juega
En cada casilla debes colocar exactamente una diagonal: / o \. Algunos puntos de la cuadrícula contienen un número. Esa pista indica cuántas diagonales deben tocar exactamente ese vértice.
La segunda regla es global: las diagonales no pueden formar ningún circuito cerrado. Puedes cumplir todos los números cercanos a una zona y aun así estar construyendo un bucle que invalida el tablero.
Gokigen Naname y el nombre Slant
Nikoli publica el puzzle en Japón con el nombre Gokigen Naname (ごきげんななめ) y su página oficial resume las tres reglas esenciales: una diagonal por casilla, números que cuentan las diagonales incidentes y ausencia de bucles.
En el mundo anglosajón es muy conocido como Slant, nombre utilizado por la Portable Puzzle Collection de Simon Tatham. Su documentación atribuye explícitamente el puzzle a Nikoli y describe la misma mecánica. PuzzleHub mantiene “Slant” como nombre del catálogo porque es reconocible internacionalmente, pero conserva el nombre japonés en la documentación.
No hemos encontrado en una fuente primaria accesible una fecha o un número de revista que permita afirmar con seguridad cuándo apareció por primera vez. Preferimos dejar ese dato sin inventar antes que repetir una atribución dudosa.
Por qué union-find encaja tan bien
Una diagonal conecta dos vértices de la cuadrícula. Si interpretamos todos los vértices como nodos y todas las diagonales como aristas, la regla “no formar bucles” se convierte en una propiedad clásica de grafos: el conjunto de aristas debe permanecer acíclico.
Para comprobarlo usamos una estructura disjoint-set union o union-find. Antes de colocar una diagonal preguntamos si sus dos extremos ya pertenecen al mismo componente. Si la respuesta es sí, añadir esa arista cerraría un ciclo y la orientación queda descartada.
El solver necesita además deshacer decisiones durante el backtracking, por lo que usamos una variante con rollback. Cada unión guarda el cambio mínimo necesario y puede volver al estado anterior sin reconstruir todo el grafo.
Las pistas también permiten podar pronto
Para cada vértice mantenemos dos cantidades: cuántas diagonales ya lo tocan y cuántas casillas adyacentes siguen sin decidirse. Una rama es imposible si ya supera la pista o si, incluso orientando a favor todas las casillas restantes, ya no podría alcanzarla.
Cuando hay que escoger la siguiente casilla usamos MRV: examinamos cuál tiene menos orientaciones legales en ese momento. Las restricciones numéricas y el union-find participan en esa prueba, por lo que muchas casillas pasan rápidamente de dos posibilidades a una.
Generar una solución no basta
Construimos primero una red completa de diagonales sin ciclos y calculamos todos los números que produciría. A partir de ahí retiramos pistas una a una. Cada retirada solo se conserva si un solver independiente sigue encontrando exactamente una solución.
El contador se detiene al encontrar una segunda solución. De este modo no confundimos “hemos encontrado una solución” con “el puzzle tiene solución única”.
Cuatro tamaños y cuatro dificultades
La versión de PuzzleHub ofrece 6×6, 8×8, 10×10 y 12×12. Cada tamaño tiene Fácil, Normal, Difícil y Experto, y el tamaño no determina por sí solo la dificultad.
La progresión usa dos señales. Primero, el número de pistas desciende de forma estricta al subir de nivel. Segundo, almacenamos una puntuación combinada basada en el trabajo del solver y en cuánta información se ha retirado. Esto evita exigir artificialmente que el número de nodos de backtracking aumente en cada escalón: algunos tableros pueden necesitar el mismo número de decisiones pero ofrecer muchas menos pistas directas al jugador.
Variantes instantáneas y seguras
Las bases se generan y verifican fuera de la interacción del jugador. Durante una partida aplicamos las ocho simetrías del cuadrado: rotaciones, reflejos y transposiciones. Cada transformación mueve tanto las diagonales como las pistas a sus nuevos vértices.
La propiedad de no tener ciclos se conserva bajo esas simetrías, pero el selfTest() no se limita a confiar en ello: vuelve a resolver cada transformación desde cero y exige de nuevo una única solución.
Una interfaz que enseña el problema
Las diagonales se dibujan dentro de las celdas y las pistas se superponen exactamente sobre las intersecciones de la cuadrícula. Un clic recorre vacío → \ → /; el clic derecho recorre el orden inverso. En teclado se pueden usar directamente /, \, cursores y Supr.
Si una pista recibe demasiadas diagonales o la red ya contiene un ciclo, el estado se marca antes de pulsar “Comprobar”. Así la interfaz ayuda a razonar sin revelar la solución.
Qué verifica CI
Para cada uno de los cuatro tamaños y cuatro niveles comprobamos que el número de pistas disminuye y la puntuación de complejidad aumenta. Después validamos la solución base y resolvemos sus ocho simetrías.
Son 128 configuraciones verificadas por el motor. Cualquier refactorización que permita un bucle, rompa una pista o convierta una base en ambigua hace fallar npm run verify antes del merge.
Fuentes y referencias
Reglas oficiales: Nikoli — ごきげんななめ. Reglas, controles y atribución a Nikoli: Simon Tatham — Slant. Hemos utilizado estas fuentes para contrastar reglas e historia; los tableros, el generador y el código de PuzzleHub son propios.