Skip to content

Commit 2392b2d

Browse files
committed
Solve 2024 day 24 part 1
1 parent 1580750 commit 2392b2d

File tree

3 files changed

+461
-0
lines changed

3 files changed

+461
-0
lines changed
Lines changed: 313 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,313 @@
1+
x00: 1
2+
x01: 1
3+
x02: 0
4+
x03: 0
5+
x04: 0
6+
x05: 1
7+
x06: 0
8+
x07: 1
9+
x08: 1
10+
x09: 0
11+
x10: 1
12+
x11: 0
13+
x12: 0
14+
x13: 0
15+
x14: 1
16+
x15: 1
17+
x16: 1
18+
x17: 0
19+
x18: 0
20+
x19: 0
21+
x20: 1
22+
x21: 0
23+
x22: 1
24+
x23: 0
25+
x24: 0
26+
x25: 0
27+
x26: 0
28+
x27: 1
29+
x28: 0
30+
x29: 1
31+
x30: 0
32+
x31: 0
33+
x32: 1
34+
x33: 1
35+
x34: 1
36+
x35: 0
37+
x36: 0
38+
x37: 0
39+
x38: 1
40+
x39: 1
41+
x40: 1
42+
x41: 1
43+
x42: 0
44+
x43: 0
45+
x44: 1
46+
y00: 1
47+
y01: 0
48+
y02: 1
49+
y03: 1
50+
y04: 0
51+
y05: 0
52+
y06: 1
53+
y07: 1
54+
y08: 0
55+
y09: 1
56+
y10: 1
57+
y11: 1
58+
y12: 1
59+
y13: 0
60+
y14: 1
61+
y15: 0
62+
y16: 0
63+
y17: 1
64+
y18: 0
65+
y19: 1
66+
y20: 0
67+
y21: 1
68+
y22: 1
69+
y23: 1
70+
y24: 0
71+
y25: 1
72+
y26: 1
73+
y27: 0
74+
y28: 1
75+
y29: 1
76+
y30: 0
77+
y31: 1
78+
y32: 0
79+
y33: 0
80+
y34: 0
81+
y35: 1
82+
y36: 1
83+
y37: 1
84+
y38: 1
85+
y39: 1
86+
y40: 0
87+
y41: 1
88+
y42: 0
89+
y43: 1
90+
y44: 1
91+
92+
x23 AND y23 -> mhq
93+
dbf XOR dsb -> z35
94+
x41 AND y41 -> qss
95+
kbv AND ctw -> qhg
96+
djs OR tgk -> ccp
97+
nmw AND bgp -> bcr
98+
jns OR npn -> jbv
99+
y29 AND x29 -> tjt
100+
y17 AND x17 -> nhh
101+
kmm AND ptk -> vnr
102+
hbr AND qfp -> mjr
103+
qfk AND pvj -> ndp
104+
tvb XOR jhd -> z25
105+
y29 XOR x29 -> wft
106+
rqd AND cns -> grb
107+
jbv AND kjg -> vjg
108+
tvm XOR pkw -> z38
109+
vwd AND kvv -> mgw
110+
nmw XOR bgp -> z02
111+
cdc OR stq -> z21
112+
x16 XOR y16 -> mft
113+
x37 XOR y37 -> hbr
114+
x24 XOR y24 -> cns
115+
y40 XOR x40 -> pgc
116+
ccd OR cst -> cbk
117+
fht XOR ddw -> z20
118+
wft AND nnq -> stm
119+
srk AND sjm -> fwg
120+
y06 AND x06 -> cnm
121+
gqg XOR pmv -> z07
122+
ndp OR nfq -> rgv
123+
bsm OR vsc -> fjn
124+
x15 XOR y15 -> srk
125+
bwv XOR vbq -> z42
126+
kbv XOR ctw -> z31
127+
x10 XOR y10 -> htc
128+
x08 XOR y08 -> knh
129+
fgc AND dvm -> nfn
130+
y03 AND x03 -> ssj
131+
x26 XOR y26 -> spf
132+
y02 AND x02 -> psw
133+
x36 XOR y36 -> fcf
134+
ptj OR dtg -> spg
135+
stm OR tjt -> gsj
136+
mmw XOR ncf -> z23
137+
y26 AND x26 -> csh
138+
rrj AND mft -> tnt
139+
x05 XOR y05 -> chs
140+
x16 AND y16 -> khn
141+
nqm AND fmf -> tgq
142+
wft XOR nnq -> z29
143+
y13 AND x13 -> ggg
144+
rcb OR khg -> mfp
145+
y28 AND x28 -> wgd
146+
csf AND bck -> qsg
147+
x31 XOR y31 -> kbv
148+
rrj XOR mft -> z16
149+
hhg AND ccp -> msp
150+
y00 XOR x00 -> z00
151+
x25 XOR y25 -> khg
152+
x42 AND y42 -> djs
153+
ggg OR hvg -> csf
154+
pps XOR wdg -> vdc
155+
y04 XOR x04 -> pvj
156+
qtg AND knh -> ccd
157+
x27 AND y27 -> jns
158+
jdk OR pmr -> spk
159+
nhm XOR jmr -> z18
160+
fpk AND dfh -> ccr
161+
x06 XOR y06 -> bgq
162+
x38 AND y38 -> dcc
163+
x22 XOR y22 -> jkq
164+
vbq AND bwv -> tgk
165+
x14 XOR y14 -> bck
166+
fjn AND htc -> dtg
167+
kfd XOR rtg -> z19
168+
bvk OR khh -> nmw
169+
x34 XOR y34 -> ptk
170+
mmw AND ncf -> rkf
171+
y11 AND x11 -> rvg
172+
wgd OR vjg -> nnq
173+
qss OR wtt -> bwv
174+
dmb OR crv -> ddw
175+
y08 AND x08 -> cst
176+
nhh OR tgq -> jmr
177+
cpt XOR fqc -> z32
178+
tnt OR khn -> fmf
179+
fbk AND tcq -> hvg
180+
spq XOR gpk -> z01
181+
x02 XOR y02 -> bgp
182+
x20 AND y20 -> fct
183+
x36 AND y36 -> jbq
184+
x12 AND y12 -> z12
185+
mfp XOR spf -> z26
186+
spg XOR hhm -> z11
187+
y32 AND x32 -> rjq
188+
y04 AND x04 -> nfq
189+
pkj OR msp -> kvv
190+
tvc OR dcc -> dvm
191+
vnr OR krb -> dbf
192+
fmf XOR nqm -> z17
193+
rtg AND kfd -> dmb
194+
fvh XOR pgc -> z40
195+
fcf XOR spk -> z36
196+
pvc OR gst -> kmm
197+
cbk AND nbm -> vsc
198+
x09 AND y09 -> bsm
199+
x07 XOR y07 -> gqg
200+
ptk XOR kmm -> z34
201+
x28 XOR y28 -> kjg
202+
dbm OR jft -> qtg
203+
jbr AND wcs -> z33
204+
y42 XOR x42 -> vbq
205+
y00 AND x00 -> spq
206+
y19 XOR x19 -> kfd
207+
tbn OR grb -> jhd
208+
kvv XOR vwd -> z44
209+
wcs XOR jbr -> gst
210+
srk XOR sjm -> z15
211+
y39 AND x39 -> cbf
212+
bgq XOR wdh -> z06
213+
bbn AND rsc -> cdc
214+
y18 XOR x18 -> nhm
215+
tvm AND pkw -> tvc
216+
x23 XOR y23 -> ncf
217+
x19 AND y19 -> crv
218+
qhg OR gnc -> fqc
219+
jbv XOR kjg -> z28
220+
y05 AND x05 -> nph
221+
x32 XOR y32 -> cpt
222+
x31 AND y31 -> gnc
223+
ccp XOR hhg -> z43
224+
x15 AND y15 -> gtf
225+
jmr AND nhm -> ptd
226+
x10 AND y10 -> ptj
227+
bgq AND wdh -> dgh
228+
ftw XOR gsj -> z30
229+
x44 AND y44 -> bds
230+
fjn XOR htc -> z10
231+
y43 AND x43 -> pkj
232+
y30 AND x30 -> nmj
233+
tvb AND jhd -> rcb
234+
x40 AND y40 -> gdm
235+
mgw OR bds -> z45
236+
fdv AND dfs -> wtt
237+
rkf OR mhq -> rqd
238+
pvj XOR qfk -> z04
239+
pmv AND gqg -> dbm
240+
x21 XOR y21 -> bbn
241+
x38 XOR y38 -> tvm
242+
mjr OR kpb -> pkw
243+
jbq OR vmj -> qfp
244+
jkq XOR nhn -> z22
245+
qfn OR fct -> rsc
246+
x30 XOR y30 -> ftw
247+
y35 XOR x35 -> dsb
248+
y24 AND x24 -> tbn
249+
fcf AND spk -> vmj
250+
cnm OR dgh -> pmv
251+
x27 XOR y27 -> mcv
252+
chs XOR rgv -> z05
253+
vdc OR kcp -> fbk
254+
y39 XOR x39 -> fgc
255+
x13 XOR y13 -> tcq
256+
ssj OR ccr -> qfk
257+
fwg OR gtf -> rrj
258+
knh XOR qtg -> z08
259+
fqc AND cpt -> nfh
260+
y17 XOR x17 -> nqm
261+
hbr XOR qfp -> z37
262+
y22 AND x22 -> nrq
263+
y01 XOR x01 -> gpk
264+
jhv OR nph -> wdh
265+
dfs XOR fdv -> z41
266+
gqb OR csh -> mbp
267+
dvm XOR fgc -> z39
268+
y03 XOR x03 -> fpk
269+
mfp AND spf -> gqb
270+
x44 XOR y44 -> vwd
271+
gpk AND spq -> bvk
272+
x21 AND y21 -> stq
273+
cbf OR nfn -> fvh
274+
spg AND hhm -> wvv
275+
cns XOR rqd -> z24
276+
rjq OR nfh -> wcs
277+
mcv AND mbp -> npn
278+
wdg AND pps -> kcp
279+
nrq OR vkg -> mmw
280+
x33 AND y33 -> pvc
281+
x20 XOR y20 -> fht
282+
y43 XOR x43 -> hhg
283+
dfh XOR fpk -> z03
284+
fbk XOR tcq -> z13
285+
x09 XOR y09 -> nbm
286+
pwp OR nmj -> ctw
287+
y25 AND x25 -> tvb
288+
y34 AND x34 -> krb
289+
x11 XOR y11 -> hhm
290+
hdq OR gdm -> fdv
291+
mcv XOR mbp -> z27
292+
nbm XOR cbk -> z09
293+
fvh AND pgc -> hdq
294+
jkq AND nhn -> vkg
295+
dwt OR qsg -> sjm
296+
dbf AND dsb -> pmr
297+
rsc XOR bbn -> nhn
298+
y14 AND x14 -> dwt
299+
x35 AND y35 -> jdk
300+
x41 XOR y41 -> dfs
301+
y37 AND x37 -> kpb
302+
bck XOR csf -> z14
303+
y07 AND x07 -> jft
304+
sdp OR ptd -> rtg
305+
y01 AND x01 -> khh
306+
bcr OR psw -> dfh
307+
chs AND rgv -> jhv
308+
y18 AND x18 -> sdp
309+
ddw AND fht -> qfn
310+
x33 XOR y33 -> jbr
311+
gsj AND ftw -> pwp
312+
x12 XOR y12 -> pps
313+
rvg OR wvv -> wdg
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package eu.sim642.adventofcode2024
2+
3+
import scala.collection.mutable
4+
5+
object Day24 {
6+
7+
enum Op {
8+
case And
9+
case Or
10+
case Xor
11+
}
12+
13+
enum Wire {
14+
case Input(value: Boolean)
15+
case Gate(lhs: String, op: Op, rhs: String)
16+
}
17+
18+
type Circuit = Map[String, Wire]
19+
20+
def getZValue(circuit: Circuit): Long = {
21+
22+
val memo = mutable.Map.empty[String, Boolean]
23+
24+
def evalName(name: String): Boolean =
25+
memo.getOrElseUpdate(name, evalWire(circuit(name)))
26+
27+
def evalWire(wire: Wire): Boolean = wire match {
28+
case Wire.Input(value) => value
29+
case Wire.Gate(lhs, op, rhs) =>
30+
val left = evalName(lhs)
31+
val right = evalName(rhs)
32+
op match {
33+
case Op.And => left && right
34+
case Op.Or => left || right
35+
case Op.Xor => left != right
36+
}
37+
}
38+
39+
circuit.keys
40+
.filter(_.startsWith("z"))
41+
.toSeq
42+
.sorted
43+
.foldRight(0L)({ case (zName, acc) =>
44+
acc << 1 | (if (evalName(zName)) 1 else 0)
45+
})
46+
}
47+
48+
def parseInput(s: String): (String, Wire.Input) = s match {
49+
case s"$name: 0" => name -> Wire.Input(false)
50+
case s"$name: 1" => name -> Wire.Input(true)
51+
}
52+
53+
def parseGate(s: String): (String, Wire.Gate) = s match {
54+
case s"$lhs AND $rhs -> $name" => name ->Wire.Gate(lhs, Op.And, rhs)
55+
case s"$lhs OR $rhs -> $name" => name -> Wire.Gate(lhs, Op.Or, rhs)
56+
case s"$lhs XOR $rhs -> $name" => name -> Wire.Gate(lhs, Op.Xor, rhs)
57+
}
58+
59+
def parseCircuit(input: String): Circuit = input match {
60+
case s"$inputs\n\n$gates" =>
61+
val inputMap = inputs.linesIterator.map(parseInput).toMap
62+
val gateMap = gates.linesIterator.map(parseGate).toMap
63+
inputMap ++ gateMap
64+
}
65+
66+
lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day24.txt")).mkString.trim
67+
68+
def main(args: Array[String]): Unit = {
69+
println(getZValue(parseCircuit(input)))
70+
}
71+
}

0 commit comments

Comments
 (0)