File tree 1 file changed +91
-0
lines changed
1 file changed +91
-0
lines changed Original file line number Diff line number Diff line change
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 ))
You can’t perform that action at this time.
0 commit comments