···11+import fileinput
22+import copy
33+from utils import parse_nums
44+55+INPUT = ''.join(fileinput.input())
66+board, moves = INPUT.split('\n\n')
77+88+board = board.splitlines()
99+bottom = board[-1]
1010+num_of_stacks = max(int(x) for x in bottom.split())
1111+STACKS = [[] for _ in range(num_of_stacks)]
1212+1313+for line in board[::-1]:
1414+ for i, crate in enumerate(line[1::4]):
1515+ if crate.isupper():
1616+ STACKS[i].append(crate)
1717+1818+MOVES = [parse_nums(line) for line in moves.splitlines()]
1919+2020+2121+def simulate(part_2=False):
2222+ stacks = copy.deepcopy(STACKS)
2323+ for amt, frm, to in MOVES:
2424+ frm -= 1
2525+ to -= 1
2626+2727+ crates_to_move = []
2828+ for _ in range(amt):
2929+ crate = stacks[frm].pop()
3030+ crates_to_move.append(crate)
3131+3232+ if not part_2:
3333+ crates_to_move.reverse()
3434+3535+ stacks[to].extend(crates_to_move)
3636+3737+ return ''.join(s[-1] for s in stacks)
3838+3939+print("Part 1:", simulate())
4040+print("Part 2:", simulate(part_2=True))