Una necessità molto comune nelle classi di algoritmi e nell'informatica in generale è quella di iterare in senso 4 su una griglia o matrice (come in BFS o DFS). Ciò sembra tradursi spesso in un sacco di codice goffo e dettagliato con molta aritmetica e confronti all'interno dei cicli. Ho visto molti approcci diversi a questo, ma non riesco a scuotere la sensazione che ci sia un modo più conciso per farlo.
La sfida è scrivere una funzione pura che, data la larghezza e l'altezza di un piano finito che ha n, morigine nel punto (0,0), e le coordinate (x,y)che possono rappresentare qualsiasi punto valido all'interno di quel piano, restituisce un oggetto iterabile di tutti i punti all'interno del piano che sono in 4 direzioni adiacente a (x,y).
L'obiettivo è definire quella funzione nel minor numero di byte possibile.
Alcuni esempi per aiutare a illustrare input / output validi:
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)]
Ed ecco un esempio (questo in Python) di una funzione che soddisfa le condizioni:
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
L'esempio sopra ha definito una funzione con nome, ma sono accettabili anche funzioni anonime.
Gli ingressi n, m, x, ysono tutti numeri interi a 32 bit senza segno nei seguenti intervalli:
n > 0
m > 0
0 <= x < m
0 <= y < n
L'output deve assumere la forma di un iterabile (tuttavia la lingua scelta lo definisce) di (x, y) coppie.
Ulteriori chiarimenti:
I numeri complessi (e altre rappresentazioni / serializzazioni) sono OK fintanto che il consumatore dell'iterabile può accedere xe ycome numeri interi che conoscono solo la loro posizione.
Gli indici non basati su zero sono accettabili, ma solo se la lingua scelta è una lingua non indicizzata su zero. Se la lingua utilizza una combinazione di sistemi di numerazione, per impostazione predefinita viene utilizzato il sistema di numerazione della struttura dei dati più comunemente usato per rappresentare una matrice. Se questi sono ancora tutti concetti estranei nella lingua data, qualsiasi indice di partenza è accettabile.
(x,y)si trova nel rettangolo, giusto?