Solution to problem 12 in Python
This commit is contained in:
parent
30f0f8cdd9
commit
772abe6588
108
src/Year_2016/P12.py
Normal file
108
src/Year_2016/P12.py
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
# --- Day 12: Leonardo's Monorail ---
|
||||||
|
|
||||||
|
# You finally reach the top floor of this building: a garden with a slanted
|
||||||
|
# glass ceiling. Looks like there are no more stars to be had.
|
||||||
|
|
||||||
|
# While sitting on a nearby bench amidst some tiger lilies, you manage to
|
||||||
|
# decrypt some of the files you extracted from the servers downstairs.
|
||||||
|
|
||||||
|
# According to these documents, Easter Bunny HQ isn't just this building - it's
|
||||||
|
# a collection of buildings in the nearby area. They're all connected by a
|
||||||
|
# local monorail, and there's another building not far from here!
|
||||||
|
# Unfortunately, being night, the monorail is currently not operating.
|
||||||
|
|
||||||
|
# You remotely connect to the monorail control systems and discover that the
|
||||||
|
# boot sequence expects a password. The password-checking logic (your puzzle
|
||||||
|
# input) is easy to extract, but the code it uses is strange: it's assembunny
|
||||||
|
# code designed for the new computer you just assembled. You'll have to execute
|
||||||
|
# the code and get the password.
|
||||||
|
|
||||||
|
# The assembunny code you've extracted operates on four registers (a, b, c, and
|
||||||
|
# d) that start at 0 and can hold any integer. However, it seems to make use of
|
||||||
|
# only a few instructions:
|
||||||
|
|
||||||
|
# cpy x y copies x (either an integer or the value of a register) into
|
||||||
|
# register y.
|
||||||
|
# inc x increases the value of register x by one.
|
||||||
|
# dec x decreases the value of register x by one.
|
||||||
|
# jnz x y jumps to an instruction y away (positive means forward; negative
|
||||||
|
# means backward), but only if x is not zero.
|
||||||
|
|
||||||
|
# The jnz instruction moves relative to itself: an offset of -1 would continue
|
||||||
|
# at the previous instruction, while an offset of 2 would skip over the next
|
||||||
|
# instruction.
|
||||||
|
|
||||||
|
# For example:
|
||||||
|
|
||||||
|
# cpy 41 a
|
||||||
|
# inc a
|
||||||
|
# inc a
|
||||||
|
# dec a
|
||||||
|
# jnz a 2
|
||||||
|
# dec a
|
||||||
|
|
||||||
|
# The above code would set register a to 41, increase its value by 2, decrease
|
||||||
|
# its value by 1, and then skip the last dec a (because a is not zero, so the
|
||||||
|
# jnz a 2 skips it), leaving register a at 42. When you move past the last
|
||||||
|
# instruction, the program halts.
|
||||||
|
|
||||||
|
# After executing the assembunny code in your puzzle input, what value is left
|
||||||
|
# in register a?
|
||||||
|
|
||||||
|
|
||||||
|
with open("files/P12.txt") as f:
|
||||||
|
lines = [line.strip().split() for line in f]
|
||||||
|
|
||||||
|
|
||||||
|
def value(key: str, dic: dict[str, int]) -> int:
|
||||||
|
return dic[key] if key in dic else int(key)
|
||||||
|
|
||||||
|
|
||||||
|
def part_1() -> None:
|
||||||
|
register = {"a": 0, "b": 0, "c": 0, "d": 0}
|
||||||
|
instruction = 0
|
||||||
|
while instruction != len(lines):
|
||||||
|
instr = lines[instruction]
|
||||||
|
if instr[0] == "cpy":
|
||||||
|
register[instr[2]] = value(instr[1], register)
|
||||||
|
elif instr[0] == "inc":
|
||||||
|
register[instr[1]] += 1
|
||||||
|
elif instr[0] == "dec":
|
||||||
|
register[instr[1]] -= 1
|
||||||
|
elif instr[0] == "jnz" and value(instr[1], register) != 0:
|
||||||
|
instruction += int(instr[2])
|
||||||
|
continue
|
||||||
|
instruction += 1
|
||||||
|
print(f"The register a has the following value: {register['a']}")
|
||||||
|
|
||||||
|
|
||||||
|
# --- Part Two ---
|
||||||
|
|
||||||
|
# As you head down the fire escape to the monorail, you notice it didn't start;
|
||||||
|
# register c needs to be initialized to the position of the ignition key.
|
||||||
|
|
||||||
|
# If you instead initialize register c to be 1, what value is now left in
|
||||||
|
# register a?
|
||||||
|
|
||||||
|
|
||||||
|
def part_2() -> None:
|
||||||
|
register = {"a": 0, "b": 0, "c": 1, "d": 0}
|
||||||
|
instruction = 0
|
||||||
|
while instruction != len(lines):
|
||||||
|
instr = lines[instruction]
|
||||||
|
if instr[0] == "cpy":
|
||||||
|
register[instr[2]] = value(instr[1], register)
|
||||||
|
elif instr[0] == "inc":
|
||||||
|
register[instr[1]] += 1
|
||||||
|
elif instr[0] == "dec":
|
||||||
|
register[instr[1]] -= 1
|
||||||
|
elif instr[0] == "jnz" and value(instr[1], register) != 0:
|
||||||
|
instruction += int(instr[2])
|
||||||
|
continue
|
||||||
|
instruction += 1
|
||||||
|
print(f"The value left in register a is: {register['a']}")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
part_1()
|
||||||
|
part_2()
|
Loading…
Reference in New Issue
Block a user