Solution to problem 5 in Python

This commit is contained in:
David Doblas Jiménez 2022-03-04 09:29:23 +01:00
parent b06905b590
commit 21fd87f2ea

View File

@ -153,5 +153,149 @@ def part_1() -> None:
pos += 2
# --- Part Two ---
# The air conditioner comes online! Its cold air feels good for a while, but
# then the TEST alarms start to go off. Since the air conditioner can't vent
# its heat anywhere but back into the spacecraft, it's actually making the air
# inside the ship warmer.
# Instead, you'll need to use the TEST to extend the thermal radiators.
# Fortunately, the diagnostic program (your puzzle input) is already equipped
# for this. Unfortunately, your Intcode computer is not.
# Your computer is only missing a few opcodes:
# Opcode 5 is jump-if-true: if the first parameter is non-zero, it sets the
# instruction pointer to the value from the second parameter. Otherwise, it
# does nothing.
# Opcode 6 is jump-if-false: if the first parameter is zero, it sets the
# instruction pointer to the value from the second parameter. Otherwise, it
# does nothing.
# Opcode 7 is less than: if the first parameter is less than the second
# parameter, it stores 1 in the position given by the third parameter.
# Otherwise, it stores 0.
# Opcode 8 is equals: if the first parameter is equal to the second
# parameter, it stores 1 in the position given by the third parameter.
# Otherwise, it stores 0.
# Like all instructions, these instructions need to support parameter modes as
# described above.
# Normally, after an instruction is finished, the instruction pointer increases
# by the number of values in that instruction. However, if the instruction
# modifies the instruction pointer, that value is used and the instruction
# pointer is not automatically increased.
# For example, here are several programs that take one input, compare it to the
# value 8, and then produce one output:
# 3,9,8,9,10,9,4,9,99,-1,8 - Using position mode, consider whether the
# input is equal to 8; output 1 (if it is) or 0 (if it is not).
# 3,9,7,9,10,9,4,9,99,-1,8 - Using position mode, consider whether the
# input is less than 8; output 1 (if it is) or 0 (if it is not).
# 3,3,1108,-1,8,3,4,3,99 - Using immediate mode, consider whether the input
# is equal to 8; output 1 (if it is) or 0 (if it is not).
# 3,3,1107,-1,8,3,4,3,99 - Using immediate mode, consider whether the input
# is less than 8; output 1 (if it is) or 0 (if it is not).
# Here are some jump tests that take an input, then output 0 if the input was
# zero or 1 if the input was non-zero:
# 3,12,6,12,15,1,13,14,13,4,13,99,-1,0,1,9 (using position mode)
# 3,3,1105,-1,9,1101,0,0,12,4,12,99,1 (using immediate mode)
# Here's a larger example:
# 3,21,1008,21,8,20,1005,20,22,107,8,21,20,1006,20,31,
# 1106,0,36,98,0,0,1002,21,125,20,4,20,1105,1,46,104,
# 999,1105,1,46,1101,1000,1,20,4,20,1105,1,46,98,99
# The above example program uses an input instruction to ask for a single
# number. The program will then output 999 if the input value is below 8,
# output 1000 if the input value is equal to 8, or output 1001 if the input
# value is greater than 8.
# This time, when the TEST diagnostic program runs its input instruction to get
# the ID of the system to test, provide it 5, the ID for the ship's thermal
# radiator controller. This diagnostic test suite only outputs one number, the
# diagnostic code.
# What is the diagnostic code for system ID 5?
def part_2() -> None:
pos = 0
while code[pos] != 99:
opcode: list[str] = intcodeArray(code[pos])
# add two values
if opcode[4] == 1:
i2 = pos + 1
i3 = pos + 2
o4 = code[pos + 3]
code[o4] = value(opcode[2], i2) + value(opcode[1], i3)
pos += 4
# multiply two values
elif opcode[4] == 2:
i2 = pos + 1
i3 = pos + 2
o4 = code[pos + 3]
code[o4] = value(opcode[2], i2) * value(opcode[1], i3)
pos += 4
# take an input value
elif opcode[4] == 3:
print("What is your input value?")
choice = input()
choice = int(choice)
if opcode[2] == 0:
code[code[pos + 1]] = choice
else:
code[pos + 1] = choice
pos += 2
# print an output value
elif opcode[4] == 4:
_value = value(opcode[2], pos + 1)
if _value != 0:
print(f"The diagnostic code is {_value}")
pos += 2
# jump if true
elif opcode[4] == 5:
i2 = pos + 1
i3 = pos + 2
if value(opcode[2], i2) != 0:
pos = value(opcode[1], i3)
else:
pos += 3
# jump if false
elif opcode[4] == 6:
i2 = pos + 1
i3 = pos + 2
if value(opcode[2], i2) == 0:
pos = value(opcode[1], i3)
else:
pos += 3
# less than
elif opcode[4] == 7:
i2 = pos + 1
i3 = pos + 2
i4 = code[pos + 3]
if value(opcode[2], i2) < value(opcode[1], i3):
code[i4] = 1
else:
code[i4] = 0
pos += 4
# equal
elif opcode[4] == 8:
i2 = pos + 1
i3 = pos + 2
i4 = code[pos + 3]
if value(opcode[2], i2) == value(opcode[1], i3):
code[i4] = 1
else:
code[i4] = 0
pos += 4
if __name__ == "__main__":
part_1()
# part_1()
part_2()