Skip to content

Commit 7d6d241

Browse files
Viliam PucikViliam Pucik
Viliam Pucik
authored and
Viliam Pucik
committed
initial 2023-05
1 parent 77c633a commit 7d6d241

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

2023/05.py

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#!/usr/bin/env python
2+
from collections import deque
3+
4+
seeds, *maps = open(0).read().split("\n\n")
5+
seeds = list(map(int, seeds.split(":")[1].split()))
6+
maps = [
7+
sorted(
8+
[
9+
(src, src + length, dst - src)
10+
for line in m.splitlines()[1:]
11+
for dst, src, length in [map(int, line.split())]
12+
]
13+
)
14+
for m in maps
15+
]
16+
# print(seeds, maps, len(maps))
17+
18+
19+
def solve(s):
20+
for m in maps:
21+
for start, stop, offset in m:
22+
if start <= s < stop:
23+
s += offset
24+
break
25+
return s
26+
27+
28+
def solve2(seeds):
29+
queue = deque([(a, a + b, 0) for a, b in zip(seeds[::2], seeds[1::2])])
30+
print(queue)
31+
32+
while queue:
33+
a, b, i = queue.popleft()
34+
# print(a, b, i)
35+
36+
if i == len(maps) - 1:
37+
yield a
38+
yield b
39+
else:
40+
m = maps[i]
41+
42+
for start, stop, offset in m:
43+
if start < b and a < stop:
44+
queue.append((max(start, a) + offset, min(stop, b) + offset, i + 1))
45+
46+
first, last = m[0][0], m[-1][1]
47+
if b <= first or last <= a:
48+
queue.append((a, b, i + 1))
49+
else:
50+
if a < first < b:
51+
queue.append((a, first, i + 1))
52+
if a < last < b:
53+
queue.append((last, b, i + 1))
54+
55+
56+
print(min(solve(s) for s in seeds))
57+
print(min(solve2(seeds)))

0 commit comments

Comments
 (0)