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)