-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday05.py
66 lines (55 loc) · 1.87 KB
/
day05.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
from collections import namedtuple
from copy import deepcopy
DAY = 5
RAW_INPUT = None
INPUT = None
def load_input(use_test_input=False):
global RAW_INPUT
path = f'inputs/day{DAY:02}.txt'
if use_test_input:
path = f'inputs/day{DAY:02}_test.txt'
with open(path) as f:
RAW_INPUT = f.read()
def parse_input():
global INPUT
LINES = RAW_INPUT.split('\n')
blank_index = LINES.index('')
SETUP = LINES[:blank_index]
INSTRUCTIONS = LINES[blank_index+1:-1]
# Parsing initial stacks
num_stacks = len(SETUP[-1].split())
stacks = {i+1: [] for i in range(num_stacks)}
for row in SETUP[:-1]:
for i in range(0, len(row)//4 + 1):
box_name = row[4*i + 1]
if box_name != ' ':
stacks[i+1].insert(0, box_name)
# Parsing instructions
Instruction = namedtuple('Instr', ['amount', 'from_stack', 'to_stack'])
instructions = []
for line in INSTRUCTIONS:
pieces = line.split()
instr = Instruction(int(pieces[1]), int(pieces[3]), int(pieces[5]))
instructions.append(instr)
INPUT = (stacks, instructions)
def part1():
initial_stacks, instructions = INPUT
stacks = deepcopy(initial_stacks)
for (amount, from_stack, to_stack) in instructions:
for _ in range(amount):
stacks[to_stack].append(stacks[from_stack].pop())
return ''.join(stacks[i][-1] for i in stacks)
def part2():
initial_stacks, instructions = INPUT
stacks = deepcopy(initial_stacks)
for (amount, from_stack, to_stack) in instructions:
stacks[to_stack] += stacks[from_stack][-amount:]
stacks[from_stack] = stacks[from_stack][:-amount]
return ''.join(stacks[i][-1] for i in stacks)
def main():
load_input()
parse_input()
print('PART 1:', part1())
print('PART 2:', part2())
if __name__ == "__main__":
main()