Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Input: lines like "<code>: <0 or 1>", then blank line,
- # then lines like "<code> (OR/AND/XOR) <code> -> <code>"
- # Output: 2^0 * z00 + 2^1 * z01 + ...
- values = {}
- rules = {}
- z_values = []
- found_blank_line = False
- file = open("24_input.txt", "r")
- for line in file:
- line = line.replace("\n", "")
- if line == "":
- found_blank_line = True
- continue
- if not found_blank_line:
- parts = line.split(": ")
- values[parts[0]] = int(parts[1])
- if parts[0][0] == "z":
- z_values.append(parts[0])
- continue
- parts = line.split(" -> ")
- rules[parts[0]] = parts[1]
- if parts[1][0] == "z":
- z_values.append(parts[1])
- z_values = list(set(z_values))
- while True:
- remaining_rules = rules.copy()
- for rule in rules:
- parts = rule.split(" ")
- code1, operand, code2, result = parts[0], parts[1], parts[2], rules[rule]
- if code1 in values and code2 in values:
- if operand == "AND":
- values[result] = values[code1] & values[code2]
- if operand == "OR":
- values[result] = values[code1] | values[code2]
- if operand == "XOR":
- values[result] = values[code1] ^ values[code2]
- del remaining_rules[rule]
- rules = remaining_rules
- got_all_z_values = True
- for z_value in z_values:
- if not (z_value in values):
- got_all_z_values = False
- break
- if got_all_z_values:
- break
- total = 0
- for z_value in z_values:
- if values[z_value] == 1:
- total += 2 ** int(z_value[1:])
- print (total)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement