Compare commits

...

2 Commits

Author SHA1 Message Date
8042b7f5e2 Solve day 20. 2024-05-30 15:37:22 -04:00
ecda947fb4 Solve day 18 and 19 2017. 2024-05-30 09:01:51 -04:00
5 changed files with 222 additions and 1 deletions

109
2017/d18.py Normal file
View File

@@ -0,0 +1,109 @@
from lib import LETTERS_LOWER
from collections import defaultdict, deque
def get_value(regs, val):
if val in LETTERS_LOWER:
return regs[val]
return int(val)
def part_1(data):
regs = defaultdict(int)
insts = data.splitlines()
last_sound = None
pc = 0
while pc <= len(insts):
cmds = insts[pc].split()
match cmds:
case ["set", reg, val]:
val = get_value(regs, val)
regs[reg] = val
case ["mul", reg, val]:
val = get_value(regs, val)
regs[reg] = regs[reg] * val
case ["add", reg, val]:
val = get_value(regs, val)
regs[reg] = regs[reg] + val
case ["mod", reg, val]:
val = get_value(regs, val)
regs[reg] = regs[reg] % val
case ["rcv", val]:
if get_value(regs, val) != 0:
print(last_sound)
return
case ["snd", val]:
last_sound = get_value(regs, val)
case ["jgz", cnd, off]:
if get_value(regs, cnd) > 0:
pc += get_value(regs, off) # XXX?
continue
case _:
print(cmds)
assert False
pc += 1
def part_2(data):
progs = []
insts = data.splitlines()
prog1_counter = 0
for i in [0, 1]:
regs = defaultdict(int)
regs["p"] = i
pc = 0
progs.append([pc, regs, False, deque()])
while not all(prog[2] for prog in progs):
for prog in progs:
pc, regs, waiting, queue = prog
cmds = insts[pc].split()
match cmds:
case ["set", reg, val]:
val = get_value(regs, val)
regs[reg] = val
case ["mul", reg, val]:
val = get_value(regs, val)
regs[reg] = regs[reg] * val
case ["add", reg, val]:
val = get_value(regs, val)
regs[reg] = regs[reg] + val
case ["mod", reg, val]:
val = get_value(regs, val)
regs[reg] = regs[reg] % val
case ["rcv", reg]:
if queue:
val = queue.popleft()
regs[reg] = val
else:
prog[2] = True
pc -= 1
case ["snd", val]:
val = get_value(regs, val)
if prog == progs[0]:
other_prog = progs[1]
else:
prog1_counter += 1
other_prog = progs[0]
other_prog[3].append(val)
case ["jgz", cnd, off]:
if get_value(regs, cnd) > 0:
pc += get_value(regs, off) # XXX?
pc -= 1
case _:
print(cmds)
assert False
prog[0] = pc + 1
print(prog1_counter)
def main():
data = open(0).read().strip()
part_1(data)
part_2(data)
if __name__ == "__main__":
main()

50
2017/d19.py Normal file
View File

@@ -0,0 +1,50 @@
from lib import Grid2D, LETTERS_UPPER, add2, sub2
def part_1(data):
g = Grid2D(data)
g.print()
current = None
for c in range(g.n_cols):
if g[(0, c)] == "|":
current = (0, c)
current_dir = Grid2D.S
letters = ""
done = False
steps = 0
while not done:
while g[current] != " ":
current = add2(current, current_dir)
steps += 1
if g[current] in LETTERS_UPPER:
letter = g[current]
if letter in letters:
done = True
break
letters += letter
if g[current] == "+":
break
next_field = None
for nb in g.neighbors_ort(current):
if nb != sub2(current, current_dir) and (g[nb] in "-|" or g[nb] in LETTERS_UPPER):
next_field = nb
if next_field is None:
done = True
else:
current_dir = sub2(next_field, current)
print(letters)
print(steps)
def main():
data = open(0).read()
part_1(data)
if __name__ == "__main__":
main()

55
2017/d20.py Normal file
View File

@@ -0,0 +1,55 @@
from lib import str_to_ints
from collections import defaultdict
def part_1(data):
ps = []
for i, line in enumerate(data.splitlines()):
ps.append(str_to_ints(line) + [i])
for _ in range(10_000):
for p in ps:
p[3] += p[6]
p[4] += p[7]
p[5] += p[8]
p[0] += p[3]
p[1] += p[4]
p[2] += p[5]
ps.sort(key=lambda p: abs(p[0]) + abs(p[1]) + abs(p[2]))
print(ps[0][-1])
def part_2(data):
ps = []
for i, line in enumerate(data.splitlines()):
ps.append(str_to_ints(line) + [i])
for _ in range(10_000):
poss = defaultdict(list)
for p in ps:
p[3] += p[6]
p[4] += p[7]
p[5] += p[8]
p[0] += p[3]
p[1] += p[4]
p[2] += p[5]
poss[(p[0], p[1], p[2])].append(p)
for pts in poss.values():
if len(pts) > 1:
for p in pts:
ps.remove(p)
print(len(ps))
def main():
data = open(0).read()
part_1(data)
part_2(data)
if __name__ == "__main__":
main()

View File

@@ -27,6 +27,9 @@ def mape(f, xs):
def add2(a: tuple[int, int], b: tuple[int, int]) -> tuple[int, int]: def add2(a: tuple[int, int], b: tuple[int, int]) -> tuple[int, int]:
return (a[0] + b[0], a[1] + b[1]) return (a[0] + b[0], a[1] + b[1])
def sub2(a: tuple[int, int], b: tuple[int, int]) -> tuple[int, int]:
return (a[0] - b[0], a[1] - b[1])
class Grid2D: class Grid2D:
N = (-1, 0) N = (-1, 0)
E = (0, 1) E = (0, 1)

View File

@@ -77,4 +77,8 @@ written in Python.
- Day 14: 17:48 - Day 14: 17:48
- Day 15: 11:40 - Day 15: 11:40
- Day 16: 13:16 - Day 16: 13:16
- Day 17: - Day 17: 55:00
- Day 18: 23:00
- Day 19: 45:00
- Day 20: 9:55 (would have been 10th)
- Day 21: