구현과 시뮬레이션 문서의 검증 코드다. if __name__ == "__main__": 아래가 자체 테스트다.
"""08.구현과 시뮬레이션 문서의 주장을 확인한다."""
import random
DR = [-1, 1, 0, 0]
DC = [0, 0, -1, 1]
def check(cond, msg):
if not cond:
raise AssertionError(msg)
def neighbors(r, c, n):
out = []
for d in range(4):
nr, nc = r + DR[d], c + DC[d]
if 0 <= nr < n and 0 <= nc < n:
out.append((nr, nc))
return out
def main():
# 예시 표
move = {"위": (-1, 0), "아래": (1, 0), "왼쪽": (0, -1), "오른쪽": (0, 1)}
r, c, n = 1, 1, 3
trail = []
for cmd in ["위", "위", "오른쪽"]:
nr, nc = r + move[cmd][0], c + move[cmd][1]
if 0 <= nr < n and 0 <= nc < n:
r, c = nr, nc
trail.append((r, c))
check(trail == [(0, 1), (0, 1), (0, 2)], "예시 표")
check(neighbors(1, 1, 3) == [(0, 1), (2, 1), (1, 0), (1, 2)], "이웃 네 칸")
check(neighbors(0, 3, 4) == [(1, 3), (0, 2)], "C1")
grid = [[1, 2], [3, 4]]
check(grid[-1] == [3, 4], "음수 번호는 오류 없이 끝 줄")
# 회전
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
check([list(x) for x in zip(*a[::-1])] == [[7, 4, 1], [8, 5, 2], [9, 6, 3]], "90도 회전")
check([list(x) for x in zip(*a)] == [[1, 4, 7], [2, 5, 8], [3, 6, 9]], "전치")
rng = random.Random(8)
for _ in range(500):
n = rng.randint(1, 6)
m = [[rng.randint(0, 9) for _ in range(n)] for _ in range(n)]
rot = [list(x) for x in zip(*m[::-1])]
for rr in range(n):
for cc in range(n):
check(rot[cc][n - 1 - rr] == m[rr][cc], "회전 공식")
b = [[1, 2, 3], [4, 5, 6]]
check([list(x) for x in zip(*b[::-1])] == [[4, 1], [5, 2], [6, 3]], "C3")
check(abs(0 - 2) + abs(1 - 0) == 3, "맨해튼 거리")
print("ALL CHECKS PASSED")
if __name__ == "__main__":
main()