Compare commits

...

4 commits

4 changed files with 1774 additions and 0 deletions

89
2023/d18/ex1/ex1.py Executable file
View file

@ -0,0 +1,89 @@
#!/usr/bin/env python
import itertools
import sys
from enum import StrEnum
from typing import NamedTuple
class Point(NamedTuple):
x: int
y: int
class Direction(StrEnum):
UP = "U"
DOWN = "D"
LEFT = "L"
RIGHT = "R"
def apply(self, pos: Point, n: int = 1) -> Point:
DIRECTIONS = {
"U": Point(-1, 0),
"D": Point(1, 0),
"L": Point(0, -1),
"R": Point(0, 1),
}
dx, dy = DIRECTIONS[self.value]
return Point(pos.x + dx * n, pos.y + dy * n)
DigPlanStep = tuple[Direction, int]
DigPlan = list[DigPlanStep]
def solve(input: list[str]) -> int:
def parse_line(line: str) -> DigPlanStep:
dir, n, _ = line.split()
return Direction(dir), int(n)
def parse(input: list[str]) -> DigPlan:
return list(map(parse_line, input))
def dig_trench(plan: DigPlan) -> list[Point]:
points = [Point(0, 0)]
for direction, n in plan:
points.append(direction.apply(points[-1], n))
# The trench should loop back to the start, make sure we don't count it twice
if points[-1] == Point(0, 0):
del points[-1]
return points
def lagoon_volume(trench: list[Point]) -> int:
def shoelace_area(points: list[Point]) -> int:
# Must be integer because pipes follow the grid, and can't cut squares in half
return abs(
sum(
(points[i - 1].x * points[i].y) - (points[i].x * points[i - 1].y)
for i in range(len(points))
)
// 2
)
def perimeter(points: list[Point]) -> int:
res = 0
for p, n in itertools.pairwise(itertools.chain(points, [points[0]])):
res += abs(n.x - p.x) + abs(n.y - p.y)
return res
area = shoelace_area(trench)
trench_points = perimeter(trench)
interior_points = area - trench_points // 2 + 1
return interior_points + trench_points
plan = parse(input)
trench = dig_trench(plan)
return lagoon_volume(list(trench))
def main() -> None:
input = sys.stdin.read().splitlines()
print(solve(input))
if __name__ == "__main__":
main()

794
2023/d18/ex1/input Normal file
View file

@ -0,0 +1,794 @@
R 4 (#4b18e0)
U 4 (#0b4f93)
R 4 (#6d70b0)
U 12 (#86edc3)
R 4 (#435460)
U 3 (#07f023)
R 8 (#33dd00)
U 5 (#599aa3)
L 11 (#83c702)
U 5 (#3f0501)
L 7 (#4bf232)
U 9 (#3f0503)
L 2 (#4955d2)
U 5 (#24f2e3)
L 9 (#16abf2)
U 6 (#60f753)
L 3 (#678dd2)
U 3 (#736093)
L 3 (#007482)
D 7 (#446e11)
L 6 (#0482a2)
D 8 (#997fd1)
L 4 (#4891e2)
D 6 (#2547b1)
L 5 (#501bf2)
D 8 (#7ed033)
L 8 (#0dabe2)
U 8 (#7184d3)
L 2 (#748a42)
U 5 (#12e093)
L 7 (#672432)
D 7 (#19c6a3)
L 4 (#1c5c22)
D 2 (#6e8a23)
L 10 (#5cd602)
U 9 (#1d8ff3)
L 7 (#359ce2)
U 6 (#333143)
R 11 (#0422f2)
D 10 (#235323)
R 6 (#64bc72)
U 10 (#6ea5f3)
R 11 (#68df60)
U 10 (#0952c3)
L 4 (#5206d2)
U 6 (#09c2a3)
L 5 (#45f7e0)
U 6 (#6d15e3)
L 6 (#271740)
D 6 (#6d15e1)
L 7 (#2e6a20)
U 9 (#178883)
L 9 (#430370)
U 4 (#2ee7e3)
L 7 (#8bdcf0)
D 9 (#5cebd3)
L 3 (#3d5a50)
D 4 (#5ecc23)
L 8 (#095b52)
U 9 (#3b7121)
L 10 (#8061b2)
U 4 (#3b7123)
L 7 (#209272)
U 4 (#493833)
L 9 (#7d9b02)
U 5 (#283633)
L 3 (#0db702)
U 3 (#437d73)
L 14 (#721282)
U 4 (#059a63)
L 2 (#4630d2)
U 5 (#6c5f43)
L 13 (#2949c2)
U 3 (#590a93)
R 5 (#4f5650)
U 5 (#71c3e3)
L 8 (#308540)
D 15 (#4fbc53)
L 2 (#4fa760)
U 15 (#41d523)
L 8 (#6bd380)
U 6 (#5cb553)
R 6 (#76acc0)
U 10 (#6be3a3)
R 6 (#5d61b0)
D 10 (#6dd101)
R 4 (#04f600)
U 4 (#4ea101)
R 2 (#6c2630)
U 5 (#498ac1)
R 5 (#0667a0)
U 5 (#120ef3)
R 3 (#31c080)
U 5 (#861cd3)
R 11 (#364e90)
D 5 (#6dd103)
R 9 (#6fe5b0)
D 11 (#119d43)
R 6 (#111310)
D 14 (#2ff323)
R 7 (#177432)
U 12 (#0ccbd3)
R 2 (#77c592)
U 9 (#6eee43)
R 10 (#21e622)
U 8 (#0bc513)
L 8 (#5398a0)
U 2 (#53cca3)
L 10 (#463c20)
U 5 (#53cca1)
R 8 (#174b20)
U 11 (#09ddc3)
R 6 (#20c940)
U 11 (#2fc6c3)
R 8 (#7ab1b0)
U 6 (#7ab291)
R 3 (#057160)
U 6 (#008331)
R 11 (#62c440)
U 12 (#3233a1)
R 2 (#1ceaa0)
U 4 (#4ef663)
R 3 (#7e5670)
U 2 (#4ef661)
R 5 (#3ccc40)
U 8 (#6e3531)
L 13 (#3964a0)
U 5 (#68b801)
R 13 (#83d220)
U 5 (#459901)
R 2 (#053a70)
U 6 (#4d18d3)
R 11 (#8a23d0)
U 8 (#4d18d1)
R 9 (#2cce90)
D 14 (#48af61)
L 6 (#045500)
D 6 (#0b4971)
L 8 (#18fa70)
D 7 (#7d8d03)
L 3 (#6ba530)
D 9 (#061783)
R 9 (#2c9c30)
D 13 (#402993)
R 8 (#18e9c0)
D 7 (#51e7a3)
R 15 (#18e9c2)
D 3 (#0ae133)
R 5 (#4929f0)
D 3 (#8d4623)
R 4 (#277680)
U 11 (#034583)
R 7 (#1ea1a0)
D 11 (#6cc5e3)
R 8 (#8894e0)
U 5 (#2fc6c1)
R 6 (#4dd6d0)
U 3 (#7f5b21)
R 11 (#219440)
U 4 (#2db8a1)
R 6 (#4053a0)
U 6 (#2df7e1)
R 12 (#086710)
U 8 (#47c7c1)
R 4 (#41ee90)
U 3 (#1dfa61)
R 3 (#5c3610)
U 7 (#483023)
R 10 (#2b6060)
D 3 (#327133)
R 8 (#2e4b30)
D 14 (#212321)
R 8 (#4bfd00)
D 5 (#5f0b81)
R 4 (#718450)
D 14 (#320dd1)
R 5 (#103630)
D 6 (#911953)
R 4 (#3f6190)
D 7 (#212323)
L 4 (#7f84b0)
D 10 (#2816a1)
R 5 (#026f80)
D 2 (#528ab1)
R 8 (#04e160)
D 11 (#655ca3)
R 2 (#0a1bf0)
D 3 (#6872c3)
R 12 (#7ad510)
D 8 (#72fe63)
R 7 (#109a50)
D 9 (#66ae31)
R 3 (#0828a2)
D 12 (#039eb1)
R 8 (#6f2c60)
D 6 (#46dae1)
R 12 (#76c900)
D 8 (#724711)
L 10 (#0a41a0)
D 8 (#73f301)
L 2 (#029092)
D 5 (#2ee5b3)
R 9 (#794702)
U 9 (#2ee5b1)
R 9 (#745f72)
U 2 (#108e61)
R 4 (#30e792)
U 10 (#099281)
R 11 (#347f32)
U 4 (#319ab1)
L 5 (#44a712)
U 9 (#623681)
L 6 (#3b5002)
U 10 (#25e431)
R 6 (#4f3f22)
U 4 (#226f51)
R 5 (#26f7b2)
U 8 (#588341)
R 4 (#09de02)
D 11 (#423f21)
L 6 (#6c9ee2)
D 10 (#423f23)
R 6 (#3badf2)
D 4 (#2c0a93)
R 4 (#521a32)
U 7 (#4ee803)
R 15 (#47f6d2)
U 2 (#673651)
R 4 (#5c10b2)
U 9 (#4dc641)
L 11 (#4d7032)
U 6 (#299111)
L 8 (#8d06b2)
U 8 (#22e4d1)
L 7 (#7dac02)
U 4 (#58e171)
L 7 (#17e332)
D 12 (#211931)
L 4 (#7e1732)
D 5 (#502911)
L 4 (#88c6c2)
D 5 (#430ba1)
L 3 (#3e4de0)
D 13 (#481b11)
L 5 (#5925e0)
U 4 (#1cecb1)
L 7 (#11ecf0)
U 7 (#634bc1)
R 7 (#6218d2)
U 7 (#7990f3)
L 5 (#576b42)
U 4 (#7990f1)
L 10 (#145832)
U 9 (#609ef1)
L 3 (#0d8822)
U 4 (#2b1f83)
L 3 (#77a562)
U 5 (#2b1f81)
L 6 (#3d05c2)
U 7 (#4b56d1)
L 5 (#1f6272)
U 8 (#916891)
R 6 (#087ce0)
U 6 (#2cf203)
R 12 (#285e60)
U 9 (#6ae623)
R 9 (#8a34a0)
U 9 (#6ae621)
L 9 (#15b200)
U 11 (#40c541)
R 5 (#0c7fc0)
D 7 (#2d5ad3)
R 9 (#42f280)
D 7 (#8140a3)
R 3 (#255770)
D 10 (#8140a1)
R 12 (#4ac260)
D 5 (#2d5ad1)
R 8 (#083780)
U 15 (#40c543)
R 7 (#028ab0)
U 13 (#2cf201)
R 5 (#1461d0)
U 2 (#23bff1)
R 4 (#1a4992)
U 3 (#355fc1)
R 7 (#6cafd2)
U 5 (#355fc3)
R 6 (#226752)
D 6 (#5af021)
R 11 (#526e82)
D 6 (#055ac1)
R 4 (#460a42)
D 3 (#055ac3)
R 6 (#565542)
D 3 (#3cd6a1)
L 7 (#2da922)
D 10 (#708ea3)
R 7 (#687472)
D 4 (#4ec333)
R 4 (#58d602)
U 7 (#4dd3e3)
R 3 (#23a7c0)
U 10 (#51fa83)
R 5 (#23a7c2)
D 5 (#188363)
R 14 (#5bc432)
U 4 (#3f0d23)
R 8 (#27a940)
U 3 (#62a3a3)
R 10 (#27a942)
U 6 (#0ceab3)
R 2 (#4479c2)
U 12 (#8beb63)
L 2 (#0b84a2)
U 3 (#3aa313)
L 7 (#270672)
U 15 (#4bd563)
L 5 (#4d8072)
U 6 (#045183)
R 12 (#08fed2)
U 11 (#52d323)
R 2 (#050992)
U 9 (#618533)
R 4 (#17a282)
D 7 (#08e921)
R 3 (#1a0d22)
D 6 (#0e8541)
R 11 (#61b232)
D 7 (#6635f1)
R 5 (#617832)
D 5 (#08f4f3)
R 2 (#490c22)
D 3 (#234821)
R 3 (#476942)
D 12 (#234823)
R 11 (#31b6d2)
D 4 (#08f4f1)
L 6 (#129582)
D 6 (#507ed1)
R 6 (#1e7010)
D 8 (#5490e1)
R 10 (#093bb0)
D 4 (#7cefc1)
R 9 (#6fe430)
D 3 (#0160b1)
L 8 (#1a8570)
D 2 (#2722f3)
L 4 (#2eb860)
D 12 (#572d83)
L 7 (#556c20)
U 12 (#50d5c1)
L 6 (#3a0932)
D 3 (#0a1701)
L 6 (#2294f0)
D 4 (#5f04e1)
L 13 (#62c590)
D 7 (#5f04e3)
R 6 (#1660e0)
D 2 (#34e001)
R 6 (#23b340)
D 12 (#1e92e1)
R 6 (#786d10)
U 12 (#44f8d1)
R 4 (#786d12)
D 3 (#3f6cf1)
R 3 (#2e2812)
D 3 (#185ac3)
R 3 (#7976e2)
D 14 (#0a5201)
R 4 (#15e3e2)
D 3 (#825221)
R 3 (#699e12)
U 3 (#8ca423)
R 14 (#04ffb2)
U 3 (#185ac1)
R 2 (#0a3482)
U 4 (#59d541)
L 10 (#5b8ab2)
U 4 (#59d543)
L 6 (#395af2)
U 3 (#2fdcb1)
R 7 (#1d5670)
U 3 (#3801c1)
R 6 (#65de30)
U 7 (#522db1)
R 11 (#9a9020)
U 12 (#382413)
R 11 (#55b6c0)
U 8 (#382411)
L 4 (#4549e0)
U 7 (#2f1091)
L 7 (#127550)
U 7 (#3e2ee1)
R 7 (#1b7ba0)
U 5 (#0177e1)
L 10 (#581e30)
U 4 (#0177e3)
L 8 (#287b30)
U 5 (#4667a1)
R 6 (#3a6730)
U 6 (#7575e1)
R 6 (#4d8f90)
U 8 (#06a251)
R 2 (#32a980)
U 5 (#92bbf3)
R 3 (#465200)
D 4 (#1e82a3)
R 7 (#5e49b0)
U 4 (#282471)
R 6 (#95ba62)
U 3 (#3fc1e1)
R 3 (#95ba60)
U 9 (#495841)
R 3 (#3bece0)
D 13 (#06a253)
R 3 (#58ed10)
D 4 (#3c4df3)
R 7 (#830800)
D 10 (#3c4df1)
R 4 (#39bca0)
D 4 (#0e26a1)
R 6 (#09cd40)
D 6 (#725971)
R 10 (#624800)
D 11 (#49ae11)
R 11 (#3ed060)
D 7 (#49ae13)
L 12 (#3e0b20)
D 4 (#569191)
L 3 (#1bb070)
D 7 (#0b1803)
L 10 (#045fa0)
U 6 (#8cb0a3)
L 7 (#57ca40)
D 6 (#146f43)
L 9 (#5ad0b0)
D 3 (#22f873)
R 10 (#249e42)
D 5 (#429003)
R 11 (#35bf52)
D 7 (#162bc1)
R 7 (#5689a2)
D 10 (#162bc3)
R 12 (#286a32)
D 9 (#54b443)
R 10 (#505c32)
D 3 (#831903)
R 7 (#003ab0)
D 11 (#6a9af3)
R 10 (#39f710)
U 11 (#1f31b3)
R 5 (#6fc5c0)
D 4 (#071b73)
R 7 (#3fe110)
D 9 (#5fd6e3)
R 9 (#3fd500)
D 3 (#2fc9b3)
R 6 (#727a40)
D 7 (#531d23)
R 14 (#02afc0)
D 6 (#1e5cb1)
R 4 (#717490)
D 12 (#6efba1)
R 11 (#5996f0)
U 5 (#763861)
L 5 (#444cf0)
U 8 (#763863)
R 7 (#2e2c60)
U 7 (#543fa1)
L 7 (#95e230)
U 3 (#543fa3)
R 5 (#41fd20)
U 3 (#19bf61)
R 5 (#656540)
D 7 (#391283)
R 4 (#33ebc0)
D 13 (#391281)
R 9 (#709320)
D 6 (#498291)
R 3 (#03c942)
D 6 (#3391a1)
R 6 (#5a83e2)
D 5 (#4eaff1)
R 7 (#2ca112)
D 4 (#2de1c1)
L 6 (#8724f0)
D 9 (#4b7fc1)
L 5 (#005232)
U 9 (#322291)
L 7 (#6a7682)
D 4 (#5d2381)
L 5 (#6e5312)
U 13 (#5d2383)
L 8 (#4a5e52)
D 13 (#61a5a1)
L 3 (#2adb12)
D 6 (#1056e3)
L 3 (#74eb12)
U 10 (#1056e1)
L 12 (#4c3122)
D 9 (#02d251)
R 9 (#30a702)
D 7 (#7cd9f1)
R 10 (#56a522)
D 6 (#25e4f1)
R 7 (#720682)
D 3 (#11a711)
R 10 (#4810c0)
U 9 (#7233d1)
R 13 (#47d8b0)
D 5 (#222c51)
R 6 (#270630)
U 9 (#6c2991)
R 5 (#251ce0)
D 9 (#0ce373)
R 5 (#0f3af0)
D 4 (#234033)
L 13 (#399410)
D 3 (#1091f3)
L 11 (#12ab92)
D 3 (#2c05c3)
L 9 (#53cc00)
D 5 (#662eb3)
R 3 (#53cc02)
D 3 (#19fbf3)
R 8 (#12ab90)
D 11 (#13a3c3)
R 10 (#6b7ed0)
D 7 (#480071)
L 10 (#39ba10)
D 12 (#414181)
L 11 (#6be3c0)
D 4 (#308403)
L 4 (#5081d2)
U 3 (#4a1c33)
L 6 (#412360)
U 11 (#5cad03)
L 4 (#412362)
U 11 (#1670a3)
L 8 (#5081d0)
U 7 (#36b3f3)
L 8 (#4a86c0)
D 7 (#1903f1)
L 11 (#5aa690)
U 9 (#88cd01)
L 3 (#3843d0)
U 14 (#4c44d1)
L 8 (#92ea62)
D 5 (#205b31)
L 14 (#2d2130)
D 4 (#1600d1)
L 2 (#5eed20)
D 8 (#504601)
L 9 (#4238f2)
D 10 (#8a3821)
L 3 (#524dd2)
D 6 (#8a3823)
L 3 (#106f82)
U 8 (#3d0d81)
L 6 (#1ec032)
U 6 (#040993)
L 4 (#1ff1d2)
D 14 (#17b973)
L 3 (#3c2ae2)
D 7 (#7c2501)
L 7 (#633cd2)
D 4 (#6530d3)
L 3 (#082de2)
D 7 (#16f433)
L 13 (#89eb52)
D 5 (#17b971)
L 3 (#252512)
U 15 (#040991)
L 2 (#90d092)
U 10 (#0a1021)
L 8 (#1cd900)
U 6 (#4a13d1)
R 10 (#7a6bf2)
U 4 (#4683c1)
R 7 (#7a6bf0)
D 11 (#3a66f1)
R 8 (#488f20)
U 11 (#7135a1)
R 5 (#4cc380)
U 5 (#0bf121)
R 3 (#4c2e80)
U 2 (#7908a1)
R 3 (#259e00)
U 10 (#6bafe3)
L 5 (#52e6d0)
U 4 (#506603)
L 6 (#1fec10)
D 7 (#3a1983)
R 6 (#389e30)
D 2 (#2f7281)
L 6 (#55f170)
D 7 (#4cb8e1)
L 5 (#389e30)
U 6 (#2642e1)
L 10 (#7394e0)
U 3 (#642bf1)
R 10 (#7394e2)
U 7 (#132c01)
L 6 (#3c4a80)
D 4 (#3e4d21)
L 4 (#989ad0)
U 7 (#473211)
L 8 (#0aa900)
D 6 (#3a8a11)
L 12 (#4307a2)
D 9 (#13b0c1)
L 6 (#7e59a2)
D 11 (#00a041)
L 3 (#44b0d2)
D 6 (#0efc51)
L 6 (#8a1302)
D 9 (#160fa1)
L 4 (#4afa62)
D 2 (#68e871)
L 14 (#5ecd60)
D 5 (#6a51d1)
L 5 (#764000)
D 8 (#1a6d61)
L 4 (#713042)
D 14 (#0b92e1)
L 5 (#5b77e2)
D 3 (#0a0581)
R 10 (#212752)
D 3 (#0a0583)
R 14 (#3f0ca2)
D 8 (#13d911)
R 3 (#307832)
D 4 (#72d201)
R 6 (#133522)
U 13 (#6e4581)
R 4 (#70fe22)
D 13 (#082221)
R 7 (#44fff2)
D 4 (#731171)
R 3 (#10eda2)
D 9 (#0e5d31)
L 14 (#37bc32)
D 6 (#3852c3)
L 7 (#5f43c2)
U 13 (#8c7593)
L 9 (#2ff4f2)
U 10 (#1787b3)
L 13 (#68b4a2)
U 3 (#15fd23)
L 3 (#515622)
U 3 (#618313)
L 11 (#2d09d2)
U 10 (#6bb2f3)
L 5 (#1f22a2)
U 10 (#4d8e33)
L 6 (#1cb690)
U 3 (#09c3b3)
L 9 (#214c20)
U 9 (#5bfe23)
L 9 (#848910)
U 10 (#1a73e3)
L 10 (#3d9252)
U 3 (#089003)
R 11 (#7ddbb2)
U 8 (#20c473)
R 15 (#071dc2)
U 7 (#554823)
R 13 (#0cfb42)
U 7 (#1ccaa1)
L 15 (#847822)
U 8 (#5f0271)
L 4 (#03cdd2)
U 10 (#4f69b1)
L 3 (#4b1902)
U 8 (#8129b1)
L 4 (#5e69f2)
D 5 (#1f33b3)
L 5 (#2e2582)
D 13 (#67aea3)
L 4 (#54aba2)
U 3 (#08d7a3)
L 4 (#4eebe0)
D 8 (#030763)
L 9 (#2d4760)
D 14 (#79e223)
L 9 (#7c3342)
D 3 (#334c93)
L 4 (#2b0202)
D 9 (#04d053)
L 2 (#1475a2)
D 7 (#8aed93)
L 8 (#62b4f2)
D 5 (#14c931)
R 11 (#29bc82)
D 3 (#65a951)
R 12 (#656f62)
D 3 (#7a7283)
L 8 (#2bec52)
D 7 (#1a75a3)
L 8 (#988402)
D 4 (#1a75a1)
L 3 (#1aad22)
D 9 (#373923)
L 10 (#7e3ef0)
U 7 (#3e1c93)
L 11 (#3f89d0)
U 6 (#3e1c91)
L 3 (#652e40)
D 9 (#35acc3)
L 7 (#5b0fa0)
U 4 (#46ca63)
L 10 (#079fa0)
U 7 (#391523)
L 3 (#079fa2)
U 3 (#585573)
L 8 (#1f43e0)
D 2 (#403c21)
L 9 (#144b10)
D 5 (#8fa921)
L 5 (#144b12)
U 7 (#084fb1)
L 4 (#661600)
D 6 (#5e06f3)
L 13 (#3f87a0)
D 8 (#3ca8a1)
L 13 (#4214e0)
D 10 (#567b51)
R 4 (#7a3080)
D 8 (#17de11)
R 8 (#644090)
D 12 (#55ba83)
R 3 (#025e60)
D 8 (#554783)
R 6 (#0d2eb0)
D 10 (#552813)
L 6 (#61a7d0)
D 10 (#272cb3)
L 7 (#34d6a0)
D 3 (#36cf03)
R 11 (#14be00)
D 3 (#52b543)
R 4 (#1fa362)
D 11 (#713693)
L 3 (#652112)
D 8 (#5c8463)
L 12 (#4c1362)
D 4 (#66e201)
L 8 (#07caa2)
D 9 (#6ccbd1)
L 3 (#3b9ee2)
D 5 (#5798b1)
L 13 (#4fb342)
U 6 (#231223)
L 2 (#33e3b2)
U 5 (#022ea3)
L 6 (#3f1112)
U 6 (#3dde83)
L 6 (#2732a0)
U 8 (#1e6bc3)
L 8 (#10f4e0)
U 15 (#45e363)
L 3 (#10f4e2)
U 4 (#4c9523)
R 11 (#2732a2)
U 12 (#174303)
L 10 (#5b4532)
U 13 (#6195e1)
L 8 (#7fab60)
U 2 (#1e7dd1)
L 2 (#7fab62)
U 12 (#4da741)
L 4 (#09efc2)
D 5 (#3d0d83)
L 5 (#47d532)
U 6 (#1f7441)
L 12 (#558832)
D 6 (#24e093)
L 4 (#20bfc2)
U 6 (#606283)
L 11 (#639142)
U 2 (#854311)
L 5 (#318ff2)
D 8 (#7037c1)
L 12 (#1ee752)
U 5 (#6bad43)
L 5 (#662cd2)
U 6 (#23fec3)
L 6 (#11cec2)
U 9 (#0c5b23)
L 8 (#91c052)
U 3 (#62e783)
L 6 (#08ee02)
U 11 (#11a283)

97
2023/d18/ex2/ex2.py Executable file
View file

@ -0,0 +1,97 @@
#!/usr/bin/env python
import itertools
import sys
from enum import StrEnum
from typing import NamedTuple
class Point(NamedTuple):
x: int
y: int
class Direction(StrEnum):
UP = "U"
DOWN = "D"
LEFT = "L"
RIGHT = "R"
def apply(self, pos: Point, n: int = 1) -> Point:
DIRECTIONS = {
"U": Point(-1, 0),
"D": Point(1, 0),
"L": Point(0, -1),
"R": Point(0, 1),
}
dx, dy = DIRECTIONS[self.value]
return Point(pos.x + dx * n, pos.y + dy * n)
DigPlanStep = tuple[Direction, int]
DigPlan = list[DigPlanStep]
def solve(input: list[str]) -> int:
def parse_line(line: str) -> DigPlanStep:
_, _, color = line.split()
color = color[2:-1]
n = color[:-1]
dir = {
"0": "R",
"1": "D",
"2": "L",
"3": "U",
}[color[-1]]
return Direction(dir), int(n, base=16)
def parse(input: list[str]) -> DigPlan:
return list(map(parse_line, input))
def dig_trench(plan: DigPlan) -> list[Point]:
points = [Point(0, 0)]
for direction, n in plan:
points.append(direction.apply(points[-1], n))
# The trench should loop back to the start, make sure we don't count it twice
if points[-1] == Point(0, 0):
del points[-1]
return points
def lagoon_volume(trench: list[Point]) -> int:
def shoelace_area(points: list[Point]) -> int:
# Must be integer because pipes follow the grid, and can't cut squares in half
return abs(
sum(
(points[i - 1].x * points[i].y) - (points[i].x * points[i - 1].y)
for i in range(len(points))
)
// 2
)
def perimeter(points: list[Point]) -> int:
res = 0
for p, n in itertools.pairwise(itertools.chain(points, [points[0]])):
res += abs(n.x - p.x) + abs(n.y - p.y)
return res
area = shoelace_area(trench)
trench_points = perimeter(trench)
interior_points = area - trench_points // 2 + 1
return interior_points + trench_points
plan = parse(input)
trench = dig_trench(plan)
return lagoon_volume(list(trench))
def main() -> None:
input = sys.stdin.read().splitlines()
print(solve(input))
if __name__ == "__main__":
main()

794
2023/d18/ex2/input Normal file
View file

@ -0,0 +1,794 @@
R 4 (#4b18e0)
U 4 (#0b4f93)
R 4 (#6d70b0)
U 12 (#86edc3)
R 4 (#435460)
U 3 (#07f023)
R 8 (#33dd00)
U 5 (#599aa3)
L 11 (#83c702)
U 5 (#3f0501)
L 7 (#4bf232)
U 9 (#3f0503)
L 2 (#4955d2)
U 5 (#24f2e3)
L 9 (#16abf2)
U 6 (#60f753)
L 3 (#678dd2)
U 3 (#736093)
L 3 (#007482)
D 7 (#446e11)
L 6 (#0482a2)
D 8 (#997fd1)
L 4 (#4891e2)
D 6 (#2547b1)
L 5 (#501bf2)
D 8 (#7ed033)
L 8 (#0dabe2)
U 8 (#7184d3)
L 2 (#748a42)
U 5 (#12e093)
L 7 (#672432)
D 7 (#19c6a3)
L 4 (#1c5c22)
D 2 (#6e8a23)
L 10 (#5cd602)
U 9 (#1d8ff3)
L 7 (#359ce2)
U 6 (#333143)
R 11 (#0422f2)
D 10 (#235323)
R 6 (#64bc72)
U 10 (#6ea5f3)
R 11 (#68df60)
U 10 (#0952c3)
L 4 (#5206d2)
U 6 (#09c2a3)
L 5 (#45f7e0)
U 6 (#6d15e3)
L 6 (#271740)
D 6 (#6d15e1)
L 7 (#2e6a20)
U 9 (#178883)
L 9 (#430370)
U 4 (#2ee7e3)
L 7 (#8bdcf0)
D 9 (#5cebd3)
L 3 (#3d5a50)
D 4 (#5ecc23)
L 8 (#095b52)
U 9 (#3b7121)
L 10 (#8061b2)
U 4 (#3b7123)
L 7 (#209272)
U 4 (#493833)
L 9 (#7d9b02)
U 5 (#283633)
L 3 (#0db702)
U 3 (#437d73)
L 14 (#721282)
U 4 (#059a63)
L 2 (#4630d2)
U 5 (#6c5f43)
L 13 (#2949c2)
U 3 (#590a93)
R 5 (#4f5650)
U 5 (#71c3e3)
L 8 (#308540)
D 15 (#4fbc53)
L 2 (#4fa760)
U 15 (#41d523)
L 8 (#6bd380)
U 6 (#5cb553)
R 6 (#76acc0)
U 10 (#6be3a3)
R 6 (#5d61b0)
D 10 (#6dd101)
R 4 (#04f600)
U 4 (#4ea101)
R 2 (#6c2630)
U 5 (#498ac1)
R 5 (#0667a0)
U 5 (#120ef3)
R 3 (#31c080)
U 5 (#861cd3)
R 11 (#364e90)
D 5 (#6dd103)
R 9 (#6fe5b0)
D 11 (#119d43)
R 6 (#111310)
D 14 (#2ff323)
R 7 (#177432)
U 12 (#0ccbd3)
R 2 (#77c592)
U 9 (#6eee43)
R 10 (#21e622)
U 8 (#0bc513)
L 8 (#5398a0)
U 2 (#53cca3)
L 10 (#463c20)
U 5 (#53cca1)
R 8 (#174b20)
U 11 (#09ddc3)
R 6 (#20c940)
U 11 (#2fc6c3)
R 8 (#7ab1b0)
U 6 (#7ab291)
R 3 (#057160)
U 6 (#008331)
R 11 (#62c440)
U 12 (#3233a1)
R 2 (#1ceaa0)
U 4 (#4ef663)
R 3 (#7e5670)
U 2 (#4ef661)
R 5 (#3ccc40)
U 8 (#6e3531)
L 13 (#3964a0)
U 5 (#68b801)
R 13 (#83d220)
U 5 (#459901)
R 2 (#053a70)
U 6 (#4d18d3)
R 11 (#8a23d0)
U 8 (#4d18d1)
R 9 (#2cce90)
D 14 (#48af61)
L 6 (#045500)
D 6 (#0b4971)
L 8 (#18fa70)
D 7 (#7d8d03)
L 3 (#6ba530)
D 9 (#061783)
R 9 (#2c9c30)
D 13 (#402993)
R 8 (#18e9c0)
D 7 (#51e7a3)
R 15 (#18e9c2)
D 3 (#0ae133)
R 5 (#4929f0)
D 3 (#8d4623)
R 4 (#277680)
U 11 (#034583)
R 7 (#1ea1a0)
D 11 (#6cc5e3)
R 8 (#8894e0)
U 5 (#2fc6c1)
R 6 (#4dd6d0)
U 3 (#7f5b21)
R 11 (#219440)
U 4 (#2db8a1)
R 6 (#4053a0)
U 6 (#2df7e1)
R 12 (#086710)
U 8 (#47c7c1)
R 4 (#41ee90)
U 3 (#1dfa61)
R 3 (#5c3610)
U 7 (#483023)
R 10 (#2b6060)
D 3 (#327133)
R 8 (#2e4b30)
D 14 (#212321)
R 8 (#4bfd00)
D 5 (#5f0b81)
R 4 (#718450)
D 14 (#320dd1)
R 5 (#103630)
D 6 (#911953)
R 4 (#3f6190)
D 7 (#212323)
L 4 (#7f84b0)
D 10 (#2816a1)
R 5 (#026f80)
D 2 (#528ab1)
R 8 (#04e160)
D 11 (#655ca3)
R 2 (#0a1bf0)
D 3 (#6872c3)
R 12 (#7ad510)
D 8 (#72fe63)
R 7 (#109a50)
D 9 (#66ae31)
R 3 (#0828a2)
D 12 (#039eb1)
R 8 (#6f2c60)
D 6 (#46dae1)
R 12 (#76c900)
D 8 (#724711)
L 10 (#0a41a0)
D 8 (#73f301)
L 2 (#029092)
D 5 (#2ee5b3)
R 9 (#794702)
U 9 (#2ee5b1)
R 9 (#745f72)
U 2 (#108e61)
R 4 (#30e792)
U 10 (#099281)
R 11 (#347f32)
U 4 (#319ab1)
L 5 (#44a712)
U 9 (#623681)
L 6 (#3b5002)
U 10 (#25e431)
R 6 (#4f3f22)
U 4 (#226f51)
R 5 (#26f7b2)
U 8 (#588341)
R 4 (#09de02)
D 11 (#423f21)
L 6 (#6c9ee2)
D 10 (#423f23)
R 6 (#3badf2)
D 4 (#2c0a93)
R 4 (#521a32)
U 7 (#4ee803)
R 15 (#47f6d2)
U 2 (#673651)
R 4 (#5c10b2)
U 9 (#4dc641)
L 11 (#4d7032)
U 6 (#299111)
L 8 (#8d06b2)
U 8 (#22e4d1)
L 7 (#7dac02)
U 4 (#58e171)
L 7 (#17e332)
D 12 (#211931)
L 4 (#7e1732)
D 5 (#502911)
L 4 (#88c6c2)
D 5 (#430ba1)
L 3 (#3e4de0)
D 13 (#481b11)
L 5 (#5925e0)
U 4 (#1cecb1)
L 7 (#11ecf0)
U 7 (#634bc1)
R 7 (#6218d2)
U 7 (#7990f3)
L 5 (#576b42)
U 4 (#7990f1)
L 10 (#145832)
U 9 (#609ef1)
L 3 (#0d8822)
U 4 (#2b1f83)
L 3 (#77a562)
U 5 (#2b1f81)
L 6 (#3d05c2)
U 7 (#4b56d1)
L 5 (#1f6272)
U 8 (#916891)
R 6 (#087ce0)
U 6 (#2cf203)
R 12 (#285e60)
U 9 (#6ae623)
R 9 (#8a34a0)
U 9 (#6ae621)
L 9 (#15b200)
U 11 (#40c541)
R 5 (#0c7fc0)
D 7 (#2d5ad3)
R 9 (#42f280)
D 7 (#8140a3)
R 3 (#255770)
D 10 (#8140a1)
R 12 (#4ac260)
D 5 (#2d5ad1)
R 8 (#083780)
U 15 (#40c543)
R 7 (#028ab0)
U 13 (#2cf201)
R 5 (#1461d0)
U 2 (#23bff1)
R 4 (#1a4992)
U 3 (#355fc1)
R 7 (#6cafd2)
U 5 (#355fc3)
R 6 (#226752)
D 6 (#5af021)
R 11 (#526e82)
D 6 (#055ac1)
R 4 (#460a42)
D 3 (#055ac3)
R 6 (#565542)
D 3 (#3cd6a1)
L 7 (#2da922)
D 10 (#708ea3)
R 7 (#687472)
D 4 (#4ec333)
R 4 (#58d602)
U 7 (#4dd3e3)
R 3 (#23a7c0)
U 10 (#51fa83)
R 5 (#23a7c2)
D 5 (#188363)
R 14 (#5bc432)
U 4 (#3f0d23)
R 8 (#27a940)
U 3 (#62a3a3)
R 10 (#27a942)
U 6 (#0ceab3)
R 2 (#4479c2)
U 12 (#8beb63)
L 2 (#0b84a2)
U 3 (#3aa313)
L 7 (#270672)
U 15 (#4bd563)
L 5 (#4d8072)
U 6 (#045183)
R 12 (#08fed2)
U 11 (#52d323)
R 2 (#050992)
U 9 (#618533)
R 4 (#17a282)
D 7 (#08e921)
R 3 (#1a0d22)
D 6 (#0e8541)
R 11 (#61b232)
D 7 (#6635f1)
R 5 (#617832)
D 5 (#08f4f3)
R 2 (#490c22)
D 3 (#234821)
R 3 (#476942)
D 12 (#234823)
R 11 (#31b6d2)
D 4 (#08f4f1)
L 6 (#129582)
D 6 (#507ed1)
R 6 (#1e7010)
D 8 (#5490e1)
R 10 (#093bb0)
D 4 (#7cefc1)
R 9 (#6fe430)
D 3 (#0160b1)
L 8 (#1a8570)
D 2 (#2722f3)
L 4 (#2eb860)
D 12 (#572d83)
L 7 (#556c20)
U 12 (#50d5c1)
L 6 (#3a0932)
D 3 (#0a1701)
L 6 (#2294f0)
D 4 (#5f04e1)
L 13 (#62c590)
D 7 (#5f04e3)
R 6 (#1660e0)
D 2 (#34e001)
R 6 (#23b340)
D 12 (#1e92e1)
R 6 (#786d10)
U 12 (#44f8d1)
R 4 (#786d12)
D 3 (#3f6cf1)
R 3 (#2e2812)
D 3 (#185ac3)
R 3 (#7976e2)
D 14 (#0a5201)
R 4 (#15e3e2)
D 3 (#825221)
R 3 (#699e12)
U 3 (#8ca423)
R 14 (#04ffb2)
U 3 (#185ac1)
R 2 (#0a3482)
U 4 (#59d541)
L 10 (#5b8ab2)
U 4 (#59d543)
L 6 (#395af2)
U 3 (#2fdcb1)
R 7 (#1d5670)
U 3 (#3801c1)
R 6 (#65de30)
U 7 (#522db1)
R 11 (#9a9020)
U 12 (#382413)
R 11 (#55b6c0)
U 8 (#382411)
L 4 (#4549e0)
U 7 (#2f1091)
L 7 (#127550)
U 7 (#3e2ee1)
R 7 (#1b7ba0)
U 5 (#0177e1)
L 10 (#581e30)
U 4 (#0177e3)
L 8 (#287b30)
U 5 (#4667a1)
R 6 (#3a6730)
U 6 (#7575e1)
R 6 (#4d8f90)
U 8 (#06a251)
R 2 (#32a980)
U 5 (#92bbf3)
R 3 (#465200)
D 4 (#1e82a3)
R 7 (#5e49b0)
U 4 (#282471)
R 6 (#95ba62)
U 3 (#3fc1e1)
R 3 (#95ba60)
U 9 (#495841)
R 3 (#3bece0)
D 13 (#06a253)
R 3 (#58ed10)
D 4 (#3c4df3)
R 7 (#830800)
D 10 (#3c4df1)
R 4 (#39bca0)
D 4 (#0e26a1)
R 6 (#09cd40)
D 6 (#725971)
R 10 (#624800)
D 11 (#49ae11)
R 11 (#3ed060)
D 7 (#49ae13)
L 12 (#3e0b20)
D 4 (#569191)
L 3 (#1bb070)
D 7 (#0b1803)
L 10 (#045fa0)
U 6 (#8cb0a3)
L 7 (#57ca40)
D 6 (#146f43)
L 9 (#5ad0b0)
D 3 (#22f873)
R 10 (#249e42)
D 5 (#429003)
R 11 (#35bf52)
D 7 (#162bc1)
R 7 (#5689a2)
D 10 (#162bc3)
R 12 (#286a32)
D 9 (#54b443)
R 10 (#505c32)
D 3 (#831903)
R 7 (#003ab0)
D 11 (#6a9af3)
R 10 (#39f710)
U 11 (#1f31b3)
R 5 (#6fc5c0)
D 4 (#071b73)
R 7 (#3fe110)
D 9 (#5fd6e3)
R 9 (#3fd500)
D 3 (#2fc9b3)
R 6 (#727a40)
D 7 (#531d23)
R 14 (#02afc0)
D 6 (#1e5cb1)
R 4 (#717490)
D 12 (#6efba1)
R 11 (#5996f0)
U 5 (#763861)
L 5 (#444cf0)
U 8 (#763863)
R 7 (#2e2c60)
U 7 (#543fa1)
L 7 (#95e230)
U 3 (#543fa3)
R 5 (#41fd20)
U 3 (#19bf61)
R 5 (#656540)
D 7 (#391283)
R 4 (#33ebc0)
D 13 (#391281)
R 9 (#709320)
D 6 (#498291)
R 3 (#03c942)
D 6 (#3391a1)
R 6 (#5a83e2)
D 5 (#4eaff1)
R 7 (#2ca112)
D 4 (#2de1c1)
L 6 (#8724f0)
D 9 (#4b7fc1)
L 5 (#005232)
U 9 (#322291)
L 7 (#6a7682)
D 4 (#5d2381)
L 5 (#6e5312)
U 13 (#5d2383)
L 8 (#4a5e52)
D 13 (#61a5a1)
L 3 (#2adb12)
D 6 (#1056e3)
L 3 (#74eb12)
U 10 (#1056e1)
L 12 (#4c3122)
D 9 (#02d251)
R 9 (#30a702)
D 7 (#7cd9f1)
R 10 (#56a522)
D 6 (#25e4f1)
R 7 (#720682)
D 3 (#11a711)
R 10 (#4810c0)
U 9 (#7233d1)
R 13 (#47d8b0)
D 5 (#222c51)
R 6 (#270630)
U 9 (#6c2991)
R 5 (#251ce0)
D 9 (#0ce373)
R 5 (#0f3af0)
D 4 (#234033)
L 13 (#399410)
D 3 (#1091f3)
L 11 (#12ab92)
D 3 (#2c05c3)
L 9 (#53cc00)
D 5 (#662eb3)
R 3 (#53cc02)
D 3 (#19fbf3)
R 8 (#12ab90)
D 11 (#13a3c3)
R 10 (#6b7ed0)
D 7 (#480071)
L 10 (#39ba10)
D 12 (#414181)
L 11 (#6be3c0)
D 4 (#308403)
L 4 (#5081d2)
U 3 (#4a1c33)
L 6 (#412360)
U 11 (#5cad03)
L 4 (#412362)
U 11 (#1670a3)
L 8 (#5081d0)
U 7 (#36b3f3)
L 8 (#4a86c0)
D 7 (#1903f1)
L 11 (#5aa690)
U 9 (#88cd01)
L 3 (#3843d0)
U 14 (#4c44d1)
L 8 (#92ea62)
D 5 (#205b31)
L 14 (#2d2130)
D 4 (#1600d1)
L 2 (#5eed20)
D 8 (#504601)
L 9 (#4238f2)
D 10 (#8a3821)
L 3 (#524dd2)
D 6 (#8a3823)
L 3 (#106f82)
U 8 (#3d0d81)
L 6 (#1ec032)
U 6 (#040993)
L 4 (#1ff1d2)
D 14 (#17b973)
L 3 (#3c2ae2)
D 7 (#7c2501)
L 7 (#633cd2)
D 4 (#6530d3)
L 3 (#082de2)
D 7 (#16f433)
L 13 (#89eb52)
D 5 (#17b971)
L 3 (#252512)
U 15 (#040991)
L 2 (#90d092)
U 10 (#0a1021)
L 8 (#1cd900)
U 6 (#4a13d1)
R 10 (#7a6bf2)
U 4 (#4683c1)
R 7 (#7a6bf0)
D 11 (#3a66f1)
R 8 (#488f20)
U 11 (#7135a1)
R 5 (#4cc380)
U 5 (#0bf121)
R 3 (#4c2e80)
U 2 (#7908a1)
R 3 (#259e00)
U 10 (#6bafe3)
L 5 (#52e6d0)
U 4 (#506603)
L 6 (#1fec10)
D 7 (#3a1983)
R 6 (#389e30)
D 2 (#2f7281)
L 6 (#55f170)
D 7 (#4cb8e1)
L 5 (#389e30)
U 6 (#2642e1)
L 10 (#7394e0)
U 3 (#642bf1)
R 10 (#7394e2)
U 7 (#132c01)
L 6 (#3c4a80)
D 4 (#3e4d21)
L 4 (#989ad0)
U 7 (#473211)
L 8 (#0aa900)
D 6 (#3a8a11)
L 12 (#4307a2)
D 9 (#13b0c1)
L 6 (#7e59a2)
D 11 (#00a041)
L 3 (#44b0d2)
D 6 (#0efc51)
L 6 (#8a1302)
D 9 (#160fa1)
L 4 (#4afa62)
D 2 (#68e871)
L 14 (#5ecd60)
D 5 (#6a51d1)
L 5 (#764000)
D 8 (#1a6d61)
L 4 (#713042)
D 14 (#0b92e1)
L 5 (#5b77e2)
D 3 (#0a0581)
R 10 (#212752)
D 3 (#0a0583)
R 14 (#3f0ca2)
D 8 (#13d911)
R 3 (#307832)
D 4 (#72d201)
R 6 (#133522)
U 13 (#6e4581)
R 4 (#70fe22)
D 13 (#082221)
R 7 (#44fff2)
D 4 (#731171)
R 3 (#10eda2)
D 9 (#0e5d31)
L 14 (#37bc32)
D 6 (#3852c3)
L 7 (#5f43c2)
U 13 (#8c7593)
L 9 (#2ff4f2)
U 10 (#1787b3)
L 13 (#68b4a2)
U 3 (#15fd23)
L 3 (#515622)
U 3 (#618313)
L 11 (#2d09d2)
U 10 (#6bb2f3)
L 5 (#1f22a2)
U 10 (#4d8e33)
L 6 (#1cb690)
U 3 (#09c3b3)
L 9 (#214c20)
U 9 (#5bfe23)
L 9 (#848910)
U 10 (#1a73e3)
L 10 (#3d9252)
U 3 (#089003)
R 11 (#7ddbb2)
U 8 (#20c473)
R 15 (#071dc2)
U 7 (#554823)
R 13 (#0cfb42)
U 7 (#1ccaa1)
L 15 (#847822)
U 8 (#5f0271)
L 4 (#03cdd2)
U 10 (#4f69b1)
L 3 (#4b1902)
U 8 (#8129b1)
L 4 (#5e69f2)
D 5 (#1f33b3)
L 5 (#2e2582)
D 13 (#67aea3)
L 4 (#54aba2)
U 3 (#08d7a3)
L 4 (#4eebe0)
D 8 (#030763)
L 9 (#2d4760)
D 14 (#79e223)
L 9 (#7c3342)
D 3 (#334c93)
L 4 (#2b0202)
D 9 (#04d053)
L 2 (#1475a2)
D 7 (#8aed93)
L 8 (#62b4f2)
D 5 (#14c931)
R 11 (#29bc82)
D 3 (#65a951)
R 12 (#656f62)
D 3 (#7a7283)
L 8 (#2bec52)
D 7 (#1a75a3)
L 8 (#988402)
D 4 (#1a75a1)
L 3 (#1aad22)
D 9 (#373923)
L 10 (#7e3ef0)
U 7 (#3e1c93)
L 11 (#3f89d0)
U 6 (#3e1c91)
L 3 (#652e40)
D 9 (#35acc3)
L 7 (#5b0fa0)
U 4 (#46ca63)
L 10 (#079fa0)
U 7 (#391523)
L 3 (#079fa2)
U 3 (#585573)
L 8 (#1f43e0)
D 2 (#403c21)
L 9 (#144b10)
D 5 (#8fa921)
L 5 (#144b12)
U 7 (#084fb1)
L 4 (#661600)
D 6 (#5e06f3)
L 13 (#3f87a0)
D 8 (#3ca8a1)
L 13 (#4214e0)
D 10 (#567b51)
R 4 (#7a3080)
D 8 (#17de11)
R 8 (#644090)
D 12 (#55ba83)
R 3 (#025e60)
D 8 (#554783)
R 6 (#0d2eb0)
D 10 (#552813)
L 6 (#61a7d0)
D 10 (#272cb3)
L 7 (#34d6a0)
D 3 (#36cf03)
R 11 (#14be00)
D 3 (#52b543)
R 4 (#1fa362)
D 11 (#713693)
L 3 (#652112)
D 8 (#5c8463)
L 12 (#4c1362)
D 4 (#66e201)
L 8 (#07caa2)
D 9 (#6ccbd1)
L 3 (#3b9ee2)
D 5 (#5798b1)
L 13 (#4fb342)
U 6 (#231223)
L 2 (#33e3b2)
U 5 (#022ea3)
L 6 (#3f1112)
U 6 (#3dde83)
L 6 (#2732a0)
U 8 (#1e6bc3)
L 8 (#10f4e0)
U 15 (#45e363)
L 3 (#10f4e2)
U 4 (#4c9523)
R 11 (#2732a2)
U 12 (#174303)
L 10 (#5b4532)
U 13 (#6195e1)
L 8 (#7fab60)
U 2 (#1e7dd1)
L 2 (#7fab62)
U 12 (#4da741)
L 4 (#09efc2)
D 5 (#3d0d83)
L 5 (#47d532)
U 6 (#1f7441)
L 12 (#558832)
D 6 (#24e093)
L 4 (#20bfc2)
U 6 (#606283)
L 11 (#639142)
U 2 (#854311)
L 5 (#318ff2)
D 8 (#7037c1)
L 12 (#1ee752)
U 5 (#6bad43)
L 5 (#662cd2)
U 6 (#23fec3)
L 6 (#11cec2)
U 9 (#0c5b23)
L 8 (#91c052)
U 3 (#62e783)
L 6 (#08ee02)
U 11 (#11a283)