1
1
enum Module {
2
2
case flip( String , [ Int ] , UInt8 )
3
- case conjunction( String , [ Int ] , UInt64 )
3
+ case conjunction( String , Int , [ Int ] , UInt64 )
4
4
case broadcast( String , [ Int ] )
5
5
case other( String )
6
6
}
@@ -18,7 +18,7 @@ extension Module: CustomStringConvertible {
18
18
switch self {
19
19
case . flip( let name, let outputs, _) :
20
20
return " \( name) : \( stateString!) > \( outs ( outputs) ) "
21
- case . conjunction( let name, let outputs, _) :
21
+ case . conjunction( let name, _ , let outputs, _) :
22
22
return " \( name) : \( stateString!) > \( outs ( outputs) ) "
23
23
case . broadcast( let name, let outputs) :
24
24
return " \( name) :> \( outs ( outputs) ) "
@@ -29,7 +29,8 @@ extension Module: CustomStringConvertible {
29
29
30
30
var stateString : String ? {
31
31
switch self {
32
- case . conjunction( _, _, let state) : String ( state, radix: 2 )
32
+ case . conjunction( _, let inputCount, _, let state) :
33
+ String ( String ( state, radix: 2 ) . suffix ( inputCount) )
33
34
case . flip( _, _, let state) : state == 1 ? " 1 " : " 0 "
34
35
default : nil
35
36
}
@@ -54,7 +55,7 @@ func readInput() -> [Module] {
54
55
let name = String ( words. first!)
55
56
let partial : Module ? = switch line. first {
56
57
case " % " : . flip( " " , [ ] , 0 )
57
- case " & " : . conjunction( " " , [ ] , 0 )
58
+ case " & " : . conjunction( " " , 0 , [ ] , 0 )
58
59
default : name == broadcast ? . broadcast( " " , [ ] ) : . other( name)
59
60
}
60
61
let outputs = Array ( words. dropFirst ( 1 ) . map { String ( $0) } )
@@ -90,11 +91,12 @@ func readInput() -> [Module] {
90
91
result. append ( . flip( name, js!, 0 ) )
91
92
case . conjunction:
92
93
var state = UInt64 . max
93
- for input in inputs [ name] ! {
94
+ let ins = inputs [ name] !
95
+ for input in ins {
94
96
let k = keys. firstIndex ( of: input) !
95
97
state ^= ( 1 << k)
96
98
}
97
- result. append ( . conjunction( name, js!, state) )
99
+ result. append ( . conjunction( name, ins . count , js!, state) )
98
100
}
99
101
100
102
modulesIndexToName [ result. count - 1 ] = name
@@ -139,14 +141,14 @@ func propogate(pulse: Pulse, module: Module) -> ([Pulse], Module)? {
139
141
state = toggle ( state)
140
142
return ( emit ( state == 1 , outputs) , . flip( name, outputs, state) )
141
143
}
142
- case . conjunction( let name, let outputs, var state) :
144
+ case . conjunction( let name, let n , let outputs, var state) :
143
145
if pulse. value {
144
146
state |= ( 1 << pulse. from)
145
147
} else {
146
148
state &= ~ ( 1 << pulse. from)
147
149
}
148
150
let value = state != . max
149
- return ( emit ( value, outputs) , . conjunction( name, outputs, state) )
151
+ return ( emit ( value, outputs) , . conjunction( name, n , outputs, state) )
150
152
}
151
153
}
152
154
0 commit comments