Дуже поширеною потребою в класах алгоритмів та інформатики взагалі є ітерація в 4 напрямках по сітці або матриці (наприклад, у 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)
сама знаходиться у прямокутнику, правда?