2024 day 9.
This commit is contained in:
parent
dd3f332870
commit
98eb515c19
@ -4,4 +4,65 @@ from ..base import BaseSolver
|
||||
|
||||
|
||||
class Solver(BaseSolver):
|
||||
def solve(self, input: str) -> Iterator[Any]: ...
|
||||
def solve(self, input: str) -> Iterator[Any]:
|
||||
blocks: list[tuple[int, int]] = []
|
||||
frees: list[tuple[int, int]] = []
|
||||
|
||||
contents_0: list[int | None] = [None for _ in range(sum(map(int, input)))]
|
||||
|
||||
acc = 0
|
||||
for i, c in enumerate(input):
|
||||
if i % 2 == 0:
|
||||
for j in range(acc, acc + int(c)):
|
||||
contents_0[j] = i // 2
|
||||
blocks.append((acc, int(c)))
|
||||
else:
|
||||
frees.append((acc, int(c)))
|
||||
acc += int(c)
|
||||
|
||||
assert contents_0[-1] is not None
|
||||
|
||||
contents = contents_0.copy()
|
||||
|
||||
free_0 = next(i for i, c in enumerate(contents) if c is None)
|
||||
next_b = len(contents) - 1
|
||||
|
||||
while free_0 < next_b:
|
||||
contents[free_0], contents[next_b] = contents[next_b], contents[free_0]
|
||||
|
||||
free_0 += 1
|
||||
while free_0 < len(contents) and contents[free_0] is not None:
|
||||
free_0 += 1
|
||||
|
||||
next_b -= 1
|
||||
while next_b >= 0 and contents[next_b] is None:
|
||||
next_b -= 1
|
||||
|
||||
yield sum(i * c for i, c in enumerate(contents) if c is not None)
|
||||
|
||||
contents = contents_0.copy()
|
||||
|
||||
for block_start, block_length in blocks[::-1]:
|
||||
try:
|
||||
i_free = next(
|
||||
i_free
|
||||
for i_free, (free_start, free_length) in enumerate(frees)
|
||||
if free_start < block_start and free_length >= block_length
|
||||
)
|
||||
except StopIteration:
|
||||
continue
|
||||
|
||||
free_start, free_length = frees[i_free]
|
||||
|
||||
for i in range(block_length):
|
||||
contents[free_start + i], contents[block_start + i] = (
|
||||
contents[block_start + i],
|
||||
None,
|
||||
)
|
||||
|
||||
if free_length == block_length:
|
||||
del frees[i_free]
|
||||
else:
|
||||
frees[i_free] = (free_start + block_length, free_length - block_length)
|
||||
|
||||
yield sum(i * c for i, c in enumerate(contents) if c is not None)
|
||||
|
File diff suppressed because one or more lines are too long
@ -0,0 +1 @@
|
||||
2333133121414131402
|
Loading…
Reference in New Issue
Block a user