46 lines
1.2 KiB
Python
46 lines
1.2 KiB
Python
|
|
from copy import deepcopy
|
||
|
|
from collections import defaultdict
|
||
|
|
|
||
|
|
from output import ints
|
||
|
|
|
||
|
|
|
||
|
|
def solve(data):
|
||
|
|
state, program = data.split("\n\n")
|
||
|
|
labels, *state = state.splitlines()[::-1]
|
||
|
|
num = max(ints(labels))
|
||
|
|
stacks = defaultdict(list)
|
||
|
|
for r, text in enumerate(state):
|
||
|
|
for c in range(4 * num):
|
||
|
|
if c % 4 == 1:
|
||
|
|
if text[c] != " ":
|
||
|
|
stacks[c // 4 + 1].append(text[c])
|
||
|
|
p1 = _act(program, deepcopy(stacks))
|
||
|
|
p2 = _act(program, deepcopy(stacks), r=9001)
|
||
|
|
return p1, p2
|
||
|
|
|
||
|
|
|
||
|
|
def _act(program, stacks, r=9000):
|
||
|
|
for line in program.splitlines():
|
||
|
|
count, old, new = ints(line)
|
||
|
|
match r:
|
||
|
|
case 9000:
|
||
|
|
for _ in range(count):
|
||
|
|
stacks[new].append(stacks[old].pop())
|
||
|
|
case 9001:
|
||
|
|
stacks[new] += stacks[old][-count:]
|
||
|
|
stacks[old] = stacks[old][:-count]
|
||
|
|
return "".join(s[-1] for s in stacks.values())
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
with open("./input/05.txt", "r") as f:
|
||
|
|
inp = f.read()
|
||
|
|
|
||
|
|
p1, p2 = solve(inp)
|
||
|
|
|
||
|
|
print(p1)
|
||
|
|
print(p2)
|
||
|
|
|
||
|
|
assert p1 == "ZRLJGSCTR"
|
||
|
|
assert p2 == "PRTTGRFPB"
|