1
0
mirror of https://github.com/chylex/Advent-of-Code.git synced 2024-10-17 02:42:45 +02:00
Advent-of-Code/2022/05/main.py
2022-12-14 10:45:13 +01:00

71 lines
1.8 KiB
Python

import itertools
import re
from utils.input import read_input_lines
class Instruction:
def __init__(self, line: str):
parsed = re.search(r"move (\d+) from (\d+) to (\d+)", line)
self.moved_count = int(parsed.group(1))
self.from_column = int(parsed.group(2)) - 1
self.to_column = int(parsed.group(3)) - 1
lines = iter(read_input_lines())
initial_stack_configuration_lines = list(itertools.takewhile(lambda line: len(line) > 0, lines))[:-1]
instructions = [Instruction(line) for line in lines]
initial_stacks = list()
for line in reversed(initial_stack_configuration_lines):
for stack_index, character_index in enumerate(range(1, len(line), 4)):
crate = line[character_index]
if crate == " ":
continue
for i in range(len(initial_stacks), stack_index + 1):
initial_stacks.append(list())
initial_stacks[stack_index].append(crate)
def copy_initial_stacks() -> list[list[str]]:
return [stack.copy() for stack in initial_stacks]
def print_stacks(title: str, stacks: list[list[str]]):
print(f"Top of each stack in {title}: ", end = "")
for stack in stacks:
print(stack[-1], end = "")
print()
stacks = copy_initial_stacks()
for instruction in instructions:
for _ in range(instruction.moved_count):
moved_crate = stacks[instruction.from_column].pop()
stacks[instruction.to_column].append(moved_crate)
print_stacks("part 1", stacks)
stacks = copy_initial_stacks()
for instruction in instructions:
taken_crates = list()
for _ in range(instruction.moved_count):
taken_crates.append(stacks[instruction.from_column].pop())
for crate in reversed(taken_crates):
stacks[instruction.to_column].append(crate)
print_stacks("part 2", stacks)