Skip to content

Commit 0e77a15

Browse files
committed
2024d24 del 1
1 parent c0d14bb commit 0e77a15

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed

notebooks/y2024/d24.clj

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
(ns y2024.d24
2+
(:require
3+
[advent-of-code-clj.input :as input]))
4+
5+
(def test-input "x00: 1
6+
x01: 0
7+
x02: 1
8+
x03: 1
9+
x04: 0
10+
y00: 1
11+
y01: 1
12+
y02: 1
13+
y03: 1
14+
y04: 1
15+
16+
ntg XOR fgs -> mjb
17+
y02 OR x01 -> tnw
18+
kwq OR kpj -> z05
19+
x00 OR x03 -> fst
20+
tgd XOR rvg -> z01
21+
vdt OR tnw -> bfw
22+
bfw AND frj -> z10
23+
ffh OR nrd -> bqk
24+
y00 AND y03 -> djm
25+
y03 OR y00 -> psh
26+
bqk OR frj -> z08
27+
tnw OR fst -> frj
28+
gnj AND tgd -> z11
29+
bfw XOR mjb -> z00
30+
x03 OR x00 -> vdt
31+
gnj AND wpb -> z02
32+
x04 AND y00 -> kjc
33+
djm OR pbm -> qhw
34+
nrd AND vdt -> hwm
35+
kjc AND fst -> rvg
36+
y04 OR y02 -> fgs
37+
y01 AND x02 -> pbm
38+
ntg OR kjc -> kwq
39+
psh XOR fgs -> tgd
40+
qhw XOR tgd -> z09
41+
pbm OR djm -> kpj
42+
x03 XOR y03 -> ffh
43+
x00 XOR y04 -> ntg
44+
bfw OR bqk -> z06
45+
nrd XOR fgs -> wpb
46+
frj XOR qhw -> z04
47+
bqk OR frj -> z07
48+
y03 OR x01 -> nrd
49+
hwm AND bqk -> z03
50+
tgd XOR rvg -> z12
51+
tnw OR pbm -> gnj")
52+
53+
(defn parse-logic-statement [logic-statement]
54+
(let [[v1 op v2 res] (re-seq #"\w+" logic-statement)
55+
op-fn (case op
56+
"AND" bit-and
57+
"OR" bit-or
58+
"XOR" bit-xor)]
59+
{:op op-fn
60+
:inputs [v1 v2]
61+
:res res}))
62+
63+
(parse-logic-statement "hwm AND bqk -> z03")
64+
65+
(defn solve-expressions [input]
66+
(let [[initial-vars logic-statements] (map #(.trim %) (.split input "\n\n"))]
67+
(loop [ls (map parse-logic-statement (.split logic-statements "\n"))
68+
known-vals (into {} (map (fn [line]
69+
(let [[id val] (map #(.trim %) (.split line ":"))]
70+
[id (parse-long val)]))
71+
(.split initial-vars "\n")))]
72+
73+
(let [solvable (filter #(every? known-vals (:inputs %)) ls)
74+
unsolvable (filter #(not-every? known-vals (:inputs %)) ls)
75+
new-results (reduce (fn [acc {:keys [inputs op res]}]
76+
(assoc acc res
77+
(apply op (map known-vals inputs))))
78+
known-vals
79+
solvable)]
80+
(if (empty? unsolvable)
81+
new-results
82+
(recur unsolvable new-results))))))
83+
84+
(defn part-1 [input]
85+
(let [results (solve-expressions input)
86+
z-vals (reverse (sort-by key (filter #(.startsWith (key %) "z") results)))]
87+
(read-string (str "2r" (String/join "" (map (comp str val) z-vals))))))
88+
89+
(part-1 test-input)
90+
91+
(part-1 (input/get-input 2024 24))

0 commit comments

Comments
 (0)