In Algorithmenklassen und in der Informatik im Allgemeinen besteht eine sehr häufige Anforderung darin, über ein Gitter oder eine Matrix (wie in BFS oder DFS) in vier Richtungen zu iterieren. Dies scheint oft zu viel klobigem und ausführlichem Code mit viel Arithmetik und Vergleichen innerhalb von Schleifen zu führen. Ich habe viele verschiedene Ansätze gesehen, aber ich kann das Gefühl nicht loswerden, dass es einen präziseren Weg gibt, dies zu tun.
Die Herausforderung besteht darin, eine reine Funktion zu schreiben, die unter Berücksichtigung der Breite und Höhe einer endlichen Ebene mit n, mUrsprung in einem Punkt (0,0)und der Koordinaten (x,y), die einen gültigen Punkt in dieser Ebene darstellen können, ein iterierbares Objekt aller Punkte in der Ebene mit vier Richtungen zurückgibt angrenzend an (x,y).
Ziel ist es, diese Funktion in möglichst wenigen Bytes zu definieren.
Einige Beispiele zur Veranschaulichung der gültigen Eingabe / Ausgabe:
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)]
Und hier ist ein Beispiel (dieses in Python) für eine Funktion, die die folgenden Bedingungen erfüllt:
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
Im obigen Beispiel wurde eine benannte Funktion definiert, aber auch anonyme Funktionen sind zulässig.
Die Eingaben n, m, x, ysind alle vorzeichenlose 32-Bit-Ganzzahlen in den folgenden Bereichen:
n > 0
m > 0
0 <= x < m
0 <= y < n
Die Ausgabe muss die Form eines iterablen (wie auch immer Ihre gewählte Sprache dies definiert) von (x, y) Paaren haben.
Zusätzliche Erläuterungen:
Komplexe Zahlen (und andere Darstellungen / Serialisierungen) sind in Ordnung, solange der Konsument des Iterablen auf sie zugreifen kann xund yals ganze Zahlen nur ihren Standort kennen.
Nicht auf Null basierende Indizes sind zulässig, jedoch nur, wenn die gewählte Sprache eine nicht auf Null basierende Sprache ist. Wenn die Sprache eine Mischung aus Nummerierungssystemen verwendet, wird standardmäßig das Nummerierungssystem der Datenstruktur verwendet, die am häufigsten zur Darstellung einer Matrix verwendet wird. Wenn dies immer noch alles fremde Begriffe in der angegebenen Sprache sind, ist jeder Startindex akzeptabel.
(x,y)sich um ein Rechteck handelt, oder?