Advertisement
Guest User

AoC Day 9

a guest
Dec 9th, 2024
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.11 KB | None | 0 0
  1. ### part 1
  2. def extract_memory(filesystem):
  3.     memory = []
  4.     for idx, amount in enumerate(filesystem):
  5.         if idx % 2 == 1:
  6.             memory += ["."] * int(amount)
  7.             continue
  8.         memory += [str(idx//2)] * int(amount)
  9.     return memory
  10.  
  11. def task1(puzzle_input: str) -> int:
  12.     memory = extract_memory(puzzle_input)
  13.     free_spaces = []
  14.     last_data = "."
  15.     for idx, data in enumerate(memory):
  16.         if data == ".":
  17.             free_spaces.append(idx)
  18.     for idx, data in enumerate(memory):
  19.         if data == ".":
  20.             continue
  21.         if len(free_spaces) == 0:
  22.             break
  23.         last_data = memory.pop()
  24.         while last_data == ".":
  25.             last_data = memory.pop()
  26.         if free_spaces:
  27.             first_free_space = free_spaces.pop(0)
  28.             if first_free_space > len(memory) - 1:
  29.                 memory.append(last_data)
  30.             else:
  31.                 memory[first_free_space] = last_data
  32.         else:
  33.             break
  34.     sum = 0
  35.     for idx, data in enumerate(memory):
  36.         if data == ".":
  37.             break
  38.         sum += int(data) * idx
  39.     return sum
  40.  
  41. ### part 2
  42. def extract_system(filesystem):
  43.     system = []
  44.     fs_idx = 0
  45.     for idx, amount in enumerate(filesystem):
  46.         if int(amount) == 0:
  47.             continue
  48.         if idx % 2 == 1:
  49.             system.append((fs_idx, fs_idx+int(amount), -1))
  50.             fs_idx += int(amount)
  51.             continue
  52.         system.append((fs_idx, fs_idx+int(amount), idx//2))
  53.         fs_idx += int(amount)
  54.     return system
  55.  
  56. def checksum(system):
  57.     sum = 0
  58.     for b, e, n in system:
  59.         if n == -1:
  60.             continue
  61.         for i in range(e-b):
  62.             sum += (b+i)*n
  63.     return sum
  64.  
  65. def task2(puzzle_input: str) -> int:
  66.     system = extract_system(puzzle_input)
  67.     result = []
  68.     while system:
  69.         first = system[0]
  70.         last = system[-1]
  71.         if first[2] != -1:
  72.             del system[0]
  73.             result.append(first)
  74.             continue
  75.         if last[2] == -1:
  76.             del system[-1]
  77.             result.append(last)
  78.             continue
  79.         # first is space
  80.         # last is file
  81.         for index, space in enumerate(system):
  82.             if space[2] != -1:
  83.                 continue
  84.             space_length = space[1] - space[0]
  85.             last_length = last[1] - last[0]
  86.             if space_length >= last_length:
  87.                 new_file = (space[0], space[0]+last_length, last[2])
  88.                 if space_length == last_length:
  89.                     del system[index]
  90.                     system.insert(index, new_file)
  91.                     del system[-1]
  92.                 else:
  93.                     new_space = (new_file[1], space[1], -1)
  94.                     del system[index]
  95.                     system.insert(index, new_space)
  96.                     system.insert(index, new_file)
  97.                     del system[-1]
  98.                     system.append((last[0], last[1], -1))
  99.                 break
  100.         else:
  101.             result.append(last)
  102.             del system[-1]
  103.             pass
  104.     return checksum(result)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement