78 lines
1.5 KiB
Python
78 lines
1.5 KiB
Python
with open('input.text', 'r') as file:
|
|
data = file.read()
|
|
|
|
drive: list[int] = []
|
|
|
|
is_file = True
|
|
f_id = 0
|
|
for c in data:
|
|
|
|
if is_file:
|
|
drive.extend([f_id] * int(c))
|
|
f_id += 1
|
|
else:
|
|
drive.extend([-1] * int(c))
|
|
|
|
is_file = not is_file
|
|
|
|
def print_drive(drive: list[int]) -> None:
|
|
|
|
for i in drive:
|
|
if i != -1:
|
|
print(i, end='')
|
|
else:
|
|
print('.', end='')
|
|
|
|
print()
|
|
|
|
def compress_drive(drive: list[int]) -> list[int]:
|
|
max_f_id: int = max(drive)
|
|
while max_f_id != 0:
|
|
|
|
file_index: int = drive.index(max_f_id)
|
|
size: int = drive.count(max_f_id)
|
|
|
|
free_size = 0
|
|
free_index = None
|
|
found_block = False
|
|
for i, id in enumerate(drive):
|
|
|
|
if i >= file_index:
|
|
break
|
|
|
|
if id == -1:
|
|
free_size += 1
|
|
if not free_index:
|
|
free_index = i
|
|
else:
|
|
free_size = 0
|
|
free_index = None
|
|
|
|
if free_size >= size:
|
|
found_block = True
|
|
break
|
|
|
|
if found_block:
|
|
drive[file_index:file_index + size] = [-1] * size
|
|
drive[free_index:free_index + size] = [max_f_id] * size
|
|
|
|
max_f_id -= 1
|
|
|
|
return drive
|
|
|
|
def checksum(drive: list[int]) -> int:
|
|
s = 0
|
|
for i, id in enumerate(drive):
|
|
if id != -1:
|
|
s += i * id
|
|
|
|
return s
|
|
|
|
# print_drive(drive)
|
|
# print_drive(compress_drive(drive))
|
|
|
|
drive = compress_drive(drive)
|
|
print(checksum(drive))
|
|
|
|
|