Очень распространенная потребность в классах алгоритмов и компьютерных науках в целом состоит в том, чтобы выполнять итерацию в четырех направлениях по сетке или матрице (например, в BFS или DFS). Это, кажется, часто приводит к большому количеству неуклюжего и многословного кода с большим количеством арифметики и сравнений внутри циклов. Я видел много разных подходов к этому, но я не могу избавиться от ощущения, что есть более краткий способ сделать это.
Задача состоит в том, чтобы написать чистую функцию, которая, учитывая ширину и высоту конечной плоскости, n, m
исходящей из точки (0,0)
, и координаты, (x,y)
которые могут представлять любую действительную точку в этой плоскости, возвращает итеративный объект всех точек в плоскости, которые направлены в 4 направлениях. рядом с (x,y)
.
Цель состоит в том, чтобы определить эту функцию как можно меньше байтов.
Некоторые примеры, которые помогут проиллюстрировать действительный ввод / вывод:
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)]
И вот пример (этот в Python) функции, которая удовлетворяет условиям:
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
В приведенном выше примере определена именованная функция, но также допустимы анонимные функции.
Входы n, m, x, y
представляют собой 32-разрядные целые числа без знака в следующих диапазонах:
n > 0
m > 0
0 <= x < m
0 <= y < n
Выходные данные должны принимать форму итерируемой (однако это зависит от выбранного вами языка) пары (x, y).
Дополнительные уточнения:
Комплексные числа (и другие представления / сериализации) в порядке, пока потребитель итерируемого может получить доступ x
и y
как целые числа, зная только их местоположение.
Индексы, не основанные на нулях, допустимы, но только в том случае, если выбранным языком является язык без нуля. Если язык использует сочетание систем нумерации, по умолчанию используется система нумерации структуры данных, наиболее часто используемая для представления матрицы. Если это все еще иностранные понятия в данном языке, любой начальный индекс приемлем.
(x,y)
он находится в прямоугольнике, верно?