diff --git a/2024/24/solution.py b/2024/24/solution.py index 677112a..0048143 100644 --- a/2024/24/solution.py +++ b/2024/24/solution.py @@ -20,6 +20,19 @@ def loadGates(input_f): instructions.append(tmp) return gates, instructions +def returnLogic(x,logic,y,z,gates): + # `AND` gates output `1` if *both* inputs are `1`; if either input is `0`, these gates output `0`. + if logic == 'AND': + return 1 if gates[x] and gates[y] else 0 + + # `OR` gates output `1` if *one or both* inputs is `1`; if both inputs are `0`, these gates output `0`. + if logic == 'OR': + return 1 if gates[x] or gates[y] else 0 + + # `XOR` gates output `1` if the inputs are *different*; if the inputs are the same, these gates output `0`. + if logic == 'XOR': + return 1 if gates[x] != gates[y] else 0 + ######################################### # # # Part 1 # @@ -36,61 +49,26 @@ def part1(): x,logic,y,z = inst if x not in gates or y not in gates: - #print(inst) wait_for.append(inst) continue for wdx, w in enumerate(wait_for): x,logic,y,z = w if x in gates and y in gates: - #print(wait_for,w,wdx) - # `AND` gates output `1` if *both* inputs are `1`; if either input is `0`, these gates output `0`. - if logic == 'AND': - gates[z] = 1 if gates[x] and gates[y] else 0 - - # `OR` gates output `1` if *one or both* inputs is `1`; if both inputs are `0`, these gates output `0`. - if logic == 'OR': - gates[z] = 1 if gates[x] or gates[y] else 0 - - # `XOR` gates output `1` if the inputs are *different*; if the inputs are the same, these gates output `0`. - if logic == 'XOR': - gates[z] = 1 if gates[x] != gates[y] else 0 + gates[z] = returnLogic(x,logic,y,z,gates) wait_for.pop(wdx) - #input() x,logic,y,z = inst - # `AND` gates output `1` if *both* inputs are `1`; if either input is `0`, these gates output `0`. - if logic == 'AND': - gates[z] = 1 if gates[x] and gates[y] else 0 - - # `OR` gates output `1` if *one or both* inputs is `1`; if both inputs are `0`, these gates output `0`. - if logic == 'OR': - gates[z] = 1 if gates[x] or gates[y] else 0 - - # `XOR` gates output `1` if the inputs are *different*; if the inputs are the same, these gates output `0`. - if logic == 'XOR': - gates[z] = 1 if gates[x] != gates[y] else 0 - + gates[z] = returnLogic(x,logic,y,z,gates) + while len(wait_for) > 0: for wdx, w in enumerate(wait_for): x,logic,y,z = w if x in gates and y in gates: - #print(wait_for,w,wdx) - # `AND` gates output `1` if *both* inputs are `1`; if either input is `0`, these gates output `0`. - if logic == 'AND': - gates[z] = 1 if gates[x] and gates[y] else 0 - - # `OR` gates output `1` if *one or both* inputs is `1`; if both inputs are `0`, these gates output `0`. - if logic == 'OR': - gates[z] = 1 if gates[x] or gates[y] else 0 - - # `XOR` gates output `1` if the inputs are *different*; if the inputs are the same, these gates output `0`. - if logic == 'XOR': - gates[z] = 1 if gates[x] != gates[y] else 0 + gates[z] = returnLogic(x,logic,y,z,gates) wait_for.pop(wdx) - #dprint(gates) result = '' countZ = 0 @@ -100,13 +78,11 @@ def part1(): countZ += 1 for i in range(countZ-1,-1,-1): - #print(i) - #print(g,gates[g]) if i < 10: result += str(gates['z0'+str(i)]) else: result += str(gates['z'+str(i)]) - print(result) + #print(result) return int(result, 2) start_time = time.time()