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

  • urquell@lemm.ee
    link
    fedilink
    arrow-up
    3
    ·
    edit-2
    20 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
    
    • hades@lemm.ee
      link
      fedilink
      arrow-up
      3
      ·
      20 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.

      • urquell@lemm.ee
        link
        fedilink
        arrow-up
        1
        ·
        20 days ago

        I’m always moving one (file)part at a time, so that should be fine… I think.

    • urquell@lemm.ee
      link
      fedilink
      arrow-up
      1
      ·
      20 days ago

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