summaryrefslogtreecommitdiff
path: root/2023/05/step2.py
diff options
context:
space:
mode:
authorNicolas Schodet2023-12-13 23:15:27 +0100
committerNicolas Schodet2023-12-13 23:15:27 +0100
commit6687fbcfaaa1d5cf62f39478b60afe0324604485 (patch)
treedac1493919298007823f304e3ea34601a8ebb05b /2023/05/step2.py
parent47112ead6fcf65dc44f760f652b1ca377465323d (diff)
Day 4, 5
Diffstat (limited to '2023/05/step2.py')
-rw-r--r--2023/05/step2.py51
1 files changed, 51 insertions, 0 deletions
diff --git a/2023/05/step2.py b/2023/05/step2.py
new file mode 100644
index 0000000..95e276d
--- /dev/null
+++ b/2023/05/step2.py
@@ -0,0 +1,51 @@
+import argparse
+import collections
+import re
+
+p = argparse.ArgumentParser()
+p.add_argument("file", type=argparse.FileType("r"), help="input file")
+options = p.parse_args()
+
+m = collections.defaultdict(list)
+steps = []
+
+for line in options.file:
+ line = line.strip()
+ if not line:
+ pass
+ elif line.startswith("seeds:"):
+ seeds = [int(s) for s in line.split()[1:]]
+ seeds = [(s, s + sn) for s, sn in zip(seeds[0::2], seeds[1::2])]
+ elif line.endswith("map:"):
+ pmap = line.split()[0]
+ steps.append(pmap)
+ else:
+ [dst, src, n] = [int(s) for s in line.split()]
+ m[pmap].append((dst, src, n))
+
+mini = None
+
+for seed in seeds:
+ done = [seed]
+ for step in steps:
+ todo = done
+ done = []
+ for dst, src, n in m[step]:
+ src1 = src
+ src2 = src + n
+ newtodo = []
+ for s1, s2 in todo:
+ if s1 < src1:
+ newtodo.append((s1, min(s2, src1)))
+ if s2 > src2:
+ newtodo.append((max(s1, src2), s2))
+ if s2 > src1 and s1 < src2:
+ done.append((max(s1, src1) - src + dst, min(s2, src2) - src + dst))
+ todo = newtodo
+ done.extend(todo)
+ print(done)
+ s = min(s1 for s1, s2 in done)
+ if mini is None or s < mini:
+ mini = s
+
+print(mini)