You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
1.8 KiB
80 lines
1.8 KiB
2 years ago
|
import aoclib
|
||
|
|
||
|
from collections import deque
|
||
|
|
||
|
|
||
|
inp = aoclib.get_input(5, parser=aoclib.parse_lines)
|
||
|
|
||
|
|
||
|
def parse_more(lines):
|
||
|
stackinfo = []
|
||
|
instructions = []
|
||
|
flip = False
|
||
|
|
||
|
for line in lines:
|
||
|
if line == "":
|
||
|
flip = True
|
||
|
continue
|
||
|
elif not flip:
|
||
|
stackinfo.append(line)
|
||
|
else:
|
||
|
instructions.append(line)
|
||
|
|
||
|
stacklist = stackinfo.pop(-1)
|
||
|
haha_wtf = zip(*reversed(stackinfo))
|
||
|
stacks = {}
|
||
|
highest_stack_num = 0
|
||
|
|
||
|
for index, stack in zip(stacklist, haha_wtf):
|
||
|
if index != " ":
|
||
|
highest_stack_num = int(index)
|
||
|
stacks[int(index)] = deque([x for x in stack if x != " "])
|
||
|
|
||
|
parsed_instructions = []
|
||
|
|
||
|
for line in instructions:
|
||
|
line = line[5:] # remove the "move " at the start
|
||
|
count, rest = line.split(" from ")
|
||
|
count = int(count)
|
||
|
src, dest = rest.split(" to ")
|
||
|
src = int(src)
|
||
|
dest = int(dest)
|
||
|
parsed_instructions.append((count, src, dest))
|
||
|
|
||
|
return stacks, parsed_instructions, highest_stack_num # ??? what the fuck just happened
|
||
|
|
||
|
|
||
|
def part1():
|
||
|
stacks, instructions, stacknum = parse_more(inp)
|
||
|
|
||
|
for count, src, dest in instructions:
|
||
|
for i in range(count):
|
||
|
stacks[dest].append(stacks[src].pop())
|
||
|
|
||
|
output = ""
|
||
|
for i in range(1, stacknum+1):
|
||
|
output += stacks[i].pop()
|
||
|
|
||
|
return output
|
||
|
|
||
|
|
||
|
def part2():
|
||
|
stacks, instructions, stacknum = parse_more(inp)
|
||
|
|
||
|
for count, src, dest in instructions:
|
||
|
buf = []
|
||
|
for i in range(count):
|
||
|
buf.append(stacks[src].pop())
|
||
|
|
||
|
for crate in reversed(buf):
|
||
|
stacks[dest].append(crate)
|
||
|
|
||
|
output = ""
|
||
|
for i in range(1, stacknum+1):
|
||
|
output += stacks[i].pop()
|
||
|
|
||
|
return output
|
||
|
|
||
|
|
||
|
aoclib.main(part1, part2)
|