summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordzwdz2022-12-23 10:15:42 +0100
committerdzwdz2022-12-23 10:15:42 +0100
commit189f51cfaebc426661b5f5c1c8840f82e710bbbf (patch)
tree8be074d7ff97d615104948eb5a24c1744095c7f9
parente4c6caa96475ad0e68a3a46cd4c2721159ab0dcf (diff)
day 23 part 1
-rw-r--r--22.23/part1.py65
1 files changed, 65 insertions, 0 deletions
diff --git a/22.23/part1.py b/22.23/part1.py
new file mode 100644
index 0000000..818e7ed
--- /dev/null
+++ b/22.23/part1.py
@@ -0,0 +1,65 @@
+from sys import stdin
+
+elves = set()
+for y, line in enumerate(stdin):
+ for x, c in enumerate(line):
+ if c == '#':
+ elves.add((x, y))
+
+def tadd(a, b):
+ return tuple(map(sum, zip(a, b)))
+
+def move(elf, elves, phase):
+ def singlemove(phase):
+ phase = phase % 4
+ d = None
+ if phase == 0: d = (0, -1)
+ if phase == 1: d = (0, +1)
+ if phase == 2: d = (-1, 0)
+ if phase == 3: d = (+1, 0)
+
+ colls = []
+ for n in [-1, 0, 1]:
+ v = list(d)
+ v[v.index(0)] = n
+ v = tadd(elf, v)
+ if v in elves:
+ return None
+ return tadd(elf, d)
+
+ def crowded():
+ for dx in [-1, 0, 1]:
+ for dy in [-1, 0, 1]:
+ if dx == dy == 0: continue
+ if tadd(elf, (dx, dy)) in elves: return True
+ return False
+ if not crowded():
+ return elf
+
+ for i in range(4):
+ r = singlemove(phase + i)
+ if r: return r
+ return elf
+
+def step(elves, phase):
+ goals = set()
+ dupes = set()
+ after = set()
+ for elf in elves:
+ g = move(elf, elves, phase)
+ if g in goals:
+ dupes.add(g)
+ else:
+ goals.add(g)
+ for elf in elves:
+ g = move(elf, elves, phase)
+ after.add(elf if g in dupes else g)
+ return after
+
+for i in range(10):
+ elves = step(elves, i)
+
+xs = [t[0] for t in elves]
+ys = [t[1] for t in elves]
+score = (max(xs) - min(xs) + 1) * (max(ys) - min(ys) + 1) - len(elves)
+print(score)