Kebutuhan yang sangat umum dalam kelas algoritme dan ilmu komputer secara umum adalah untuk mengulangi 4 arah secara grid atau matriks (seperti dalam BFS atau DFS). Ini tampaknya sering menghasilkan banyak kode kikuk dan verbose dengan banyak aritmatika dan perbandingan dalam loop. Saya telah melihat banyak pendekatan berbeda dalam hal ini, tetapi saya tidak dapat menghilangkan perasaan bahwa ada cara yang lebih ringkas untuk melakukan ini.
Tantangannya adalah untuk menulis fungsi murni yang, mengingat lebar dan tinggi bidang hingga yang n, mberasal dari titik (0,0), dan koordinat (x,y)yang dapat mewakili titik yang valid di dalam bidang itu, mengembalikan objek yang dapat diubah dari semua titik di dalam pesawat yang arahnya 4 arah. berdekatan dengan(x,y) .
Tujuannya adalah untuk mendefinisikan fungsi itu dalam sesedikit mungkin byte.
Beberapa contoh untuk membantu menggambarkan input / output yang valid:
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)]
Dan inilah contoh (yang ini dengan Python) dari fungsi yang memenuhi persyaratan:
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
Contoh di atas mendefinisikan fungsi bernama, tetapi fungsi anonim juga dapat diterima.
Input n, m, x, yadalah semua bilangan bulat 32-bit yang tidak ditandatangani dalam rentang berikut:
n > 0
m > 0
0 <= x < m
0 <= y < n
Keluaran harus berbentuk iterable (namun bahasa pilihan Anda menentukan bahwa) dari (x, y) pasangan.
Klarifikasi tambahan:
Bilangan kompleks (dan representasi / serialisasi lainnya) boleh saja selama konsumen iterable dapat mengakses xdan ybilangan bulat hanya mengetahui lokasi mereka.
Indeks berbasis non-nol dapat diterima, tetapi hanya jika bahasa pilihan adalah bahasa non-nol-diindeks. Jika bahasa menggunakan campuran sistem penomoran, default ke sistem penomoran struktur data yang paling umum digunakan untuk mewakili sebuah matriks. Jika ini masih semua konsep asing dalam bahasa yang diberikan, indeks awal apa pun dapat diterima.
(x,y)itu sendiri di dalam kotak, kan?