Advent of Code 2022 day 5
Is there a more efficient way to do this? Note that from is a reserved word
in Python, so begin was used instead.
with open("5.txt") as f:
lines = f.read()
head, instructions = lines.split("\n\n")
def get_state(head):
state = {
x:"" for x in range(1, (len(head.split("\n")[0])+5)//4 + 1)
}
for line in reversed(head.split("\n")[:-1]):
for col, i in enumerate(range(1, len(line), 4), 1):
if line[i].isalpha():
state[col] += line[i]
return state
def carry_out_instruction(state, instruction):
_, amount, _, begin, _, to = instruction.split(" ")
amount = int(amount)
begin = int(begin)
to = int(to)
print(state)
for _ in range(amount):
state[to] += state[begin][-1]
state[begin] = state[begin][:-1]
print(instruction)
return state
def carry_out_instructions(state, instructions):
for line in instructions.split("\n")[:-1]:
state = carry_out_instruction(state, line)
return state
def top(state):
return "".join([packages[-1] for _, packages in state.items() if packages])
state = get_state(head)
state = carry_out_instructions(state, instructions)
print(top(state))
# part 2
def carry_out_instruction_2(state, instruction):
_, amount, _, begin, _, to = instruction.split(" ")
amount = int(amount)
begin = int(begin)
to = int(to)
print(state)
state[to] += state[begin][-amount:]
state[begin] = state[begin][:-amount]
print(instruction)
return state
def carry_out_instructions_2(state, instructions):
for line in instructions.split("\n")[:-1]:
state = carry_out_instruction_2(state, line)
return state
state2 = get_state(head)
state2 = carry_out_instructions_2(state2, instructions)
print(top(state2))