summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Tom van der Lee <t0m.vd.l33@gmail.com>2022-12-28 13:31:29 +0100
committerGravatar Tom van der Lee <t0m.vd.l33@gmail.com>2022-12-28 13:31:29 +0100
commit1644c904de1544f788a8e88aa6c52bcd6a625b93 (patch)
tree9818613092865c6ca527329477f350731cc2d4c6
parentc22544594e251613a5dbf6c4ee505716867e55e6 (diff)
download2022-1644c904de1544f788a8e88aa6c52bcd6a625b93.tar.gz
2022-1644c904de1544f788a8e88aa6c52bcd6a625b93.tar.bz2
2022-1644c904de1544f788a8e88aa6c52bcd6a625b93.zip
Day 21 [WIP]main
-rw-r--r--aoc/decorators.py17
-rw-r--r--day21/__init__.py122
-rw-r--r--day21/example.txt15
-rw-r--r--day21/input.txt2727
4 files changed, 2879 insertions, 2 deletions
diff --git a/aoc/decorators.py b/aoc/decorators.py
index a31993a..42603c2 100644
--- a/aoc/decorators.py
+++ b/aoc/decorators.py
@@ -1,11 +1,15 @@
1# -*- coding: utf-8 -*- 1# -*- coding: utf-8 -*-
2from functools import wraps 2from functools import wraps
3from typing import Iterator, TypeVar, Callable 3from typing import Iterator, TypeVar, Callable, List
4 4
5T = TypeVar("T") 5T = TypeVar("T")
6I = TypeVar("I")
6 7
8AssignmentRun = Callable[[Iterator[I], ...], Iterator[T]]
9AssignmentRunList = Callable[[List[I], ...], Iterator[T]]
7 10
8def infinite_generator(func: Callable[[...], Iterator[T]]): 11
12def infinite_generator(func: AssignmentRun) -> AssignmentRun:
9 @wraps(func) 13 @wraps(func)
10 def wrapper(*args, **kwargs): 14 def wrapper(*args, **kwargs):
11 items = list(func(*args, **kwargs)) 15 items = list(func(*args, **kwargs))
@@ -15,3 +19,12 @@ def infinite_generator(func: Callable[[...], Iterator[T]]):
15 yield item 19 yield item
16 20
17 return wrapper 21 return wrapper
22
23
24def list_input(func: AssignmentRun) -> AssignmentRunList:
25 @wraps(func)
26 def wrapper(self, input: Iterator, *args, **kwargs) -> T:
27
28 return func(self, list(input), *args, **kwargs)
29
30 return wrapper
diff --git a/day21/__init__.py b/day21/__init__.py
new file mode 100644
index 0000000..23fd520
--- /dev/null
+++ b/day21/__init__.py
@@ -0,0 +1,122 @@
1# -*- coding: utf-8 -*-
2from abc import ABC
3from typing import Dict, Union, Iterator, Type, Callable, List
4from operator import add, sub, mul, truediv, eq, floordiv
5
6from aoc import BaseAssignment
7from aoc.decorators import list_input
8from aoc.mixins import AStarMixin
9
10
11class MonkeyActivity:
12 def __init__(self, name: str, monkeys: Dict[str, "MonkeyActivity"]):
13 self.name = name
14 self.monkeys = monkeys
15 self.monkeys[name] = self
16
17 def __repr__(self):
18 return f"{self.name}"
19
20 @property
21 def value(self) -> int:
22 raise NotImplementedError()
23
24
25class Yell(MonkeyActivity):
26 def __init__(self, value: str, *args, **kwargs):
27 super().__init__(*args, **kwargs)
28
29 self._value = int(value)
30
31 @property
32 def value(self) -> int:
33 return self._value
34
35
36class Operate(MonkeyActivity):
37 def __init__(self, a: str, b: str, operator: str, *args, **kwargs):
38 super().__init__(*args, **kwargs)
39
40 self.operator = operator
41 self._a = a
42 self._b = b
43 self._operator = {
44 "+": add,
45 "-": sub,
46 "*": mul,
47 "/": truediv,
48 }[operator]
49
50 @property
51 def a(self) -> MonkeyActivity:
52 return self.monkeys[self._a]
53
54 @property
55 def b(self) -> MonkeyActivity:
56 return self.monkeys[self._b]
57
58 @property
59 def value(self) -> int:
60 return int(self._operator(self.a.value, self.b.value))
61
62
63class Assignment(BaseAssignment[int, MonkeyActivity], ABC):
64 monkeys = {}
65
66 def parse_item(self, item: str) -> MonkeyActivity:
67 name, activity = item.split(": ")
68 activity = activity.split(" ")
69
70 if len(activity) == 1:
71 return Yell(*activity, name, self.monkeys)
72
73 a, operator, b = activity
74
75 return Operate(a, b, operator, name, self.monkeys)
76
77
78class AssignmentOne(Assignment):
79 example_result = 152
80
81 @list_input
82 def run(self, _: List[MonkeyActivity]) -> int:
83 return self.monkeys["root"].value
84
85
86class AssignmentTwo(Assignment, AStarMixin[MonkeyActivity]):
87 example_result = 301
88
89 @staticmethod
90 def neighbours(node: MonkeyActivity):
91 if isinstance(node, Operate):
92 yield node.a
93 yield node.b
94
95 @list_input
96 def run(self, _: List[MonkeyActivity]) -> int:
97 root = self.monkeys["root"]
98 humn = self.monkeys["humn"]
99 humn._value = 0
100
101 path = self.a_star(
102 root,
103 lambda n, _: n is humn,
104 self.neighbours,
105 )
106
107 for item in path:
108 if isinstance(item, Yell):
109 break
110
111 item: Operate = item
112 reverse_operator = {
113 "+": sub,
114 "-": add,
115 "*": floordiv,
116 "/": mul,
117 }[item.operator]
118
119 humn._value = reverse_operator(item.b.value, item.a.value)
120 pass
121
122 return humn._value
diff --git a/day21/example.txt b/day21/example.txt
new file mode 100644
index 0000000..e14be60
--- /dev/null
+++ b/day21/example.txt
@@ -0,0 +1,15 @@
1root: pppw + sjmn
2dbpl: 5
3cczh: sllz + lgvd
4zczc: 2
5ptdq: humn - dvpt
6dvpt: 3
7lfqf: 4
8humn: 5
9ljgn: 2
10sjmn: drzm * dbpl
11sllz: 4
12pppw: cczh / lfqf
13lgvd: ljgn * ptdq
14drzm: hmdt - zczc
15hmdt: 32
diff --git a/day21/input.txt b/day21/input.txt
new file mode 100644
index 0000000..0696184
--- /dev/null
+++ b/day21/input.txt
@@ -0,0 +1,2727 @@
1cjdb: 3
2hhfs: 5
3jvjn: 4
4tjzm: bngm * mrfm
5mbbs: 2
6dzlq: tcdz * bjdj
7htzp: 3
8hsmn: 5
9sblh: 2
10pghw: 5
11pqtp: vtcr * bcts
12mvgz: 2
13sszn: 3
14zqlr: nlfq * htfq
15djsb: 2
16vccw: zzsz * thbz
17tlvg: fncr + glvj
18grql: nqch * jhmw
19rngv: 4
20prjv: 2
21rmdl: lzdr * qpzh
22pdqm: 2
23jrpn: zcnv + pgqr
24llzf: 2
25bzfp: qbwz + zsts
26bvsf: rbcd + npcs
27jmpm: 3
28zgrs: 15
29lcrs: 5
30cqcc: swtj + wnzt
31vhts: 2
32pbgz: 1
33mqpb: 2
34jzcf: 2
35sfls: 10
36cnhh: 8
37clsh: mcwb * jfrq
38cqch: 4
39brvd: 19
40fprh: 2
41dccm: gbhn / tczb
42wmgt: ldsd + csmf
43hbrs: 6
44bjqq: 12
45pvnl: 6
46htdg: 2
47tpcm: hfdz * sfrt
48sgcj: slfv * wzdf
49fljs: 2
50qmml: 2
51sbqt: 2
52wjqn: 4
53fmzj: 1
54dnwt: 18
55dzld: rvhr * jfjj
56qnfn: mrhp * wlhj
57sccz: 3
58lbcv: hqjn + lhcg
59bwdw: 16
60jmgq: czzm * sjqr
61zqnd: fhfm + sstq
62mlwd: 3
63mpnz: vdqm * ccgq
64bcsn: cmrp * prhj
65gsvq: cqcc / twjg
66zcgv: 4