Premisa
Tan recientemente llegué media hora antes de la cita y decidí esperar afuera. También determiné que se vería extraño si me paraba inmóvil frente a la casa. Por lo tanto, decidí hacer una caminata rápida, dentro de un área limitada. También concluí que si comenzaba a caminar en círculos, sería obvio que estaba merodeando. Así que me inspiré para crear mi primer desafío de Code Golf.
Especificación
Se le dará una lista, un mapa del área, que contendrá " "
o "#"
, que representan espacios libres y obstáculos de algún tipo. Los espacios libres solo se pueden cruzar una vez, y se tarda 1 minuto en cruzarlos. Su posición inicial se indicará con una "@"
tradición per roguelike, y el objetivo se representará con un "$"
porque eso es lo que va a perder allí. También se le dará un número entero que representará la cantidad de minutos que tiene que perder antes de no parecer que estaba entrometiéndose. Cuando aterrizas en el"$"
, tendrá que haber sido la cantidad exacta de minutos (por lo tanto, si estaba haciendo la cuenta regresiva, tendrá que ser 1 en un mosaico adyacente y 0 en el mosaico). Siempre será posible llegar al destino. Su programa o función tendrá que devolver una lista que muestre la ruta más corta con <,>, ^ y v para representar las cuatro direcciones posibles.
Ejemplos
Entrada:
[[" ", " ", " ", " "],
["@", " ", " ", "$"],
[" ", " ", " ", " "],
[" ", " ", " ", " "]]
y
5
Ouput:
[[">", ">", ">", "v"],
["^", " ", " ", "$"],
[" ", " ", " ", " "],
[" ", " ", " ", " "]]
Entrada:
[[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "],
["@", "#", " ", "$", " "],
[" ", " ", " ", " ", " "],
[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "]]
y
7
Salida:
[[" ", "#", " ", " ", " "],
[" ", "#", ">", "v", " "],
["v", "#", "^", "$", " "],
[">", ">", "^", " ", " "],
[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "]]
Entrada:
[[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "],
["@", "#", " ", "$", " "],
[" ", " ", " ", " ", " "],
[" ", "#", " ", " ", " "],
[" ", "#", " ", " ", " "]]
y
17
Salida:
[[" ", "#", " ", "v", "<"],
[" ", "#", " ", "v", "^"],
["v", "#", " ", "$", "^"],
[">", ">", "v", ">", "^"],
[" ", "#", "v", "^", "<"],
[" ", "#", ">", ">", "^"]]
Reglas
- Se aplican lagunas estándar
- Cada ficha solo debe moverse una vez
- La cantidad exacta de tiempo debe gastarse en el tablero
- Solo se debe mostrar una ruta en el caso de múltiples rutas
- Esta es una pregunta de código de golf, por lo que la respuesta más corta gana
- Según la pregunta de user202729 en los comentarios, puede asumir una entrada válida.
Agregue un comentario si se requiere alguna aclaración adicional
fuente
Respuestas:
JavaScript (ES6), 171 bytes
Toma entrada en la sintaxis de curry
(a)(n)
. Salidas modificando la matriz de entrada.Pruébalo en línea!
Comentado
fuente
Python 2 ,
310256 bytesGracias @cairdcoinheringaahing por
except:0
-3 bytesGracias @Mnemonic por -8 bytes
Gracias @JonathanAllan por -3 bytes
Gracias @ovs por -5 bytes
Pruébalo en línea!
Alguna explicación:
try-except
se utiliza para asegurar que tantox
yy
coordenadas se encuentran en las fronteras. Se generará una excepción al acceder aG[y][x]
. Python es demasiado bueno y los índices negativos son aceptables, por lo quex>-1<y
se agrega el cheque .T=[r[:]for r in G]
usado para crear copias deG
por valores~-i/2
y~-(i^2)/2
se usan para generar pares(-1, 0), (0, 1), (0, -1), (1, 0)
, que solían moverse en la cuadrícula (¡todavía debería haber un camino más corto!)R+=[G]*(0==c<'$'==G[y][x])
comprobar, que'$'
se alcanza en el número requerido de pasos.R
se utiliza para obtener este resultado de llamadas a funciones recursivas.for i,y in enumerate(G):"@"in y>S(y.index("@"),i,G,L,R)
Encontradox
yy
de'@'
entrada y función de llamadaS
.print R[0]
R
podría contener más de una solución, por lo que la salida solo es primerofuente
if G[y][x]=='$':
conif'$'==G[y][x]:
.R+=(G[y][x]=='$')*(c==0)*[G]
por otro byte.if(x>-1<y)*(G[y][x]in' @'):
y+cmp(i%2,i/2)
seríay+~-(i^2)/2
; bien puede ser más corto aún.Python 2 ,
264261251249 bytesPruébalo en línea!
fuente