Spaces:
Running
Running
| file = "input.txt" | |
| def solve_part1(disk_map): | |
| disk_blocks = [] | |
| file_id = 0 | |
| is_file = True | |
| for i in range(0, len(disk_map), 2): | |
| file_size = int(disk_map[i]) | |
| free_size = int(disk_map[i+1]) | |
| disk_blocks.extend([file_id] * file_size) | |
| disk_blocks.extend(["."] * free_size) | |
| file_id += 1 | |
| disk_str = "".join(map(str,disk_blocks)) | |
| while "." in disk_str: | |
| first_dot = disk_str.find(".") | |
| last_file_block = disk_str.rfind(str(file_id - 1)) | |
| disk_list = list(disk_str) | |
| disk_list[first_dot] = disk_list[last_file_block] | |
| disk_list[last_file_block] = "." | |
| disk_str = "".join(disk_list) | |
| checksum = 0 | |
| for i in range(len(disk_str)): | |
| if disk_str[i] != ".": | |
| checksum += i * int(disk_str[i]) | |
| return checksum | |
| def solve_part2(disk_map): | |
| disk_blocks = [] | |
| file_sizes = {} | |
| file_id = 0 | |
| is_file = True | |
| for i in range(0, len(disk_map), 2): | |
| file_size = int(disk_map[i]) | |
| free_size = int(disk_map[i+1]) | |
| file_sizes[file_id] = file_size | |
| disk_blocks.extend([file_id] * file_size) | |
| disk_blocks.extend(["."] * free_size) | |
| file_id += 1 | |
| disk_str = "".join(map(str, disk_blocks)) | |
| for fid in range(file_id - 1, -1, -1): | |
| file_size = file_sizes[fid] | |
| first_occurrence = disk_str.find(str(fid)) | |
| free_space_size = 0 | |
| free_space_start = -1 | |
| for i in range(len(disk_str)): | |
| if disk_str[i] == ".": | |
| if free_space_start == -1: | |
| free_space_start = i | |
| free_space_size += 1 | |
| else: | |
| if free_space_size >= file_size and free_space_start < first_occurrence: | |
| disk_list = list(disk_str) | |
| for j in range(file_size): | |
| disk_list[free_space_start + j] = str(fid) | |
| disk_list[first_occurrence + j] = "." | |
| disk_str = "".join(disk_list) | |
| break | |
| free_space_start = -1 | |
| free_space_size = 0 | |
| checksum = 0 | |
| for i in range(len(disk_str)): | |
| if disk_str[i] != ".": | |
| checksum += i * int(disk_str[i]) | |
| return checksum | |
| with open(file) as f: | |
| disk_map = f.readline().strip() | |
| result1 = solve_part1(disk_map) | |
| print(result1) | |
| result2 = solve_part2(disk_map) | |
| print(result2) |