Algoritma sınıflarında ve genel olarak bilgisayar bilimlerinde çok yaygın bir ihtiyaç, bir ızgara veya matris (BFS veya DFS gibi) üzerinde 4 yönlü olarak yinelemektir. Bu genellikle döngüler içinde çok sayıda aritmetik ve karşılaştırma ile çok fazla tıknaz ve ayrıntılı kodla sonuçlanır. Buna birçok farklı yaklaşım gördüm, ancak bunu yapmanın daha kısa bir yolu olduğu hissini sarsamıyorum.
Zorluk n, m, noktadan kaynaklanan sonlu bir düzlemin genişliği ve yüksekliği (0,0)ve (x,y)bu düzlemdeki herhangi bir geçerli noktayı temsil edebilen koordinatlar göz önüne alındığında, düzlem içindeki 4 yönlü olan tüm noktaların tekrarlanabilir bir nesnesini döndüren saf bir işlev yazmaktır. bitişik (x,y).
Amaç, bu işlevi olabildiğince az bayt olarak tanımlamaktır.
Geçerli girdi / çıktıyı göstermeye yardımcı olacak bazı örnekler:
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)]
Ve işte koşulları karşılayan bir fonksiyonun bir örneği (bu Python'da):
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
Yukarıdaki örnekte adlandırılmış bir işlev tanımlanmıştır, ancak anonim işlevler de kabul edilebilir.
Girişlerin n, m, x, ytümü, aşağıdaki aralıklardaki işaretsiz 32 bit tamsayılardır:
n > 0
m > 0
0 <= x < m
0 <= y < n
Çıktı, (x, y) çiftlerinin yinelenebilir (ancak seçtiğiniz dil bunu tanımlar) biçiminde olmalıdır.
Ek açıklamalar:
Karmaşık sayılar (ve diğer temsiller / serileştirmeler), yinelenebilir tüketicinin erişebildiği xvey yalnızca konumlarını bilen tamsayılar olarak uygundur.
Sıfır temelli olmayan dizinler kabul edilebilir, ancak yalnızca seçili dil sıfırlanmamış bir dilse. Dil, numaralandırma sistemlerinin bir karışımını kullanıyorsa, varsayılan olarak bir matrisi temsil etmek için en sık kullanılan veri yapısının numaralandırma sistemini kullanın. Bunların tümü hala verilen dilde yabancı kavramlarsa, herhangi bir başlangıç dizini kabul edilebilir.
(x,y)Kendisinin dikdörtgenin içinde olduğunu garanti ediyoruz , değil mi?