diff options
author | Leah Neukirchen <leah@vuxu.org> | 2021-12-19 17:21:15 +0100 |
---|---|---|
committer | Leah Neukirchen <leah@vuxu.org> | 2021-12-19 17:21:15 +0100 |
commit | 63c07061a2dd1f4067ba215d41bb7254f1a29dba (patch) | |
tree | df48ef3a4503537fbde2009c40e0db0f9b456273 | |
parent | 8ca091e841ae891bfd556cf55e519a1ccf014281 (diff) | |
download | adventofcode2021-63c07061a2dd1f4067ba215d41bb7254f1a29dba.tar.gz adventofcode2021-63c07061a2dd1f4067ba215d41bb7254f1a29dba.tar.xz adventofcode2021-63c07061a2dd1f4067ba215d41bb7254f1a29dba.zip |
day18
-rw-r--r-- | day18 | 100 | ||||
-rw-r--r-- | day18.bqn | 27 | ||||
-rw-r--r-- | day18.clj | 70 |
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 |