@@ -84,15 +84,30 @@ def find_invalid(output: str, pattern) -> set[str]:
84
84
85
85
return least_wrong
86
86
87
+ assert max_bit >= 3
88
+
87
89
# First one is a half adder, that's a simple pattern
88
90
invalid = find_invalid ("z00" , ["XOR" , "x00" , "y00" ])
89
91
# Second one is missing a reference to the before-previous adder, so it's a
90
92
# slightly different patterns
91
93
invalid |= find_invalid (
92
94
"z01" , ["XOR" , ["AND" , "x00" , "y00" ], ["XOR" , "x01" , "y01" ]]
93
95
)
96
+ # Needed a second lookback to determine that `ktp` is valid
97
+ invalid |= find_invalid (
98
+ "z02" ,
99
+ [
100
+ "XOR" ,
101
+ ["XOR" , "x02" , "y02" ],
102
+ [
103
+ "OR" ,
104
+ ["AND" , "x01" , "y01" ],
105
+ ["AND" , ["XOR" , "x01" , "y01" ], ["AND" , "x00" , "y00" ]],
106
+ ],
107
+ ],
108
+ )
94
109
95
- for n in range (2 , max_bit ):
110
+ for n in range (3 , max_bit ):
96
111
xcurr = f"x{ n :02} "
97
112
ycurr = f"y{ n :02} "
98
113
zcurr = f"z{ n :02} "
@@ -104,7 +119,11 @@ def find_invalid(output: str, pattern) -> set[str]:
104
119
[
105
120
"XOR" ,
106
121
["XOR" , xcurr , ycurr ],
107
- ["OR" , ["AND" , xprev , yprev ], ["AND" , ["XOR" , xprev , yprev ], None ]],
122
+ [
123
+ "OR" ,
124
+ ["AND" , xprev , yprev ],
125
+ ["AND" , ["XOR" , xprev , yprev ], ["OR" , None , None ]],
126
+ ],
108
127
],
109
128
)
110
129
0 commit comments