Desafío
Dado el tamaño de la cuadrícula, las posiciones de los obstáculos, la posición del jugador y la posición del objetivo, su tarea es encontrar un camino para que el jugador llegue al objetivo y evitar los obstáculos al mismo tiempo (si es necesario).
Entrada
- N : tamaño de cuadrícula
N x N
- P : posición del jugador
[playerposx, playerposy]
- T : posición del objetivo
[targetposx, targetposy]
- O : Posiciones de obstáculos
[[x1, y1], [x2, y2],...,[xn, yn]]
Salida
Ruta : Un jugador de ruta puede usar para alcanzar el objetivo.[[x1, y1], [x2, y2],...,[xn, yn]]
Reglas
- El punto
[0,0]
está en la esquina superior izquierda de la cuadrícula. - La posición del jugador siempre estará en el lado izquierdo de la cuadrícula.
- La posición del objetivo siempre estará en el lado derecho de la cuadrícula.
- La cuadrícula siempre tendrá al menos un obstáculo.
- Puede suponer que ningún obstáculo se superpone a la posición del jugador o del objetivo.
- No necesariamente necesita encontrar la ruta mínima.
- El jugador solo puede moverse hacia la izquierda, derecha, arriba y abajo, no en diagonal.
- Puede tomar la entrada de cualquier manera conveniente.
- Puede suponer que siempre existirá un camino para que el jugador llegue al objetivo.
- Obviamente, para cada entrada existen múltiples rutas válidas, elija una.
- Suponga
N > 2
que la cuadrícula será al menos3 x 3
.
Ejemplos
Entrada: 9
, [6, 0]
, [3, 8]
, [[0, 5], [2, 2], [6, 4], [8, 2], [8, 7]]
Posible salida:[[6, 0], [6, 1], [6, 2], [6, 3], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [5, 8], [4, 8], [3, 8]]
Entrada: 6
, [1, 0]
, [3, 5]
, [[1, 2], [2, 5], [5, 1]]
Posible salida:[[1, 0], [1, 1], [2, 1], [2, 2], [2, 3], [2, 4], [3, 4], [3, 5]]
Nota
Tenga en cuenta que X
es para filas y Y
para cols. No los confunda con las coordenadas en una imagen.
Editar
Como señaló @digEmAll, debido a las reglas #2
y #3
, playerY = 0
y targetY = N-1
. Entonces, si lo desea, puede tomar solo como entrada playerX
y y targetX
(si eso acorta su código).
fuente
Respuestas:
JavaScript (ES6), 135 bytes
Toma entrada como
(width, [target_x, target_y], obstacles)(source_x, source_y)
, donde los obstáculos son una serie de cadenas en"X,Y"
formato.Devuelve una matriz de cadenas en
"X,Y"
formato.Pruébalo en línea!
Comentado
fuente
R , 227 bytes
Pruébalo en línea!
No es realmente corto y definitivamente no da el camino más corto (por ejemplo, verifique el primer ejemplo).
Básicamente realiza una búsqueda recursiva de profundidad primero y se detiene tan pronto como se alcanza el objetivo, imprimiendo la ruta.
Gracias a JayCe por la mejora en el formato de salida
fuente
x1 y1 x2 y2 ... xn yn
: Dwrite(t(mx),1,N)
lugar de hacerloprint
:)Python 2 ,
151149 bytesPruébalo en línea!
fuente
Haskell ,
133131130 bytesPruébalo en línea! (con algunos casos de prueba)
Una función que
!
toma como entradan :: Int
tamaño de la cuadrículap :: [Int]
posición del jugador como una lista[xp, yp]
o :: [[Int]]
posición de obstáculos como una lista[[x1, y1], [x2, y2], ...]
t :: [[[Int]]]
(implícita) la posición del objetivo como una lista[[[xt, yt]]]
(lista triple solo por conveniencia)y devolver una ruta válida como una lista
[[xp, yp], [x1, y1], ..., [xt, yt]]
.Como beneficio adicional, encuentra (uno de) los caminos más cortos y funciona para la posición de cualquier jugador y objetivo. Por otro lado, es muy ineficiente (pero los ejemplos proporcionados se ejecutan en un período de tiempo razonable).
Explicación
iterate
[[xt, yt]]
La expresión aparentemente oscura
[id, map (+ 1)] <*> [[x - 1,y], [x, y - 1]]
es solo una versión "golfy" (-1 byte) de[[x + 1, y], [x, y + 1], [x - 1, y], [x, y - 1]]
.fuente
Retina 0.8.2 , 229 bytes
Pruébalo en línea! No estoy seguro si el formato de E / S califica. Explicación:
Duplicar cada celda. La copia izquierda se utiliza como área de trabajo temporal.
Marque el inicio del laberinto como visitado.
Marque el final del laberinto como vacío.
Si bien existen celdas de trabajo disponibles, apúntelas a celdas adyacentes visitadas previamente.
Trace el camino desde la salida hasta el inicio utilizando las celdas de trabajo como guía.
Eliminar las celdas de trabajo.
fuente
JavaScript, 450 bytes
Toma entrada como
(n, {playerx, playery}, {targetx, targety}, [{obstaclex, obstacley}])
. Devuelve una matriz de{hopx, hopy}
.Aquí hay una versión no ofuscada en mi desastre:
fuente