summaryrefslogtreecommitdiff
path: root/day14/day14.py
diff options
context:
space:
mode:
Diffstat (limited to 'day14/day14.py')
-rw-r--r--day14/day14.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/day14/day14.py b/day14/day14.py
new file mode 100644
index 0000000..ca35d2b
--- /dev/null
+++ b/day14/day14.py
@@ -0,0 +1,76 @@
+"""Day 14."""
+import re
+from itertools import product
+import sys
+
+mask_pattern = r"mask = (\w+)"
+mask_prog = re.compile(mask_pattern)
+mem_pattern = r"mem\[(\d+)\] = (\d+)"
+mem_prog = re.compile(mem_pattern)
+
+with open("input") as f:
+ data = f.read().rstrip().split("\n")
+
+def to_bin_str(int_str):
+ return bin(int(int_str))[2:].zfill(36)
+
+def mask_bit_part_1(mask, val):
+ if mask == 'X':
+ return val
+ return mask
+
+def mask_bit_part_2(mask, val):
+ if mask == '0':
+ return val
+ if mask == '1':
+ return '1'
+ return mask
+
+memory = {}
+
+for line in data:
+ if line.startswith("mask"):
+ mask = mask_prog.match(line).groups()[0]
+ else:
+ addr, val = mem_prog.match(line).groups()
+ val = to_bin_str(val)
+ res = ''.join([mask_bit_part_1(m, v) for m, v in zip(mask, val)])
+ memory[addr] = int(res, 2)
+
+solution_1 = sum(memory.values())
+print(solution_1)
+assert solution_1 == 5055782549997
+
+
+# Day 2
+# Little slow but works
+
+memory = {}
+
+for idx, line in enumerate(data):
+ print(idx)
+ if line.startswith("mask"):
+ mask = mask_prog.match(line).groups()[0]
+ else:
+ orig_addr, val = mem_prog.match(line).groups()
+ orig_addr = to_bin_str(orig_addr)
+ orig_res = [mask_bit_part_2(m, v) for m, v in zip(mask, orig_addr)]
+ addrs = []
+ num_x = orig_res.count("X")
+ perms = ["".join(seq) for seq in product("01", repeat=num_x)]
+ all_addrs = []
+ for perm in perms:
+ res = orig_res.copy()
+ for digit in perm:
+ idx = res.index("X")
+ res[idx] = f"{digit}"
+ all_addrs.append(res)
+ for addr in all_addrs:
+ addr = int("".join(addr), 2)
+ memory[addr] = int(val)
+
+solution_2 = sum(memory.values())
+
+# Day 2
+print(solution_2)
+assert solution_2 == 4795970362286