summaryrefslogtreecommitdiff
path: root/15_2023.py
diff options
context:
space:
mode:
Diffstat (limited to '15_2023.py')
-rw-r--r--15_2023.py45
1 files changed, 45 insertions, 0 deletions
diff --git a/15_2023.py b/15_2023.py
new file mode 100644
index 0000000..a7f2e8a
--- /dev/null
+++ b/15_2023.py
@@ -0,0 +1,45 @@
+import sys
+import re
+from copy import deepcopy
+from math import gcd
+from collections import defaultdict, Counter, deque
+
+D = open(sys.argv[1]).read().strip()
+L = D.split("\n")
+G = [[c for c in row] for row in L]
+
+
+def f(s):
+ h = 0
+ for c in s:
+ h = ((h + ord(c)) * 17) % 256
+ return h
+
+
+cmds = D.split(",")
+
+p1 = 0
+for cmd in cmds:
+ p1 += f(cmd)
+print(p1)
+
+BOX = [[] for _ in range(256)]
+for cmd in cmds:
+ if cmd[-1] == "-":
+ name = cmd[:-1]
+ h = f(name)
+ BOX[h] = [(n, v) for (n, v) in BOX[h] if n != name]
+ elif cmd[-2] == "=":
+ name = cmd[:-2]
+ h = f(name)
+ len_ = int(cmd[-1])
+ if name in [n for (n, v) in BOX[h]]:
+ BOX[h] = [(n, len_ if name == n else v) for (n, v) in BOX[h]]
+ else:
+ BOX[h].append((name, len_))
+
+p2 = 0
+for i, box in enumerate(BOX):
+ for j, (n, v) in enumerate(box):
+ p2 += (i + 1) * (j + 1) * v
+print(p2)