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

  • @[email protected]
    link
    fedilink
    3
    edit-2
    3 days ago

    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
    
    • @[email protected]
      link
      fedilink
      33 days ago

      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.

    • @[email protected]
      link
      fedilink
      13 days ago

      The fact that I need [:-2] suggests that I’m doing something wrong in parsing the input I guess…