Day 9: Disk Fragmenter
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
Python part 1
This is working for the demo, but not for the actual data. I’m a bit lost on why.
def part1(data: data) -> None: disk_map, free = gen_disk_map(data.getlines()[0]) for f in free[:-2]: disk_map[f] = disk_map.pop(max(disk_map.keys())) print(sum([k * v for k, v in disk_map.items()])) def gen_disk_map(raw: str): file_id = 0 pos = 0 disk_map, free = {}, [] for read_index, val in enumerate(map(int, raw)): if read_index % 2 == 0: for _ in range(val): disk_map[pos] = file_id pos += 1 file_id += 1 else: free.extend(range(pos, pos + val)) pos += val return disk_map, free
This part looks suspicious:
for f in range(len(free) - 2): disk_map[free[f]] = disk_map.pop(max(disk_map.keys()))
You’re always moving exactly
len(free) - 2
blocks, but that doesn’t sound to be correct in all cases. If you consider the following input:191
, you only need to move one block, and not seven.I’m always moving one (file)part at a time, so that should be fine… I think.
The fact that I need [:-2] suggests that I’m doing something wrong in parsing the input I guess…