42 lines
1.1 KiB
Python
42 lines
1.1 KiB
Python
import copy
|
|
import sys
|
|
|
|
blocks_s, moves_s = (part.splitlines() for part in sys.stdin.read().split("\n\n"))
|
|
|
|
blocks: dict[str, list[str]] = {stack: [] for stack in blocks_s[-1].split()}
|
|
|
|
# this codes assumes that the lines are regular, i.e., 4 characters per "crate" in the
|
|
# form of '[X] ' (including the trailing space)
|
|
#
|
|
for block in blocks_s[-2::-1]:
|
|
for stack, index in zip(blocks, range(0, len(block), 4)):
|
|
crate = block[index + 1 : index + 2].strip()
|
|
|
|
if crate:
|
|
blocks[stack].append(crate)
|
|
|
|
# part 1 - deep copy for part 2
|
|
blocks_1 = copy.deepcopy(blocks)
|
|
|
|
for move in moves_s:
|
|
_, count_s, _, from_, _, to_ = move.strip().split()
|
|
|
|
for _i in range(int(count_s)):
|
|
blocks_1[to_].append(blocks_1[from_].pop())
|
|
|
|
# part 2
|
|
blocks_2 = copy.deepcopy(blocks)
|
|
|
|
for move in moves_s:
|
|
_, count_s, _, from_, _, to_ = move.strip().split()
|
|
count = int(count_s)
|
|
|
|
blocks_2[to_].extend(blocks_2[from_][-count:])
|
|
del blocks_2[from_][-count:]
|
|
|
|
answer_1 = "".join(s[-1] for s in blocks_1.values())
|
|
print(f"answer 1 is {answer_1}")
|
|
|
|
answer_2 = "".join(s[-1] for s in blocks_2.values())
|
|
print(f"answer 2 is {answer_2}")
|