Advertisement
Guest User

Untitled

a guest
Dec 24th, 2024
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.19 KB | None | 0 0
  1. # Input: lines like "<code>: <0 or 1>", then blank line,
  2. #        then lines like "<code> (OR/AND/XOR) <code> -> <code>"
  3. # Output: should result in
  4. #           (2^0 * x00 + 2^1 * x01 + ...)
  5. #         + (2^0 * y00 + 2^1 * y01 + ...)
  6. #         = (2^0 * z00 + 2^1 * z01 + ...)
  7. #         but four pairs of rules have their outputs swapped
  8. #         output those eight outputs (sorted, joined by commas)
  9.  
  10. values = {}
  11. rules = {}
  12. z_values = []
  13.  
  14. found_blank_line = False
  15. file = open("24_input.txt", "r")
  16. for line in file:
  17.   line = line.replace("\n", "")
  18.   if line == "":
  19.     found_blank_line = True
  20.     continue
  21.   if not found_blank_line:
  22.     parts = line.split(": ")
  23.     if parts[0][0] == "z":
  24.       z_values.append(parts[0])
  25.     continue
  26.   parts = line.split(" -> ")
  27.   rules[parts[0]] = parts[1]
  28.   if parts[1][0] == "z":
  29.     z_values.append(parts[1])
  30.  
  31. z_values = list(set(z_values))
  32. z_values.sort()
  33.  
  34. for reference_z_value in z_values:
  35.   z_index = reference_z_value[1:]
  36.   values["x" + z_index] = 0
  37.   values["y" + z_index] = 0
  38.   sources = ["x" + z_index, "y" + z_index]
  39.   new_rules = ["                  "] * 5
  40.   while True:
  41.     found_something = False
  42.     remaining_rules = rules.copy()
  43.     for rule in rules:
  44.       parts = rule.split(" ")
  45.       code1, operand, code2, result = parts[0], parts[1], parts[2], rules[rule]
  46.       if code1 in values and code2 in values:
  47.         if operand == "AND":
  48.           values[result] = values[code1] & values[code2]
  49.           if code1 in sources and code2 in sources:
  50.             new_rules[3] = rule + " -> " + rules[rule]
  51.           else:
  52.             new_rules[2] = rule + " -> " + rules[rule]
  53.         if operand == "OR":
  54.           values[result] = values[code1] | values[code2]
  55.           new_rules[4] = rule + " -> " + rules[rule]
  56.         if operand == "XOR":
  57.           values[result] = values[code1] ^ values[code2]
  58.           if code1 in sources and code2 in sources:
  59.             new_rules[0] = rule + " -> " + rules[rule]
  60.           else:
  61.             new_rules[1] = rule + " -> " + rules[rule]
  62.         found_something = True
  63.         del remaining_rules[rule]
  64.     rules = remaining_rules
  65.     if not found_something:
  66.       print (new_rules)
  67.       break
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement