From 8b9919f784f93bdca7335354e7eea782b397fe0c Mon Sep 17 00:00:00 2001 From: Tom van der Lee Date: Mon, 5 Dec 2022 10:26:45 +0100 Subject: Day 5 --- day5/__init__.py | 108 ++++++++++++ day5/example.txt | 9 + day5/input.txt | 512 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 629 insertions(+) create mode 100644 day5/__init__.py create mode 100644 day5/example.txt create mode 100644 day5/input.txt (limited to 'day5') diff --git a/day5/__init__.py b/day5/__init__.py new file mode 100644 index 0000000..a9aaba5 --- /dev/null +++ b/day5/__init__.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +import re +from abc import ABC +from typing import Iterator, Any, TypedDict, Tuple, List +from queue import LifoQueue + +from aoc import BaseAssignment + +move_regex = re.compile("^move (?P\d+) from (?P\d+) to (?P\d+)$") + + +class Move(TypedDict): + amount: int + start: int + end: int + + +class Assignment(BaseAssignment, ABC): + def parse_move(self, move: str) -> Move: + match = move_regex.match(move) + if match: + move = match.groupdict() + return Move( + amount=int(move["amount"]), + start=int(move["start"]), + end=int(move["end"]), + ) + + def parse_stacks(self, string_stacks: List[str]) -> List[LifoQueue]: + stacks = [] + columns = string_stacks.pop().replace(" ", "") + + for i in range(len(columns)): + stacks.append(LifoQueue()) + + for line in reversed(string_stacks): + for index, stack in enumerate(stacks): + item_index = (index * 4) + 1 + + try: + item = line[item_index] + if item != " ": + stack.put(item) + except IndexError: + pass + + return stacks + + def parse_input(self, input: Iterator) -> Tuple[List[LifoQueue], List[Move]]: + parsing_stacks = True + tmp_stacks = [] + stacks = [] + moves = [] + + for line in input: + if line == "": + parsing_stacks = False + stacks = self.parse_stacks(tmp_stacks) + continue + + if parsing_stacks: + tmp_stacks.append(line) + else: + moves.append(self.parse_move(line)) + + return stacks, moves + + def execute_moves(self, stacks: List[LifoQueue], moves: List[Move]): + raise NotImplementedError() + + def run(self, input: Iterator) -> Any: + stacks, moves = self.parse_input(input) + + self.execute_moves(stacks, moves) + + return "".join([stack.get() for stack in stacks]) + + +class AssignmentOne(Assignment): + example_result = "CMZ" + + def execute_moves(self, stacks: List[LifoQueue], moves: List[Move]): + for move in moves: + start = stacks[move["start"] - 1] + end = stacks[move["end"] - 1] + + for _ in range(move["amount"]): + end.put(start.get()) + + return stacks + + +class AssignmentTwo(Assignment): + example_result = "MCD" + + def execute_moves(self, stacks: List[LifoQueue], moves: List[Move]): + for move in moves: + start = stacks[move["start"] - 1] + end = stacks[move["end"] - 1] + + tmp_stack = LifoQueue() + for _ in range(move["amount"]): + tmp_stack.put(start.get()) + + while not tmp_stack.empty(): + end.put(tmp_stack.get()) + + return stacks diff --git a/day5/example.txt b/day5/example.txt new file mode 100644 index 0000000..42ef47f --- /dev/null +++ b/day5/example.txt @@ -0,0 +1,9 @@ + [D] +[N] [C] +[Z] [M] [P] + 1 2 3 + +move 1 from 2 to 1 +move 3 from 1 to 3 +move 2 from 2 to 1 +move 1 from 1 to 2 diff --git a/day5/input.txt b/day5/input.txt new file mode 100644 index 0000000..54a285f --- /dev/null +++ b/day5/input.txt @@ -0,0 +1,512 @@ +[F] [L] [M] +[T] [H] [V] [G] [V] +[N] [T] [D] [R] [N] [D] +[Z] [B] [C] [P] [B] [R] [Z] +[M] [J] [N] [M] [F] [M] [V] [H] +[G] [J] [L] [J] [S] [C] [G] [M] [F] +[H] [W] [V] [P] [W] [H] [H] [N] [N] +[J] [V] [G] [B] [F] [G] [D] [H] [G] + 1 2 3 4 5 6 7 8 9 + +move 6 from 4 to 3 +move 5 from 8 to 9 +move 1 from 4 to 5 +move 1 from 4 to 5 +move 2 from 2 to 7 +move 2 from 1 to 6 +move 9 from 6 to 1 +move 12 from 3 to 5 +move 1 from 8 to 4 +move 3 from 1 to 5 +move 1 from 6 to 7 +move 10 from 5 to 2 +move 14 from 5 to 1 +move 8 from 7 to 9 +move 11 from 2 to 9 +move 1 from 3 to 9 +move 11 from 1 to 5 +move 2 from 1 to 9 +move 1 from 4 to 8 +move 6 from 1 to 5 +move 1 from 8 to 3 +move 16 from 5 to 1 +move 4 from 1 to 3 +move 1 from 5 to 6 +move 4 from 3 to 4 +move 1 from 6 to 7 +move 21 from 9 to 6 +move 2 from 1 to 9 +move 2 from 4 to 9 +move 5 from 9 to 4 +move 9 from 1 to 6 +move 6 from 4 to 6 +move 1 from 6 to 2 +move 1 from 7 to 6 +move 1 from 3 to 2 +move 8 from 6 to 9 +move 3 from 1 to 8 +move 1 from 2 to 1 +move 13 from 6 to 3 +move 1 from 1 to 9 +move 2 from 1 to 6 +move 3 from 8 to 4 +move 4 from 4 to 9 +move 3 from 1 to 3 +move 22 from 9 to 8 +move 1 from 2 to 9 +move 6 from 8 to 9 +move 15 from 6 to 5 +move 5 from 8 to 9 +move 11 from 9 to 8 +move 13 from 5 to 1 +move 1 from 6 to 5 +move 1 from 9 to 3 +move 21 from 8 to 3 +move 3 from 5 to 3 +move 11 from 1 to 2 +move 25 from 3 to 1 +move 5 from 1 to 7 +move 20 from 1 to 7 +move 1 from 6 to 7 +move 16 from 3 to 9 +move 8 from 9 to 6 +move 1 from 1 to 5 +move 5 from 9 to 4 +move 2 from 2 to 1 +move 2 from 9 to 4 +move 1 from 9 to 4 +move 1 from 8 to 4 +move 1 from 5 to 2 +move 3 from 4 to 6 +move 1 from 4 to 7 +move 9 from 7 to 6 +move 5 from 4 to 6 +move 7 from 7 to 2 +move 1 from 1 to 6 +move 11 from 2 to 5 +move 10 from 5 to 1 +move 1 from 6 to 8 +move 1 from 5 to 7 +move 24 from 6 to 1 +move 12 from 1 to 4 +move 12 from 4 to 8 +move 2 from 2 to 7 +move 3 from 7 to 2 +move 5 from 2 to 8 +move 9 from 8 to 9 +move 9 from 8 to 5 +move 1 from 9 to 1 +move 14 from 1 to 8 +move 11 from 7 to 9 +move 4 from 1 to 3 +move 7 from 1 to 2 +move 3 from 3 to 7 +move 12 from 9 to 7 +move 8 from 7 to 2 +move 4 from 9 to 2 +move 1 from 3 to 6 +move 5 from 5 to 9 +move 14 from 2 to 1 +move 8 from 9 to 4 +move 6 from 4 to 5 +move 5 from 5 to 7 +move 1 from 8 to 2 +move 2 from 4 to 6 +move 4 from 7 to 3 +move 10 from 8 to 4 +move 2 from 3 to 6 +move 7 from 7 to 6 +move 10 from 4 to 8 +move 5 from 1 to 6 +move 8 from 2 to 1 +move 7 from 6 to 8 +move 9 from 6 to 5 +move 16 from 1 to 6 +move 2 from 3 to 9 +move 1 from 7 to 4 +move 2 from 9 to 1 +move 14 from 6 to 7 +move 1 from 6 to 3 +move 2 from 6 to 3 +move 9 from 5 to 7 +move 3 from 1 to 6 +move 3 from 3 to 7 +move 5 from 5 to 9 +move 3 from 6 to 2 +move 1 from 6 to 2 +move 12 from 8 to 2 +move 5 from 2 to 1 +move 2 from 1 to 3 +move 25 from 7 to 1 +move 1 from 4 to 6 +move 2 from 3 to 9 +move 26 from 1 to 9 +move 2 from 1 to 8 +move 1 from 6 to 8 +move 1 from 7 to 1 +move 7 from 8 to 1 +move 7 from 1 to 5 +move 1 from 1 to 2 +move 2 from 8 to 6 +move 32 from 9 to 8 +move 1 from 6 to 5 +move 5 from 2 to 9 +move 1 from 9 to 7 +move 24 from 8 to 3 +move 1 from 6 to 9 +move 3 from 2 to 5 +move 1 from 7 to 9 +move 4 from 9 to 3 +move 8 from 8 to 7 +move 18 from 3 to 7 +move 20 from 7 to 8 +move 6 from 8 to 9 +move 6 from 5 to 1 +move 8 from 9 to 4 +move 3 from 5 to 4 +move 8 from 8 to 4 +move 2 from 5 to 2 +move 3 from 1 to 5 +move 4 from 3 to 7 +move 6 from 2 to 9 +move 3 from 3 to 6 +move 6 from 4 to 5 +move 2 from 6 to 3 +move 1 from 3 to 1 +move 4 from 3 to 8 +move 8 from 4 to 3 +move 4 from 3 to 7 +move 4 from 4 to 5 +move 4 from 9 to 5 +move 3 from 3 to 4 +move 3 from 4 to 9 +move 1 from 1 to 4 +move 2 from 1 to 5 +move 7 from 7 to 8 +move 4 from 7 to 4 +move 1 from 6 to 7 +move 1 from 1 to 5 +move 1 from 3 to 8 +move 11 from 5 to 9 +move 17 from 9 to 8 +move 13 from 8 to 4 +move 1 from 4 to 8 +move 4 from 7 to 1 +move 4 from 8 to 3 +move 6 from 5 to 4 +move 3 from 3 to 6 +move 2 from 1 to 9 +move 1 from 9 to 5 +move 1 from 3 to 5 +move 5 from 5 to 9 +move 2 from 1 to 8 +move 21 from 8 to 6 +move 2 from 8 to 4 +move 4 from 9 to 6 +move 1 from 9 to 7 +move 19 from 4 to 1 +move 28 from 6 to 5 +move 7 from 4 to 2 +move 28 from 5 to 3 +move 1 from 9 to 4 +move 1 from 4 to 2 +move 1 from 7 to 8 +move 1 from 8 to 9 +move 13 from 1 to 3 +move 8 from 2 to 8 +move 3 from 1 to 2 +move 5 from 8 to 5 +move 1 from 2 to 7 +move 1 from 9 to 7 +move 1 from 2 to 3 +move 2 from 7 to 9 +move 1 from 2 to 6 +move 1 from 9 to 1 +move 9 from 3 to 9 +move 3 from 9 to 1 +move 1 from 6 to 8 +move 21 from 3 to 7 +move 7 from 9 to 4 +move 2 from 4 to 2 +move 1 from 8 to 6 +move 7 from 1 to 4 +move 7 from 7 to 8 +move 4 from 5 to 9 +move 10 from 7 to 1 +move 7 from 3 to 9 +move 1 from 7 to 9 +move 1 from 5 to 3 +move 3 from 3 to 5 +move 10 from 4 to 2 +move 1 from 3 to 7 +move 2 from 4 to 9 +move 3 from 9 to 1 +move 3 from 7 to 1 +move 1 from 6 to 4 +move 1 from 1 to 2 +move 1 from 3 to 4 +move 2 from 4 to 3 +move 1 from 7 to 4 +move 4 from 8 to 9 +move 1 from 4 to 9 +move 3 from 1 to 9 +move 12 from 1 to 7 +move 2 from 9 to 5 +move 12 from 9 to 7 +move 5 from 5 to 1 +move 1 from 8 to 5 +move 4 from 1 to 4 +move 1 from 9 to 6 +move 1 from 3 to 4 +move 3 from 8 to 3 +move 1 from 1 to 7 +move 8 from 2 to 5 +move 2 from 8 to 1 +move 10 from 7 to 1 +move 4 from 9 to 5 +move 2 from 5 to 8 +move 11 from 5 to 4 +move 6 from 7 to 2 +move 2 from 2 to 1 +move 1 from 7 to 5 +move 1 from 5 to 1 +move 2 from 4 to 8 +move 1 from 6 to 9 +move 8 from 4 to 3 +move 8 from 1 to 7 +move 7 from 1 to 2 +move 4 from 3 to 9 +move 1 from 9 to 6 +move 7 from 2 to 1 +move 5 from 2 to 3 +move 2 from 7 to 8 +move 5 from 8 to 4 +move 2 from 9 to 3 +move 1 from 8 to 1 +move 6 from 3 to 5 +move 10 from 3 to 1 +move 3 from 5 to 3 +move 3 from 2 to 1 +move 1 from 5 to 4 +move 6 from 4 to 5 +move 1 from 6 to 2 +move 3 from 4 to 7 +move 1 from 9 to 4 +move 2 from 3 to 1 +move 1 from 9 to 8 +move 1 from 3 to 7 +move 4 from 4 to 8 +move 2 from 7 to 4 +move 8 from 5 to 9 +move 2 from 8 to 6 +move 2 from 4 to 3 +move 2 from 3 to 4 +move 4 from 9 to 7 +move 1 from 8 to 7 +move 2 from 6 to 9 +move 2 from 8 to 9 +move 1 from 2 to 9 +move 1 from 7 to 8 +move 1 from 2 to 7 +move 19 from 7 to 6 +move 1 from 8 to 1 +move 2 from 4 to 8 +move 5 from 6 to 1 +move 2 from 7 to 2 +move 2 from 2 to 8 +move 2 from 1 to 8 +move 4 from 8 to 2 +move 3 from 2 to 8 +move 6 from 9 to 5 +move 8 from 6 to 3 +move 26 from 1 to 6 +move 1 from 5 to 3 +move 1 from 1 to 5 +move 8 from 3 to 1 +move 1 from 3 to 7 +move 3 from 9 to 2 +move 4 from 2 to 6 +move 26 from 6 to 1 +move 1 from 7 to 5 +move 3 from 8 to 4 +move 2 from 8 to 2 +move 7 from 1 to 2 +move 1 from 5 to 9 +move 2 from 4 to 6 +move 9 from 6 to 2 +move 18 from 1 to 7 +move 6 from 7 to 1 +move 6 from 5 to 6 +move 1 from 1 to 2 +move 19 from 2 to 7 +move 1 from 4 to 2 +move 9 from 7 to 1 +move 3 from 6 to 7 +move 1 from 9 to 4 +move 1 from 2 to 3 +move 8 from 7 to 8 +move 4 from 6 to 5 +move 2 from 6 to 3 +move 1 from 4 to 2 +move 4 from 5 to 1 +move 8 from 8 to 7 +move 17 from 7 to 8 +move 3 from 3 to 1 +move 1 from 2 to 8 +move 8 from 8 to 4 +move 8 from 8 to 7 +move 1 from 8 to 2 +move 7 from 7 to 6 +move 1 from 2 to 7 +move 5 from 7 to 8 +move 7 from 1 to 6 +move 10 from 6 to 1 +move 4 from 7 to 9 +move 3 from 9 to 7 +move 1 from 7 to 2 +move 6 from 4 to 2 +move 7 from 1 to 5 +move 4 from 2 to 5 +move 16 from 1 to 9 +move 3 from 2 to 7 +move 2 from 4 to 9 +move 4 from 1 to 6 +move 5 from 7 to 4 +move 4 from 6 to 3 +move 1 from 7 to 4 +move 1 from 6 to 9 +move 1 from 8 to 5 +move 4 from 3 to 2 +move 2 from 5 to 3 +move 3 from 6 to 2 +move 3 from 2 to 1 +move 9 from 5 to 8 +move 1 from 3 to 1 +move 10 from 8 to 1 +move 1 from 8 to 5 +move 16 from 9 to 2 +move 1 from 3 to 2 +move 12 from 1 to 9 +move 1 from 9 to 2 +move 3 from 1 to 6 +move 2 from 1 to 9 +move 3 from 6 to 8 +move 20 from 2 to 7 +move 16 from 9 to 7 +move 1 from 7 to 5 +move 2 from 5 to 9 +move 2 from 2 to 3 +move 2 from 8 to 5 +move 3 from 9 to 7 +move 2 from 5 to 2 +move 1 from 4 to 6 +move 2 from 1 to 4 +move 23 from 7 to 5 +move 4 from 8 to 5 +move 7 from 7 to 1 +move 16 from 5 to 7 +move 1 from 6 to 5 +move 1 from 2 to 4 +move 2 from 3 to 9 +move 1 from 2 to 3 +move 13 from 5 to 1 +move 1 from 3 to 8 +move 1 from 9 to 4 +move 19 from 1 to 9 +move 2 from 1 to 9 +move 22 from 9 to 8 +move 14 from 8 to 5 +move 12 from 5 to 3 +move 21 from 7 to 9 +move 14 from 9 to 7 +move 1 from 8 to 6 +move 9 from 3 to 7 +move 1 from 3 to 2 +move 4 from 4 to 1 +move 1 from 2 to 4 +move 1 from 3 to 9 +move 6 from 8 to 9 +move 4 from 1 to 7 +move 2 from 5 to 9 +move 6 from 4 to 5 +move 4 from 7 to 4 +move 1 from 5 to 3 +move 5 from 9 to 7 +move 2 from 3 to 1 +move 6 from 9 to 6 +move 1 from 1 to 6 +move 2 from 4 to 2 +move 8 from 7 to 5 +move 20 from 7 to 5 +move 2 from 5 to 6 +move 4 from 9 to 5 +move 1 from 1 to 3 +move 1 from 3 to 4 +move 1 from 2 to 7 +move 1 from 4 to 9 +move 9 from 6 to 3 +move 2 from 4 to 3 +move 28 from 5 to 3 +move 1 from 8 to 3 +move 1 from 8 to 1 +move 1 from 2 to 8 +move 1 from 6 to 2 +move 1 from 8 to 1 +move 6 from 5 to 7 +move 1 from 5 to 1 +move 1 from 9 to 2 +move 1 from 1 to 3 +move 1 from 9 to 7 +move 2 from 1 to 2 +move 11 from 3 to 8 +move 3 from 8 to 6 +move 3 from 6 to 9 +move 25 from 3 to 7 +move 4 from 3 to 8 +move 4 from 2 to 3 +move 9 from 8 to 9 +move 2 from 3 to 7 +move 3 from 8 to 2 +move 11 from 9 to 7 +move 1 from 9 to 1 +move 4 from 7 to 3 +move 1 from 1 to 5 +move 23 from 7 to 2 +move 12 from 2 to 3 +move 2 from 3 to 9 +move 12 from 2 to 1 +move 2 from 3 to 9 +move 1 from 5 to 4 +move 1 from 2 to 5 +move 1 from 9 to 4 +move 1 from 5 to 9 +move 2 from 4 to 2 +move 3 from 1 to 4 +move 1 from 2 to 1 +move 10 from 3 to 2 +move 7 from 7 to 3 +move 11 from 7 to 9 +move 5 from 3 to 1 +move 1 from 4 to 5 +move 11 from 2 to 3 +move 9 from 9 to 3 +move 3 from 9 to 4 +move 2 from 4 to 8 +move 1 from 5 to 6 +move 13 from 1 to 5 +move 3 from 3 to 8 +move 3 from 7 to 2 +move 1 from 7 to 4 +move 3 from 8 to 3 +move 8 from 3 to 8 +move 4 from 4 to 5 +move 2 from 8 to 2 +move 8 from 8 to 3 +move 1 from 6 to 3 +move 2 from 2 to 8 +move 6 from 5 to 2 +move 3 from 2 to 8 +move 1 from 1 to 7 +move 2 from 9 to 3 +move 3 from 5 to 4 +move 2 from 8 to 6 -- cgit v1.2.3