Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Sep 20, 2025. It is now read-only.

Commit a8dafa4

Browse files
Day 21 Python solutions
1 parent a3b9c88 commit a8dafa4

File tree

2 files changed

+155
-0
lines changed

2 files changed

+155
-0
lines changed

‎21-1.py‎

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#!/usr/bin/env python
2+
3+
import re
4+
5+
monkeys = {}
6+
7+
class Monkey:
8+
def __init__(self, name, operation):
9+
number_format = re.compile("^(?P<num>[0-9]+)$")
10+
calc_format = re.compile("^(?P<m1>[a-z]+) (?P<op>[-+*/]) (?P<m2>[a-z]+)$")
11+
12+
self.operation = operation
13+
self.name = name
14+
self.val = None
15+
if (m := number_format.match(self.operation)):
16+
self.val = int(m["num"])
17+
else:
18+
m = calc_format.match(self.operation)
19+
self.m1 = m["m1"]
20+
self.op = m["op"]
21+
self.m2 = m["m2"]
22+
23+
def value(self):
24+
if self.val is not None:
25+
return self.val
26+
27+
if self.op == "+":
28+
self.val = monkeys[self.m1].value() + monkeys[self.m2].value()
29+
elif self.op == "-":
30+
self.val = monkeys[self.m1].value() - monkeys[self.m2].value()
31+
elif self.op == "*":
32+
self.val = monkeys[self.m1].value() * monkeys[self.m2].value()
33+
elif self.op == "/":
34+
self.val = monkeys[self.m1].value() // monkeys[self.m2].value()
35+
36+
return self.val
37+
38+
def __str__(self):
39+
return f"<{self.__class__.__name__}: {self.name} = {self.operation} ({self.val})>"
40+
41+
42+
monkey_format = re.compile("^(?P<name>[a-z]+): (?P<op>.*)$")
43+
44+
lines = [row.strip() for row in open("21.input").readlines()]
45+
46+
for line in lines:
47+
m = monkey_format.match(line)
48+
monkeys[m["name"]] = Monkey(m["name"], m["op"])
49+
50+
print(monkeys["root"].value())

‎21-2.py‎

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
#!/usr/bin/env python
2+
3+
import re
4+
5+
monkeys = {}
6+
7+
class IsHuman(RuntimeError):
8+
pass
9+
10+
class Monkey:
11+
setting = False
12+
13+
def __init__(self, name, operation):
14+
number_format = re.compile("^(?P<num>[0-9]+)$")
15+
calc_format = re.compile("^(?P<m1>[a-z]+) (?P<op>[-+*/]) (?P<m2>[a-z]+)$")
16+
17+
self.operation = operation
18+
self.name = name
19+
self.val = None
20+
if (m := number_format.match(self.operation)):
21+
self.val = int(m["num"])
22+
else:
23+
m = calc_format.match(self.operation)
24+
self.m1 = m["m1"]
25+
self.op = m["op"]
26+
if self.name == "root":
27+
self.op = "=="
28+
self.m2 = m["m2"]
29+
30+
def value(self):
31+
if self.setting and self.name == "humn":
32+
raise IsHuman
33+
34+
if self.val is not None:
35+
return self.val
36+
37+
if self.op == "+":
38+
self.val = monkeys[self.m1].value() + monkeys[self.m2].value()
39+
elif self.op == "-":
40+
self.val = monkeys[self.m1].value() - monkeys[self.m2].value()
41+
elif self.op == "*":
42+
self.val = monkeys[self.m1].value() * monkeys[self.m2].value()
43+
elif self.op == "/":
44+
self.val = monkeys[self.m1].value() // monkeys[self.m2].value()
45+
46+
return self.val
47+
48+
def set_equal(self, value):
49+
if self.name == "humn":
50+
self.val = value
51+
return
52+
53+
try:
54+
left = monkeys[self.m1].value()
55+
except IsHuman:
56+
left = None
57+
58+
try:
59+
right = monkeys[self.m2].value()
60+
except IsHuman:
61+
right = None
62+
63+
if self.op == "==":
64+
if right is not None:
65+
monkeys[self.m1].set_equal(right)
66+
if left is not None:
67+
monkeys[self.m2].set_equal(left)
68+
elif self.op == "+":
69+
if right is not None:
70+
monkeys[self.m1].set_equal(value - right)
71+
if left is not None:
72+
monkeys[self.m2].set_equal(value - left)
73+
elif self.op == "-":
74+
if right is not None:
75+
monkeys[self.m1].set_equal(value + right)
76+
if left is not None:
77+
monkeys[self.m2].set_equal(left - value)
78+
elif self.op == "*":
79+
if right is not None:
80+
monkeys[self.m1].set_equal(value // right)
81+
if left is not None:
82+
monkeys[self.m2].set_equal(value // left)
83+
elif self.op == "/":
84+
if right is not None:
85+
monkeys[self.m1].set_equal(value * right)
86+
if left is not None:
87+
monkeys[self.m2].set_equal(left // value)
88+
89+
def __str__(self):
90+
return f"<{self.__class__.__name__}: {self.name} = {self.operation} ({self.val})>"
91+
92+
93+
monkey_format = re.compile("^(?P<name>[a-z]+): (?P<op>.*)$")
94+
95+
lines = [row.strip() for row in open("21.input").readlines()]
96+
97+
for line in lines:
98+
m = monkey_format.match(line)
99+
monkeys[m["name"]] = Monkey(m["name"], m["op"])
100+
101+
Monkey.setting = True
102+
monkeys["root"].set_equal(None)
103+
Monkey.setting = False
104+
105+
print(monkeys["humn"].value())

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /