about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2021-12-19 17:21:15 +0100
committerLeah Neukirchen <leah@vuxu.org>2021-12-19 17:21:15 +0100
commit63c07061a2dd1f4067ba215d41bb7254f1a29dba (patch)
treedf48ef3a4503537fbde2009c40e0db0f9b456273
parent8ca091e841ae891bfd556cf55e519a1ccf014281 (diff)
downloadadventofcode2021-63c07061a2dd1f4067ba215d41bb7254f1a29dba.tar.gz
adventofcode2021-63c07061a2dd1f4067ba215d41bb7254f1a29dba.tar.xz
adventofcode2021-63c07061a2dd1f4067ba215d41bb7254f1a29dba.zip
day18
-rw-r--r--day18100
-rw-r--r--day18.bqn27
-rw-r--r--day18.clj70
3 files changed, 197 insertions, 0 deletions
diff --git a/day18 b/day18
new file mode 100644
index 0000000..fea401c
--- /dev/null
+++ b/day18
@@ -0,0 +1,100 @@
+[4,[3,[9,[9,0]]]]
+[[[7,6],[2,[2,5]]],[5,[[7,3],8]]]
+[4,[4,6]]
+[[0,[5,6]],[[[1,3],[2,7]],[[0,6],4]]]
+[6,[[3,[6,0]],3]]
+[[7,[9,[8,5]]],[6,7]]
+[[[[2,6],1],2],[3,[8,4]]]
+[4,[[[5,4],[2,7]],[[8,0],[2,3]]]]
+[[[[4,3],2],[[3,6],[2,5]]],[[[3,7],8],0]]
+[[[8,[0,7]],1],[[9,[3,9]],9]]
+[[[[3,0],[1,3]],[[0,9],8]],[[[7,2],9],[[1,4],[3,5]]]]
+[[[[9,6],[4,4]],[1,3]],[[4,3],[[6,4],[8,4]]]]
+[[[1,2],[[7,6],[2,3]]],[[4,6],[4,2]]]
+[[[4,8],[[5,8],1]],[2,3]]
+[[[5,2],[3,[5,7]]],[[2,9],5]]
+[[[6,[3,2]],[2,6]],[[8,[4,2]],[[5,2],7]]]
+[[[[2,6],[0,1]],[7,[3,6]]],[[1,6],[[7,9],0]]]
+[[[0,3],[8,1]],[[[9,0],3],[0,2]]]
+[[8,[[7,1],[4,7]]],[[0,[1,3]],[8,2]]]
+[[[[2,3],4],[[0,8],[9,0]]],[1,[[5,3],4]]]
+[[[[7,2],2],[[1,3],[8,3]]],[4,[[7,9],[0,6]]]]
+[[[[2,2],[3,4]],[[1,5],[4,3]]],[6,[[7,2],1]]]
+[1,[[[5,7],0],[9,[8,8]]]]
+[[[[9,2],[0,9]],[4,[7,8]]],[[4,8],[[1,8],[4,9]]]]
+[[[[4,7],2],2],4]
+[1,[[2,[4,2]],1]]
+[[[[7,2],[3,8]],[0,[1,3]]],[[[4,4],[2,4]],[8,2]]]
+[[[[1,0],[0,5]],2],[[9,[5,0]],[[1,6],5]]]
+[4,[[[8,1],[1,4]],[7,[1,3]]]]
+[[[6,[0,4]],[[4,6],[2,4]]],[9,[1,5]]]
+[[[[3,6],[3,3]],1],[0,[[8,8],2]]]
+[[7,[5,[2,6]]],[[[7,9],6],[0,[3,6]]]]
+[[[[6,7],4],[[2,9],2]],3]
+[[[7,[1,7]],[5,4]],[[[1,1],[0,1]],5]]
+[[6,[[1,0],6]],[0,[6,[0,5]]]]
+[[[[2,4],[4,6]],9],[4,[[8,0],7]]]
+[[[[9,9],[5,7]],[9,[8,6]]],[[3,[2,3]],0]]
+[[0,[1,[5,3]]],[3,[8,[3,4]]]]
+[[[[4,3],8],[2,9]],[[1,[6,5]],[[5,7],2]]]
+[[[0,[7,4]],[9,[9,6]]],[[8,[5,5]],[[6,4],1]]]
+[[[[7,3],[7,9]],[8,[6,2]]],[[8,[4,5]],[[6,4],[6,7]]]]
+[[7,[[9,0],[9,0]]],[[[0,8],2],[8,[8,3]]]]
+[4,[7,[5,6]]]
+[7,[[[3,8],8],3]]
+[[[4,[6,6]],0],[9,0]]
+[[[[7,4],8],8],[[0,1],[[0,0],[2,4]]]]
+[7,[1,[[9,4],[3,6]]]]
+[[[[2,8],9],[[8,6],[2,2]]],[[[5,1],9],[2,[0,7]]]]
+[8,7]
+[[[[0,8],4],[[9,9],[9,9]]],[[[4,3],[1,0]],[6,8]]]
+[[[[8,3],[8,9]],1],[[4,[1,0]],[[4,0],[2,3]]]]
+[[[[4,7],[1,3]],[6,9]],[[1,0],[[1,8],5]]]
+[[2,[4,[6,5]]],[3,[[9,9],5]]]
+[[[[7,6],4],9],[8,[4,5]]]
+[[[0,[6,6]],[7,[8,9]]],[[[0,0],[3,4]],[4,[1,8]]]]
+[[[9,[7,0]],[5,8]],[6,[[5,0],[0,6]]]]
+[[[[4,0],[1,9]],[7,[3,6]]],[[2,[8,6]],[[2,8],[8,2]]]]
+[[[9,6],8],[[[5,5],[4,8]],0]]
+[[[[1,7],1],2],[[[6,8],3],[[3,3],5]]]
+[3,[5,[[3,8],6]]]
+[3,[[[9,6],[5,8]],[9,2]]]
+[[6,1],[6,4]]
+[[2,6],[[[1,2],2],8]]
+[[[[1,7],[3,6]],[2,[0,2]]],[[3,0],9]]
+[1,[[0,[4,9]],5]]
+[[[[5,5],[5,2]],[0,[6,4]]],8]
+[0,[7,[[6,9],[6,0]]]]
+[[[[2,2],[4,7]],[[7,4],6]],[[0,[1,7]],[[3,2],6]]]
+[[9,8],0]
+[[[[5,4],[4,8]],2],[3,[8,9]]]
+[[[[7,0],8],5],[2,6]]
+[[[5,[0,8]],5],[[[5,0],[1,8]],[[0,2],7]]]
+[[[[9,4],8],[[6,5],4]],[[5,[8,9]],[4,[0,4]]]]
+[[[[3,6],7],[[9,3],7]],[7,[[8,3],9]]]
+[[[[0,7],5],[[5,7],2]],[[2,[9,5]],[[7,7],[5,0]]]]
+[[[[7,5],2],[8,6]],[[2,[6,2]],[5,[3,1]]]]
+[[9,[9,1]],6]
+[[[0,7],[[5,9],2]],3]
+[[[9,3],[8,8]],[0,[4,5]]]
+[[[[6,2],5],[4,[3,1]]],[9,[2,8]]]
+[[[1,[9,4]],[[0,0],2]],[[1,[2,1]],[[7,8],[3,2]]]]
+[[[[0,6],[8,9]],[[4,7],[5,6]]],[[[1,4],[8,7]],[4,6]]]
+[[[[6,4],[1,5]],[0,8]],[[[9,7],[1,2]],[9,4]]]
+[[[[4,5],[0,7]],[9,[1,8]]],[[[5,0],6],7]]
+[[[0,[6,9]],[5,[5,6]]],7]
+[[4,5],[[7,[6,5]],1]]
+[[[7,9],[6,7]],[4,1]]
+[[[[9,6],1],[[3,1],[9,7]]],[1,[7,1]]]
+[[[0,[2,0]],5],[[8,[7,6]],[[7,3],4]]]
+[[[6,[1,7]],[9,[2,7]]],3]
+[[[6,[8,2]],5],[4,[[1,3],[5,1]]]]
+[[[4,[3,3]],[4,[2,4]]],[5,4]]
+[[[1,6],[4,[4,0]]],[[8,[2,2]],[[8,1],[4,7]]]]
+[[2,0],[[2,1],[[4,8],[2,7]]]]
+[9,[[8,4],0]]
+[[1,6],[[5,[1,3]],[9,[0,9]]]]
+[[[0,[3,5]],3],[[2,[8,0]],[[2,0],[4,3]]]]
+[[[1,[1,9]],[9,[7,9]]],[[2,2],[[6,7],[0,7]]]]
+[[[4,6],[[6,2],[0,9]]],[[1,0],[1,[6,7]]]]
+[9,[[[0,1],4],[[9,3],3]]]
diff --git a/day18.bqn b/day18.bqn
new file mode 100644
index 0000000..c469fa7
--- /dev/null
+++ b/day18.bqn
@@ -0,0 +1,27 @@
+d ← {•BQN ("⟨⟩"∾𝕩) ⊏˜ ("[]"∾𝕩) ⊐ 𝕩}¨•FLines"day18"
+
+Split ← { 𝕊 ⟨l,r⟩: { 𝕊 @: { 𝕊 @: @ ; 𝕊 r2: l‿r2 } Split r ;
+                     𝕊 l2: l2‿r } Split l ;
+          𝕊 n: n ≥ 10 ? (⌊⋈⌈) n÷2 ;
+          @ }
+
+Addlm ← { n 𝕊 ⟨l,r⟩: ⟨n Addlm l, r⟩ ; n 𝕊 m : n + m }
+Addrm ← { n 𝕊 ⟨l,r⟩: ⟨l, n Addrm r⟩ ; n 𝕊 m : n + m }
+
+Explode ← {
+  4 𝕊 ⟨l,r⟩: 0‿l‿r ;
+  d 𝕊 ⟨l,r⟩: { 𝕊 @: { 𝕊 @: @ ;
+                       𝕊 ⟨r2,ln,rn⟩: ⟨ln Addrm l,r2⟩‿0‿rn } (d+1) Explode r ;
+               𝕊 ⟨l2,ln,rn⟩: ⟨l2,rn Addlm r⟩‿ln‿0 } (d+1) Explode l ;
+  @
+}
+
+Reduce ← { 𝕊 t: { 𝕊 @: { 𝕊 @: t ; 𝕊 t3: Reduce t3 } Split t ;
+                  𝕊 t2: Reduce t2 } ⊑ 0 Explode t }
+
+Add ← Reduce∘⋈
+
+Mag ← { 𝕊 ⟨l,r⟩: (3×Mag l)+(2×Mag r) ; 𝕊 n: n }
+
+•Show Mag Add˜´ ⌽ d
+•Show ⌈´⥊Mag∘Add⌜˜ d
diff --git a/day18.clj b/day18.clj
new file mode 100644
index 0000000..2b41d98
--- /dev/null
+++ b/day18.clj
@@ -0,0 +1,70 @@
+(ns org.vuxu.aoc2021.day18
+  (:require [clojure.string :as str]))
+
+(def data
+  (->> (slurp "day18")
+       str/split-lines
+       (map clojure.edn/read-string)))
+
+(defn add-leftmost [n t]
+  (if (number? t)
+    (+ n t)
+    [(add-leftmost n (first t)) (second t)]))
+
+(defn add-rightmost [n t]
+  (if (number? t)
+    (+ n t)
+    [(first t) (add-rightmost n (second t))]))
+
+(defn explode2 [depth t]
+  (if (number? t)
+    nil
+    (let [[l r] t]
+      (if (= depth 4)
+        [0 l r]
+        (if-let [[l' ln rn] (explode2 (inc depth) l)]
+          [[l' (add-leftmost rn r)] ln 0]
+          (if-let [[r' ln rn] (explode2 (inc depth) r)]
+            [[(add-rightmost ln l) r'] 0 rn]))))))
+
+(defn explode [t]
+  (first (explode2 0 t)))
+
+(defn split [t]
+  (if (number? t)
+    (if (>= t 10)
+      [(long (Math/floor (/ t 2)))
+       (long (Math/ceil (/ t 2)))])
+    (let [[l r] t]
+      (if-let [l' (split l)]
+        [l' r]
+        (if-let [r' (split r)]
+          [l r'])))))
+
+(defn reduc [t]
+  (if-let [t' (explode t)]
+    (recur t')
+    (if-let [t' (split t)]
+      (recur t')
+      t)))
+
+(defn add [x y]
+  (reduc (conj [x] y)))
+
+(defn mag [t]
+  (if (number? t)
+    t
+    (+ (* 3 (mag (first t)))
+       (* 2 (mag (second t))))))
+
+(def part1
+  (mag (reduce add data)))
+;; => 4173
+
+(def part2
+  (apply max
+         (for [x data
+               y data
+               :when (not= x y)]
+           (mag (add x y)))))
+;; => 4706