J, 28 caracteres
((C.!.2=_1^i.&0)&.".&.stdin''
El orden de entrada es de fila principal con filas que se leen alternativamente de izquierda a derecha y de derecha a izquierda en una sola ruta a través de la tabla. Asume que el cero pertenece a la esquina superior izquierda.
Uso en Windows:
<nul set /p="0 1 2 3 7 6 5 4 8 9 10 11 15 14 13 12" | jconsole c:\...\15.jhs
Explicación:
<nul set /p=
se usa para evitar una nueva línea en la entrada, que echo
produce que ".
no le gusta. Por supuesto, Unix es compatible echo /n
.
v&.".&.stdin''
lee "v bajo parse bajo stdin" que significa "entrada, luego analiza la entrada, luego hace v, luego deshace el análisis (= formato), luego deshace la entrada (= salida)". 1!:1]3
es un carácter más corto, pero no tiene un inverso definido.
C.!.2
significa "paridad de permutación". Devuelve 1
(paridad par) o _1
(paridad impar). Es decir,_1^inversions
_1^i.&0
significa "-1 a la potencia del índice de 0".
- entonces,
C.!.2=_1^i.&0
significa "¿la paridad de permutación es igual a la paridad de la posición del agujero?"
Esto funciona para un tablero de 4x4, pero si la posición final deseada es mayor de fila de izquierda a derecha, entonces la permutación para la posición resuelta tiene un número impar de inversiones y, por lo tanto, paridad impar. Además, la paridad se invierte (para cualquier orden de entrada) cuando la posición deseada del agujero se mueve desde la parte superior izquierda a la parte inferior derecha. En ambos casos, la solución es un carácter: agregue -
después =
para revertir la paridad esperada.
Prueba de corrección:
Después de cada movimiento, el cero intercambia una posición con algún número, cambiando la paridad de permutación. El cero también alterna entre las posiciones de tablero de ajedrez blanco y negro, indicado por posiciones pares e impares en el orden de entrada. Por lo tanto, esta condición es necesaria. También es suficiente por el argumento del conteo: es de conocimiento común que exactamente la mitad de las posiciones es solucionable. Esta condición filtra exactamente la mitad de las posibles posiciones.