Estás atrapado en este laberinto de 5x5: cada habitación está etiquetada del 1 al 25 y la salida está en la habitación 1.
Se le da como entrada la sala en la que se encuentra actualmente. Su tarea es generar la secuencia más corta de movimientos (norte, este, sur, oeste) necesaria para llegar a la sala 1.
Los movimientos se pueden generar en cualquier formato que desee (lista, cadena, matriz ...) siempre que utilice los caracteres n,w,e,s
.
Aquí están todos los casos de prueba:
1 => empty string/list
2 => w
3 => ww
4 => swwnw
5 => wswwnw
6 => seenwnw
7 => nw
8 => wnw
9 => wwnw
10 => swwnwnw
11 => eenwnw
12 => enwnw
13 => nwnw
14 => wnwnw
15 => wwnwnw
16 => enenwnw
17 => nenwnw
18 => wnenwnw
19 => nwnwnw
20 => wnwnwnw
21 => nenenwnw
22 => enwnenwnw
23 => nwnenwnw
24 => wnwnenwnw
25 => nwnwnwnw
¡La respuesta más corta en bytes gana!
code-golf
kolmogorov-complexity
Arnaud
fuente
fuente
Respuestas:
Python 2 , 64 bytes
Pruébalo en línea!
Una función que imprime una dirección por línea, terminando con error.
La constante
0x1211252b5375
codifica en la base 4 la dirección en lad
que viajamos desde cada número de habitación como un número del 0 al 3. El dígito de extracción>>2*n-4&3
también está diseñado para dar un error de desplazamiento negativo aln=1
terminar el código. Actualizamos el número de habitación an
través de un desplazamiento que se calcula desde la direcciónd
comod*3+d%2-5
, que asigna:fuente
try
/except
) para poder continuar la ejecución después de llamar a esta función.Python 2 ,
9593 bytesPruébalo en línea!
Podría reducir
32 bytes si se permite el etiquetado de sala indexada en 0.fuente
05AB1E ,
3029 bytes-1 byte gracias a una coincidencia milagrosa con números primos
Pruébalo en línea!
fuente
1
una entrada1
, en lugar de una cadena vacía (una solución fácil sería agregar un interlineadoõ?
). Aparte de eso, buena respuesta!Ruby ,
7262 bytesPruébalo en línea!
¿Cómo?
El truco aquí es usar 2 constantes para construir el siguiente paso para cada celda, y luego resolver el problema de forma recursiva.
Las 2 constantes 18139004 y 4267088 son cadenas binarias que dan la dirección del siguiente movimiento, extrayendo un solo bit de ambas para cada celda, podemos obtener:
Más fácil que desplazarse y enmascarar un solo número binario grande en mi humilde opinión.
Cuando obtenemos la dirección, extraemos la letra correspondiente de la cadena "en sw":
Y proceder recursivamente en la celda [n + x]
fuente
JavaScript (ES7),
6258 bytesLa respuesta del puerto de xnor .
Pruébalo en línea!
fuente
Perl 5 (
-n
), 94 bytes-5 bytes gracias a Grimy
TIO
fuente
Perl 5 , 79 bytes
Pruébalo en línea!
fuente
JavaScript,
807371 bytesAdaptado de la solución Python de Chas, así que por favor también a
+1
él.Pruébalo en línea!
1 byte guardado gracias a Arnauld .
fuente
Carbón ,
4340 bytesPruébalo en línea! El enlace es a la versión detallada del código. Basado en las respuestas de @ ChasBrown y @ xnor. Explicación:
Entra en la habitación.
Establezca la variable de bucle
i
en uno menos que el número de habitación y repita mientras no sea cero.Extraiga la dirección de la cadena comprimida
0113130113220112010102010
. (El inicio0
es solo un dígito de relleno).Imprime la dirección.
Use la fórmula de @ xnor para calcular el nuevo número de habitación.
fuente
Jalea ,
3029 bytesPruébalo en línea!
Un enlace monádico que toma la celda inicial y devuelve una cadena con las instrucciones.
¡Me encanta el hecho de que el diccionario de Jelly tiene una palabra como 'Kennesaw' (una ciudad al noroeste de Atlanta, Georgia), que se usa aquí porque indexarlo con
[5, 1, -5, -1] + 1
danesw
!Explicación
fuente
PHP , 110 bytes
Una solución que no es un puerto de gran respuesta de Chas Brown o gran respuesta de XNOR . ¡Sé que esto es más largo pero quería tener una solución diferente!
Pruébalo en línea!
He creado una cadena de mapeo que tiene 2 caracteres para cada celda en el tablero. El primer carácter para cada celda es un movimiento (n / e / s / w) o
0
el código ASCII mod 30 del segundo carácter devolverá otro número de celda que deberíamos seguir su movimiento en modo recursivo hasta que salgamos de la celda (cell < 2
).Por ejemplo para la entrada de 8:
8
son:w%
w
y continuar con movimientos para la celda de%
%
es 37, cuyo mod 30 será 7, por lo que la siguiente celda a seguir es7
.7
son:n
(el último carácter es espacio, código ASCII = 32)n
y continuar con movimientos para la celda de 32 mod 30 que es2
.2
son:w<
(código ASCII del último carácter = 60)w
y continuar con movimientos para la celda de 60 mod 30 que es0
.2
, ¡el ciclo se detiene!wnw
PHP , 75 bytes
Esta versión está escrita por Grimy , ¡es 35 bytes más corta que mi respuesta original porque él / ella es más inteligente! Comentario de Grimy: "4 * 25 <256, por lo que solo necesita 1 byte por celda, no 2"
Pruébalo en línea!
PHP , 71 bytes
Este puerto de la respuesta de Arnauld, que es el puerto de la respuesta de xnor , pero como un bucle en lugar de una función recursiva, ya que resulta ser más corto en PHP.
Pruébalo en línea!
fuente
C (clang) , 81 bytes
Pruébalo en línea!
Gracias a @ Tommylee2k sugerencia -8! + llamada recursiva
C (clang) , 90 bytes
Pruébalo en línea!
Similar a todas las soluciones no comprimidas.
fuente
v;f(p){for(;p-1;p+=v%5?6-v%8:v%2?5:-5)putchar(v="00wwswsnwwseenwwenwnwnenwn"[p]);}
05AB1E ,
4543 bytesPuerto de @ChasBrown Python 2 .
Pruébalo en línea o verifique todos los casos de prueba .
Explicación:
Vea este consejo 05AB1E mío (las cuatro secciones) para entender por qué
.•DUo¢ê`Ω÷‰₂¡)R€ûK•
es"a wwswsnwwseenwwenwnwnenwn"
;Ž₁9
es22449
;Ž₁9₂в
es[1,7,5,11]
; y'€Ã
es"news"
.fuente
western
es mejor. ; pBash , 120 bytes
Pruébalo en línea!
Jugué por un tiempo tratando de empacar la cadena como mordiscos, pero la decodificación requeriría más caracteres que el número guardado.
Cómo funciona:
La cadena $ S contiene un solo carácter (n, w, s, e) para cada habitación que muestra qué dirección tomar para mover una habitación hacia la salida, omitiendo las habitaciones 0 y 1.
La cadena $ N tiene el delta para sumar / restar del número de habitación actual para cada cambio de dirección (n: -5, w: -1, s: +5, e: +1)
Comience con $ i igual al número de habitación dado en la línea de comando ($ 1). Asigne el carácter en el índice $ i en la cadena $ S a $ d. Recupere el valor delta de $ N para la dirección a la siguiente habitación, asignándolo a $ j.
Imprima la siguiente dirección para obtener $ d.
Suma / resta el delta en $ j a / desde $ i.
Haga un bucle hasta que salgamos de la habitación # 2 (mientras $ i> 1).
fuente
Stax , 31 bytes
Ejecutar y depurarlo
fuente
Kotlin , 112 bytes
Pruébalo en línea!
fuente