순열 플레이그라운드
값을 바꾸며 직접 움직여 보는 manim 스타일 실험실 · 각 탭 아래에 같은 장면을 만드는 manim 코드
설정
위에서부터 시계 방향으로 읽기
회전 버튼을 눌러 읽은 문자열을 모아 보기
계산
일렬로 세우는 경우 n!
회전하여 같은 배열 수 n
원순열 (n − 1)!
manim 코드로 만들어 보기 · CircleRotate
class CircleRotate(Scene):
def construct(self):
center = LEFT * 3.2 + DOWN * 0.1
theta = ValueTracker(0) # 회전 각도
people = VGroup()
for i, l in enumerate("ABCD"): # ← "ABCDE"로 바꾸면 5명
p = person(l, RED if l == "A" else BLUE)
p.add_updater(lambda m, i=i: m.move_to(
seat(center, 2.0, i, 4, theta.get_value())))
people.add(p)
self.play(FadeIn(table(center)), LaggedStart(*[GrowFromCenter(p) for p in people]))
for k in range(1, 4):
self.play(theta.animate.set_value(k * PI / 2)) # 90°씩 회전
로컬 실행: python -m manim -pqm scripts/w01_anim.py CircleRotate · 전체 코드 scripts/w01_anim.py
바꿔 볼 것: 사람 수를 5명으로 늘리고 회전 각도를 k * TAU / 5로 바꾸기
설정
후보는 0, 1, …, n − 1 · 같은 숫자를 다시 써도 되는 중복순열
계산
manim 코드로 만들어 보기 · Repeated
for L in range(3): # ← 깊이(비트 수)
n = 2 ** (L + 1) # ← 2 대신 3이면 삼진 트리
for k in range(n):
parent = prev[k // 2]
edges.add(Line(parent, p, color=LINE).set_z_index(-1))
nodes.add(VGroup(circle, T(str(k % 2), 26)))
self.play(Create(edges), LaggedStart(*[GrowFromCenter(nd) for nd in nodes]))
로컬 실행: python -m manim -pqm scripts/w01_anim.py Repeated
바꿔 볼 것: 가지 수를 3으로 바꿔 3 ** (L + 1), 부모 인덱스를 k // 3으로
나열할 문자 (최대 8글자)
계산
manim 코드로 만들어 보기 · SameThings
pattern = "abaab" # ← 다른 배열로 바꿔 보기
rows = VGroup()
for pa in permutations([1, 2, 3]): # a 3개의 첨자 순서 3! 가지
for pb in permutations([1, 2]): # b 2개의 첨자 순서 2! 가지
ia, ib = iter(pa), iter(pb)
rows.add(tile_row(pattern, [next(ia) if c == "a" else next(ib) for c in pattern]))
# 첨자를 지우면 12줄이 모두 같은 1줄로 합쳐짐
self.play(*[ReplacementTransform(r, plain.copy()) for r in rows])
로컬 실행: python -m manim -pqm scripts/w01_anim.py SameThings
설정
경로 = a, b 문자열
버튼을 눌러 보기
각 점까지의 경로 수 = 왼쪽 점 + 아래쪽 점 (파스칼 삼각형과 같은 규칙)
manim 코드로 만들어 보기 · ShortestPath
for d in range(7): # 대각선 순서로 채우기
for i in range(5): # ← 가로 4칸이면 range(5)
j = d - i
if 0 <= j <= 2: # ← 세로 2칸
v = comb(i + j, i) # 그 점까지의 최단 경로 수
labs.append(VGroup(bg, T(str(v), 24)))
self.play(LaggedStart(*[GrowFromCenter(l) for l in labs]))
로컬 실행: python -m manim -pqm scripts/w01_anim.py ShortestPath
바꿔 볼 것: 가로 5칸, 세로 3칸으로 늘리고 B 위치를 P(5, 3)으로