Advertisement
Guest User

AoC 2022 Day 10

a guest
Dec 23rd, 2022
382
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.48 KB | None | 0 0
  1. # aoc202210.py
  2.  
  3. import pathlib
  4. import sys
  5.  
  6.  
  7. def parse(puzzle_input: str) -> list[str]:
  8.     """Parse input"""
  9.     return puzzle_input.splitlines()
  10.  
  11.  
  12. def part1(data: list[str]) -> int:
  13.     """Solve part 1"""
  14.     samples: tuple[int, ...] = tuple(n for n in range(20, 221, 40))
  15.     signal_strengths: dict[int, int] = {sample: 0 for sample in samples}
  16.     num_cycles: int = 0
  17.     x: int = 1
  18.     for instr in data:
  19.         num_cycles += 1
  20.         if num_cycles in samples:
  21.             signal_strengths[num_cycles] = x * num_cycles
  22.         if instr.startswith("addx "):
  23.             num_cycles += 1
  24.             if num_cycles in samples:
  25.                 signal_strengths[num_cycles] = x * num_cycles
  26.             x += int(instr[5:])
  27.     return sum(v for v in signal_strengths.values())
  28.  
  29.  
  30. def part2(data: list[str]) -> str:
  31.     """Solve part 2"""
  32.     sprite_pos: int = 1
  33.     drawn_pixel: int = 0
  34.     lit_pixels: list[list[int]] = []
  35.     line_pixels: list[int] = [drawn_pixel]
  36.     for instr in data:
  37.         if drawn_pixel in range(sprite_pos - 1, sprite_pos + 2):
  38.             line_pixels.append(drawn_pixel)
  39.         drawn_pixel += 1
  40.         if drawn_pixel == 40:
  41.             lit_pixels.append(line_pixels)
  42.             line_pixels = []
  43.             drawn_pixel = 0
  44.         if instr.startswith("addx "):
  45.             if drawn_pixel in range(sprite_pos - 1, sprite_pos + 2):
  46.                 line_pixels.append(drawn_pixel)
  47.             drawn_pixel += 1
  48.             if drawn_pixel == 40:
  49.                 lit_pixels.append(line_pixels)
  50.                 line_pixels = []
  51.                 drawn_pixel = 0
  52.             sprite_pos += int(instr[5:])
  53.  
  54.     screen: list[list[str]] = [
  55.         ["#" if pixel in line else "." for pixel in range(40)] for line in lit_pixels
  56.     ]
  57.  
  58.     readout: str = ""
  59.     for screen_line in screen:
  60.         readout += "".join(screen_line) + "\n"
  61.     return readout.rstrip("\n")
  62.  
  63.  
  64. def solve(puzzle_input: str) -> tuple[int, str]:
  65.     """Solve the puzzle for the given input"""
  66.     data: list[str] = parse(puzzle_input)
  67.     solution1: int = part1(data)  # Correct answer was 12980 (with my data)
  68.     solution2: str = part2(data)  # Correct answer was "BRJLFULP" (with my data)
  69.  
  70.     return solution1, solution2
  71.  
  72.  
  73. if __name__ == "__main__":
  74.     for path in sys.argv[1:]:
  75.         print(f"{path}:")
  76.         puzzle_input = pathlib.Path(path).read_text().strip()
  77.         solutions = solve(puzzle_input)
  78.         print("\n".join(str(solution) for solution in solutions))
  79.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement