Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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‎

Lines changed: 57 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /