알고리즘 클래스와 컴퓨터 과학에서 일반적으로 필요한 것은 그리드 나 매트릭스 (예 : BFS 또는 DFS)에서 4 방향으로 반복하는 것입니다. 이것은 종종 루프 내에서 많은 산술과 비교를 통해 많은 어수선하고 장황한 코드를 생성하는 것으로 보입니다. 나는 이것에 대한 많은 다른 접근법을 보았지만, 이것을하는 더 간결한 방법이 있다는 느낌을 흔들 수 없습니다.
문제는 n, m
point (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)]
그리고 여기 조건을 만족시키는 함수의 예 (파이썬에서는이 예제)가 있습니다 :
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) 쌍의 이터 러블 (선택한 언어가 정의하는) 형식을 가져야합니다.
추가 설명 :
iterable의 소비자가 액세스 할 수 x
있고 y
자신의 위치 만 아는 정수 라면 복소수 (및 기타 표현 / 직렬화)는 괜찮 습니다.
0이 아닌 인덱스는 허용되지만 선택한 언어가 0이 아닌 인덱스 언어 인 경우에만 허용됩니다. 언어에서 여러 번호 매기기 시스템을 사용하는 경우 기본적으로 행렬을 나타내는 데 가장 일반적으로 사용되는 데이터 구조의 번호 매기기 시스템이 사용됩니다. 이것이 주어진 언어로 여전히 모든 외국 개념이라면 시작 색인이 허용됩니다.
(x,y)
자체가 사각형 안에 있다고 보장합니다 .