Un besoin très courant dans les classes d'algorithmes et l'informatique en général est d'itérer dans 4 directions sur une grille ou une matrice (comme dans BFS ou DFS). Cela semble souvent entraîner beaucoup de code maladroit et verbeux avec beaucoup d'arithmétique et de comparaisons dans les boucles. J'ai vu de nombreuses approches différentes à ce sujet, mais je ne peux pas me départir du sentiment qu'il existe une façon plus concise de le faire.
Le défi est d'écrire une fonction pure qui, étant donné la largeur et la hauteur d'un plan fini n, m
originaire d'un point (0,0)
, et les coordonnées (x,y)
qui peuvent représenter n'importe quel point valide dans ce plan, renvoie un objet itérable de tous les points dans le plan qui sont dans 4 directions adjacent à (x,y)
.
Le but est de définir cette fonction en aussi peu d'octets que possible.
Quelques exemples pour illustrer une entrée / sortie valide:
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)]
Et voici un exemple (celui-ci en Python) d'une fonction qui remplit les conditions:
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'exemple ci-dessus a défini une fonction nommée, mais les fonctions anonymes sont également acceptables.
Les entrées n, m, x, y
sont toutes des entiers 32 bits non signés dans les plages suivantes:
n > 0
m > 0
0 <= x < m
0 <= y < n
La sortie doit prendre la forme d'un itérable (cependant votre langue de choix le définit) de paires (x, y).
Précisions supplémentaires:
Les nombres complexes (et autres représentations / sérialisations) sont OK tant que le consommateur de l'itérable peut accéder x
et en y
tant qu'entiers ne connaissant que leur emplacement.
Les index non basés sur zéro sont acceptables, mais uniquement si la langue de choix est une langue non indexée sur zéro. Si le langage utilise un mélange de systèmes de numérotation, choisissez par défaut le système de numérotation de la structure de données la plus couramment utilisée pour représenter une matrice. Si ce sont encore tous des concepts étrangers dans la langue donnée, tout indice de départ est acceptable.
(x,y)
lui - même est dans le rectangle, non?