Skip to content

Commit 1d6d1b3

Browse files
committed
Shorten the state
1 parent 2f79d33 commit 1d6d1b3

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

20.bstate.swift

+10-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
enum Module {
22
case flip(String, [Int], UInt8)
3-
case conjunction(String, [Int], UInt64)
3+
case conjunction(String, Int, [Int], UInt64)
44
case broadcast(String, [Int])
55
case other(String)
66
}
@@ -18,7 +18,7 @@ extension Module: CustomStringConvertible {
1818
switch self {
1919
case .flip(let name, let outputs, _):
2020
return "\(name):\(stateString!)>\(outs(outputs))"
21-
case .conjunction(let name, let outputs, _):
21+
case .conjunction(let name, _, let outputs, _):
2222
return "\(name):\(stateString!)>\(outs(outputs))"
2323
case .broadcast(let name, let outputs):
2424
return "\(name):>\(outs(outputs))"
@@ -29,7 +29,8 @@ extension Module: CustomStringConvertible {
2929

3030
var stateString: String? {
3131
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))
3334
case .flip(_, _, let state): state == 1 ? "1" : "0"
3435
default: nil
3536
}
@@ -54,7 +55,7 @@ func readInput() -> [Module] {
5455
let name = String(words.first!)
5556
let partial: Module? = switch line.first {
5657
case "%": .flip("", [], 0)
57-
case "&": .conjunction("", [], 0)
58+
case "&": .conjunction("", 0, [], 0)
5859
default: name == broadcast ? .broadcast("", []) : .other(name)
5960
}
6061
let outputs = Array(words.dropFirst(1).map { String($0) })
@@ -90,11 +91,12 @@ func readInput() -> [Module] {
9091
result.append(.flip(name, js!, 0))
9192
case .conjunction:
9293
var state = UInt64.max
93-
for input in inputs[name]! {
94+
let ins = inputs[name]!
95+
for input in ins {
9496
let k = keys.firstIndex(of: input)!
9597
state ^= (1 << k)
9698
}
97-
result.append(.conjunction(name, js!, state))
99+
result.append(.conjunction(name, ins.count, js!, state))
98100
}
99101

100102
modulesIndexToName[result.count - 1] = name
@@ -139,14 +141,14 @@ func propogate(pulse: Pulse, module: Module) -> ([Pulse], Module)? {
139141
state = toggle(state)
140142
return (emit(state == 1, outputs), .flip(name, outputs, state))
141143
}
142-
case .conjunction(let name, let outputs, var state):
144+
case .conjunction(let name, let n, let outputs, var state):
143145
if pulse.value {
144146
state |= (1 << pulse.from)
145147
} else {
146148
state &= ~(1 << pulse.from)
147149
}
148150
let value = state != .max
149-
return (emit(value, outputs), .conjunction(name, outputs, state))
151+
return (emit(value, outputs), .conjunction(name, n, outputs, state))
150152
}
151153
}
152154

0 commit comments

Comments
 (0)