Index

Day 09

part2

AoC link
from collections import deque

input = """\
2333133121414131402
"""

# input = open("2024/day09/data.txt").read()

disk = deque()
for i, ch in enumerate(input.strip()):
    if i % 2 == 0:
        disk.extend([i // 2] * int(ch))
    else:
        disk.extend("." * int(ch))

# 00...111...2...333.44.5555.6666.777.888899
# print("".join(map(str, disk)))

orig = disk.copy()
orig.reverse()
i = -1
while True:
    try:
        first_open_idx = disk.index(".", 0, i)
    except ValueError:
        # "." not found
        break

    start_i = i
    f_id = disk[i]
    while disk[i - 1] == f_id:
        i -= 1

    block_size = abs(i - start_i - 1)

    empty_ct = 1
    while empty_ct < block_size:
        if disk[first_open_idx + empty_ct] == ".":
            empty_ct += 1
        else:
            try:
                first_open_idx = disk.index(".", first_open_idx + 1, i)
            except ValueError:
                first_open_idx = None
                break
            empty_ct = 1

    if first_open_idx is not None:
        for ii in range(first_open_idx, first_open_idx + block_size):
            disk[ii] = f_id

        for ii in range(i, start_i + 1):
            disk[ii] = "."

    i -= 1
    while disk[i] == "." or i == 0:
        i -= 1

    # print("".join(map(str, disk)))


# 00992111777.44.333....5555.6666.....8888..
# print("".join(map(str, disk)))

total = 0
for i, ch in enumerate(disk):
    if ch != ".":
        total += i * ch

print(total)


Output: