Amamos nuestros acertijos extraños, nosotros los británicos

16

En algunos periódicos británicos hay un juego conocido como Hidato . Es algo similar al Sudoku , aunque en lugar de tener 1-9 en una línea y bloque, se trata de colocar números de modo que se conecten en orden desde 01el más alto hasta el más alto, por lo que todos se tocan horizontal, diagonal o verticalmente .

Las entradas contendrán varias líneas separadas \n, que contienen bloques separados por un espacio, que puede suponer que tienen dos caracteres de ancho. Cada bloque será un número, un espacio en blanco para ser llenado (indicado por --) o una pared que no puede tener números en ( XX).

Su salida debe coincidir con la proporcionada, aunque con bloques vacíos provistos de números. Tenga en cuenta que puede que no haya una solución única, o incluso la existencia de una solución : algunas pueden generar múltiples debido a su ambigüedad, al igual que Sudoku, y algunas pueden ser literalmente irresolubles, en cuyo caso debe dar una salida falsey , pero usted puede asumir que las entradas tienen el formato siguiente.

Use un encabezado estándar Language: XX bytes. ¡Feliz golf!

Ejemplos

Insumos 01 XX 03, 01 -- 04, 01 --, etc todos debemos devolver algo Falsey- .

Entrada:

01 -- --
-- XX 05

Salida:

01 03 04
02 XX 05

Entrada:

-- 33 35 -- -- XX XX XX    
-- -- 24 22 -- XX XX XX      
-- -- -- 21 -- -- XX XX
-- 26 -- 13 40 11 XX XX
27 -- -- -- 09 -- 01 XX
XX XX -- -- 18 -- -- XX
XX XX XX XX -- 07 -- --
XX XX XX XX XX XX 05 --

Salida:

32 33 35 36 37 XX XX XX
31 34 24 22 38 XX XX XX
30 25 23 21 12 39 XX XX
29 26 20 13 40 11 XX XX
27 28 14 19 09 10 01 XX
XX XX 15 16 18 08 02 XX
XX XX XX XX 17 07 06 03
XX XX XX XX XX XX 05 04

Entrada:

XX XX XX XX -- 53 XX XX XX XX
XX XX XX XX -- -- XX XX XX XX
XX XX 56 -- -- -- 30 -- XX XX
XX XX -- -- -- -- -- -- XX XX
XX -- -- 20 22 -- -- -- -- XX
XX 13 -- 23 47 -- 41 -- 34 XX
-- -- 11 18 -- -- -- 42 35 37
-- -- -- -- 05 03 01 -- -- --
XX XX XX XX -- -- XX XX XX XX
XX XX XX XX 07 -- XX XX XX XX

Salida:

XX XX XX XX 52 53 XX XX XX XX
XX XX XX XX 54 51 XX XX XX XX
XX XX 56 55 28 50 30 31 XX XX
XX XX 26 27 21 29 49 32 XX XX
XX 25 24 20 22 48 45 44 33 XX
XX 13 19 23 47 46 41 43 34 XX
14 12 11 18 04 02 40 42 35 37
15 16 17 10 05 03 01 39 38 36
XX XX XX XX 09 06 XX XX XX XX
XX XX XX XX 07 08 XX XX XX XX
Mia yun Ruse
fuente
Asegurándome de entender: Dada una cuadrícula con algunas celdas no transitables, ¿encuentra una ruta hamiltoniana que se ajuste a las celdas precargadas?
Geobits
@AmiRuse Wow. Eso se ve complicado. (Por supuesto, esto proviene de una persona que odia la edición de fotos). Es bueno saber de alguien más que tiene un personaje VG como logotipo. : O
kirbyfan64sos
¿Podemos ver una solución para el ejemplo? Más ejemplos también serán útiles.
Kade
Brillante :). También podría tener un desafío de generador más tarde
Beta Decay
3
¿Se podría simplificar el método de entrada? ¿Tal vez usar una matriz 2D de enteros, y -1ser un muro y 0un espacio en blanco? Eso facilitaría concentrarse en el verdadero desafío del rompecabezas, y luego no hay complejidad de rellenar números con ceros o cadenas de análisis.
mbomb007

Respuestas:

1

JavaScript (Node.js) , 482 bytes

Esta es una solución de fuerza bruta, comienza en 01y comprueba cada celda vecina buscando celdas vacías ( --) o el número deseado y siguiendo el camino hacia la finalización o imposibilidad. Si el número deseado existe y no es vecino, abrevia esta solución. Toma unos segundos para la cuadrícula más grande.

Esto probablemente no sea particularmente interesante, ¡pero pensé que intentaría hacer una solución antes de mirar las respuestas vinculadas en el Código de Rosetta y disfruté abordar un desafío un poco más difícil!

Encuentra todas las soluciones cuando existen muchas . El cuerpo es una función que acepta una matriz bidimensional y el pie de página procesa la entrada al formato deseado, y también devuelve el resultado al formato deseado. Feliz de proporcionar más información (y una implementación menos golfizada si hay interés).

f=a=>{F=(D,n,j)=>[Z=[].concat(...D),z=Z.indexOf(j),z>-1&&[x=z%w,y=z/w|0],z>-1&&[[x-1,y-1],[x,y-1],[x+1,y-1],[x-1,y],[x+1,y],[x-1,y+1],[x,y+1],[x+1,y+1]]][n];C=q=>q.map(Q=>Q.slice());w=a[0][L='length'];l=F(a,0).filter(c=>c!='XX')[L];R=[];r=(s,d)=>{let n=`0${+s+1}`.slice(-2);N=F(d,2,n);n>l?R.push(C(d)):~F(d,1,s)?(p=F(d,3,s),p.filter(P=>P==N+'')[L]?r(n,C(d)):!~F(d,1,n)?p.map(I=>{[x,y]=I,(x<0||x>w-1||y<0||y>d[L]-1)||d[y][x]=='--'&&(D=C(d),r(D[y][x]=n,D))}):0):0};r('01',a);return R}

Pruébalo en línea!

Dom Hastings
fuente