Una necesidad muy común en las clases de algoritmos y la informática en general es iterar en 4 direcciones sobre una cuadrícula o matriz (como en BFS o DFS). Esto a menudo parece dar como resultado una gran cantidad de código torpe y detallado con mucha aritmética y comparaciones dentro de los bucles. He visto muchos enfoques diferentes para esto, pero no puedo evitar la sensación de que hay una forma más concisa de hacerlo.
El desafío es escribir una función pura que, dado el ancho y la altura de un plano finito que se n, m
origina en el punto (0,0)
, y las coordenadas (x,y)
que pueden representar cualquier punto válido dentro de ese plano, devuelva un objeto iterable de todos los puntos dentro del plano que sean 4 direcciones adyacente a (x,y)
.
El objetivo es definir esa función en la menor cantidad de bytes posible.
Algunos ejemplos para ayudar a ilustrar la entrada / salida válida:
n = 5 (y-axis), m = 3 (x-axis) (zero-based)
matrix = [
[A, B, C],
[D, E, F],
[G, H, I],
[J, K, L],
[M, N, O],
]
(x, y) => [valid iterable points]
E: (1, 1) => [(1, 0), (2, 1), (1, 2), (0, 1)]
A: (0, 0) => [(1, 0), (0, 1)]
L: (2, 3) => [(2, 2), (2, 4), (1, 3)]
N: (1, 4) => [(1, 3), (2, 4), (0, 4)]
n = 1 (y-axis), m = 1 (x-axis) (zero-based)
matrix = [
[A],
]
(x, y) => [valid iterable points]
A: (0, 0) => []
n = 2 (y-axis), m = 1 (x-axis) (zero-based)
matrix = [
[A],
[B],
]
(x, y) => [valid iterable points]
A: (0, 0) => [(0, 1)]
B: (0, 1) => [(0, 0)]
Y aquí hay un ejemplo (este en Python) de una función que satisface las condiciones:
def four_directions(x, y, n, m):
valid_coordinates = []
for xd, yd in [(1, 0), (0, 1), (-1, 0), (0, -1)]:
nx, ny = x + xd, y + yd
if 0 <= nx < m and 0 <= ny < n:
valid_coordinates.append((nx, ny))
return valid_coordinates
El ejemplo anterior definió una función con nombre, pero las funciones anónimas también son aceptables.
n, m, x, y
Todas las entradas son enteros de 32 bits sin signo dentro de los siguientes rangos:
n > 0
m > 0
0 <= x < m
0 <= y < n
La salida debe tomar la forma de un iterable (sin embargo, su lenguaje de elección define eso) de pares (x, y).
Aclaraciones adicionales:
Los números complejos (y otras representaciones / serializaciones) están bien siempre que el consumidor del iterable pueda acceder x
y y
como enteros conociendo solo su ubicación.
Los índices no basados en cero son aceptables, pero solo si el idioma de elección es un idioma no indexado en cero. Si el lenguaje usa una combinación de sistemas de numeración, el sistema de numeración de la estructura de datos más comúnmente usado para representar una matriz es el predeterminado. Si estos todavía son todos conceptos extraños en el idioma dado, cualquier índice inicial es aceptable.
(x,y)
está en el rectángulo, ¿verdad?