57 lines
1.3 KiB
Python
57 lines
1.3 KiB
Python
import time
|
|
start_time = time.time()
|
|
|
|
with open('puzzle.txt', 'r') as f:
|
|
line = f.read()
|
|
|
|
disk_string = []
|
|
|
|
block_length = {}
|
|
block_initial_index = {}
|
|
|
|
file = True
|
|
|
|
file_id = -1
|
|
|
|
for char in list(line):
|
|
if file:
|
|
file_id += 1
|
|
disk_string += [str(file_id)] * int(char)
|
|
block_length[str(file_id)] = int(char)
|
|
block_initial_index[str(file_id)] = len(disk_string) - block_length[str(file_id)]
|
|
|
|
else:
|
|
disk_string += ['.'] * int(char)
|
|
|
|
file = not file
|
|
|
|
while file_id != 0:
|
|
file_id = str(file_id)
|
|
|
|
range_a_found = False
|
|
|
|
for index_a, char_a in enumerate(disk_string):
|
|
if char_a == '.':
|
|
empty_count = 1
|
|
while index_a + empty_count < block_initial_index[file_id] and disk_string[index_a + empty_count] == '.':
|
|
empty_count += 1
|
|
|
|
if empty_count >= block_length[file_id] and index_a < block_initial_index[file_id]:
|
|
for i in range(block_length[file_id]):
|
|
disk_string[index_a + i] = file_id
|
|
disk_string[block_initial_index[file_id] + i] = '.'
|
|
|
|
break
|
|
|
|
file_id = int(file_id)
|
|
file_id -= 1
|
|
|
|
checksum = 0
|
|
|
|
for index, char in enumerate(disk_string):
|
|
if char != '.':
|
|
checksum += int(char) * index
|
|
|
|
print(checksum)
|
|
print(f'Total time: {time.time() - start_time}')
|