ืืืง 1
def get_list_of_opcodes(text=""):
if text != "":
return list(map(int, text.strip().split(',')))
with open('resources/input_day5.txt', 'r') as fh:
return list(map(int, fh.read().strip().split(',')))
### ACTIONS ###
def add_action(item1, item2):
return item1 + item2
def multiple_action(item1, item2):
return item1 * item2
def create_input(list_of_opcodes, item_position):
system_id = SYSTEM_ID #input("Please provide system ID: ")
list_of_opcodes[item_position] = system_id
return list_of_opcodes
def create_output(list_of_opcodes, item_position):
return print(list_of_opcodes[item_position])
### MODES ###
# position mode
def get_value_from_position(list_of_opcodes, position, is_put=False):
if is_put:
return position
value = list_of_opcodes[position]
return list_of_opcodes[position]
# immediate mode
def get_value(list_of_opcodes, value):
return value
def handle_mode_analysis(code):
if code < 10:
return (code, 0, 0, 0)
opcode = code % 100
first_param = (code // 100) % 10
second_param = (code // 1000) % 10
third_param = (code // 10000)
modes = (opcode, first_param, second_param, third_param)
return modes
def test(text=""):
list_of_opcodes = get_list_of_opcodes(text)
index = 0
while index < len(list_of_opcodes) and int(list_of_opcodes[index]) != 99:
modes = handle_mode_analysis(list_of_opcodes[index])
code = modes[0]
if code == 1 or code == 2:
item1 = modes_dict.get(modes[1])(list_of_opcodes, list_of_opcodes[index + 1])
item2 = modes_dict.get(modes[2])(list_of_opcodes, list_of_opcodes[index + 2])
place = modes_dict.get(modes[3])(list_of_opcodes, list_of_opcodes[index + 3], True)
result = actions.get(code)(item1, item2)
list_of_opcodes[place] = result
index += 4
elif code == 3 or code == 4:
actions.get(code)(list_of_opcodes, list_of_opcodes[index + 1])
index += 2
return list_of_opcodes[0]
# day 5 - part I ==> 5182797
actions = {1: add_action, 2: multiple_action, 3: create_input, 4: create_output}
modes_dict = {0: get_value_from_position, 1: get_value}
SYSTEM_ID = 1
#test("3,0,4,0,99")
#test("1002,4,3,4,33")
test()
ืืืง 2
def get_list_of_opcodes(text=""):
if text != "":
return list(map(int, text.strip().split(',')))
with open('resources/input_day5.txt', 'r') as fh:
return list(map(int, fh.read().strip().split(',')))
### ACTIONS ###
def add_action(item1, item2):
return item1 + item2
def multiple_action(item1, item2):
return item1 * item2
def create_input(list_of_opcodes, item_position):
system_id = int(input("Please provide system ID: "))
list_of_opcodes[item_position] = system_id
return list_of_opcodes
def create_output(list_of_opcodes, item_position):
#print(item_position)
return print(list_of_opcodes[item_position])
### MODES ###
# position mode
def get_value_from_position(list_of_opcodes, position, is_put=False):
if is_put:
return position
value = list_of_opcodes[position]
return list_of_opcodes[position]
# immediate mode
def get_value(list_of_opcodes, value):
return value
def handle_mode_analysis(code):
if code < 10:
return (code, 0, 0, 0)
opcode = code % 100
first_param = (code // 100) % 10
second_param = (code // 1000) % 10
third_param = (code // 10000)
modes = (opcode, first_param, second_param, third_param)
return modes
def get_param(list_of_opcodes, modes, index):
params = [modes_dict.get(modes[i])(list_of_opcodes, list_of_opcodes[index + i]) for i in range(1, 3)]
#print(tuple(params))
return tuple(params)
def test(text=""):
list_of_opcodes = get_list_of_opcodes(text)
index = 0
while index < len(list_of_opcodes) and int(list_of_opcodes[index]) != 99:
modes = handle_mode_analysis(list_of_opcodes[index])
code = modes[0]
if code == 1 or code == 2:
param1, param2 = get_param(list_of_opcodes, modes, index)
place = modes_dict.get(modes[3])(list_of_opcodes, list_of_opcodes[index + 3], True)
result = actions.get(code)(param1, param2)
list_of_opcodes[place] = result
index += 4
elif code == 3 or code == 4:
actions.get(code)(list_of_opcodes, list_of_opcodes[index + 1])
index += 2
elif code == 5 or code == 6:
param1, param2 = get_param(list_of_opcodes, modes, index)
if (code == 5 and param1 != 0) or (code == 6 and param1 == 0):
index = param2
else:
index += 3
elif code == 7 or code == 8:
param1, param2 = get_param(list_of_opcodes, modes, index)
place = modes_dict.get(modes[3])(list_of_opcodes, list_of_opcodes[index + 3], True)
if (code == 7 and param1 < param2) or (code == 8 and param1 == param2):
list_of_opcodes[place] = 1
else:
list_of_opcodes[place] = 0
index += 4
return list_of_opcodes[0]
# day 5 - part I ==> 5182797
actions = {1: add_action, 2: multiple_action, 3: create_input, 4: create_output}
modes_dict = {0: get_value_from_position, 1: get_value}
SYSTEM_ID = 1
#test("3,0,4,0,99")
#test("1002,4,3,4,33")
# day 5 - part II ==> 12077198
#test("3,9,8,9,10,9,4,9,99,-1,8") == 0
#test("3,9,7,9,10,9,4,9,99,-1,8") == 1
#test("3,3,1108,-1,8,3,4,3,99") == 0
#test("3,3,1107,-1,8,3,4,3,99") == 1
#test("3,12,6,12,15,1,13,14,13,4,13,99,-1,0,1,9")
#test("3,3,1105,-1,9,1101,0,0,12,4,12,99,1")
#test("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")
test()