Created
December 18, 2021 12:28
-
-
Save merrickluo/887232d5efa3d098f5035380366adc6d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| (ns day18 | |
| (:require [clojure.pprint :refer [pprint]] | |
| [clojure.zip :as z])) | |
| (defn exp-left [sn n] | |
| (loop [t (z/prev sn) l 1] | |
| (if (nil? t) | |
| sn | |
| (let [tn (z/node t)] | |
| (if (number? tn) | |
| (let [-t (z/replace t (+ tn n))] | |
| (reduce (fn [-t _] (z/next -t)) -t (range l))) | |
| (recur (z/prev t) (inc l))))))) | |
| (defn exp-right [sn n] | |
| (loop [t (z/next sn) l 1] | |
| (if (z/end? t) | |
| sn | |
| (let [tn (z/node t)] | |
| (if (number? tn) | |
| (let [-t (z/replace t (+ tn n))] | |
| (reduce (fn [-t _] (z/prev -t)) -t (range l))) | |
| (recur (z/next t) (inc l))))))) | |
| (defn sn-explode | |
| "Only explode the leftmost pair." | |
| [sn] | |
| (loop [n (z/next sn)] | |
| (if (z/end? n) | |
| nil ; no exploding | |
| (let [ns (z/node n)] | |
| (if (and (coll? ns) (number? (first ns)) (number? (last ns)) (> (count (z/path n)) 3)) | |
| (-> (z/replace n 0) (exp-left (first ns)) (exp-right (last ns)) (z/root)) | |
| (recur (z/next n))))))) | |
| (defn sn-split | |
| "split the first number > 10" | |
| [sn] | |
| (loop [n (z/next sn)] | |
| (if (z/end? n) | |
| nil | |
| (let [ns (z/node n)] | |
| (if (and (number? ns) (> ns 9)) | |
| (-> n (z/replace [(int (java.lang.Math/floor (/ ns 2))) (int (java.lang.Math/ceil (/ ns 2)))]) (z/root)) | |
| (recur (z/next n))))))) | |
| (defn sn-reduce [sn] | |
| (loop [-sn sn] | |
| (if-some [-sn (sn-explode -sn)] | |
| (recur (z/vector-zip -sn)) | |
| (if-some [-sn (sn-split -sn)] | |
| (recur (z/vector-zip -sn)) | |
| -sn)))) | |
| (defn sn-magtitude | |
| ([sn] (sn-magtitude sn 1)) | |
| ([sn amp] | |
| (if (number? sn) | |
| (* sn amp) | |
| (let [[l r] sn] | |
| (+ (sn-magtitude l (* 3 amp)) (sn-magtitude r (* 2 amp))))))) | |
| (defn sn-add [l r] | |
| (-> [l r] (z/vector-zip) (sn-reduce) (z/root))) | |
| (->> (tree-seq coll? identity [7 [[[3 7] [4 3]] [[6 3] [8 8]]]])) | |
| (defn sn-explode-2 [[l r]] | |
| (loop [-l l -r r d 0] | |
| (let [[x y] l] | |
| ) | |
| ) | |
| ) | |
| (->> | |
| [[[[0 [4 5]] [0 0]] [[[4 5] [2 6]] [9 5]]] | |
| [7 [[[3 7] [4 3]] [[6 3] [8 8]]]] | |
| [[2 [[0 8] [3 4]]] [[[6 7] 1] [7 [1 6]]]] | |
| [[[[2 4] 7] [6 [0 5]]] [[[6 8] [2 8]] [[2 1] [4 5]]]] | |
| [7 [5 [[3 8] [1 4]]]] | |
| [[2 [2 2]] [8 [8 1]]] | |
| [2 9] | |
| [1 [[[9 3] 9] [[9 0] [0 7]]]] | |
| [[[5 [7 4]] 7] 1] | |
| [[[[4 2] 2] 6] [8 7]]] | |
| (reduce sn-add) | |
| (sn-magtitude)) | |
| (def input | |
| [[[[3 [8 6]] [6 1]] [[[1 1] 2] [[1 0] 0]]] | |
| [[[1 [7 3]] 1] 9] | |
| [[[2 6] [[3 1] [0 9]]] [[7 [4 8]] [[2 7] 3]]] | |
| [[[3 [0 4]] [[8 4] [1 9]]] [7 [2 [5 7]]]] | |
| [[[4 5] [[0 7] 1]] [9 [0 4]]] | |
| [[5 [[1 5] [3 6]]] 8] | |
| [[3 [[9 3] 9]] 9] | |
| [2 [[[2 1] [0 5]] [9 9]]] | |
| [[2 [6 9]] [[[4 1] 0] [3 4]]] | |
| [[[[6 8] 0] [[8 8] 9]] [[[4 2] 3] [3 [7 3]]]] | |
| [[3 7] 9] | |
| [[[[2 5] 8] [2 5]] [[0 [5 7]] [[2 5] 4]]] | |
| [[[8 [6 6]] 0] [4 [[5 6] [8 4]]]] | |
| [[[1 [8 2]] [[0 4] [2 6]]] [[3 4] 0]] | |
| [[1 [[9 2] [6 0]]] [[[0 9] 5] [[8 0] [1 5]]]] | |
| [[2 [[2 3] [1 8]]] [3 [[7 2] [0 7]]]] | |
| [[5 4] 5] | |
| [[[[4 2] [4 8]] [7 3]] [0 [[8 9] 6]]] | |
| [[[6 7] 0] 5] | |
| [[2 [[9 0] [8 4]]] [[[7 4] [3 4]] 0]] | |
| [[[9 [8 9]] 1] [[5 [6 7]] 3]] | |
| [[2 [0 0]] [3 [[2 5] [1 4]]]] | |
| [[0 1] [0 [[8 8] [8 3]]]] | |
| [[[0 2] [2 8]] [1 [[7 0] 0]]] | |
| [[[[5 4] 3] [[7 5] [2 6]]] [[5 8] [0 1]]] | |
| [0 [0 0]] | |
| [[5 [[5 6] 0]] [[[2 7] 9] [7 9]]] | |
| [[[[0 8] 2] [[2 5] [7 6]]] [[9 7] [[8 7] [9 2]]]] | |
| [[[0 [4 6]] [[6 3] [4 4]]] [8 [[4 8] [4 8]]]] | |
| [[[[8 9] [3 8]] 8] [[[7 9] 6] [9 [2 7]]]] | |
| [[[[8 9] [1 6]] 0] [[[8 7] 4] [9 [1 4]]]] | |
| [5 7] | |
| [[[[1 5] [3 6]] [[5 5] 4]] [[3 3] [4 [4 0]]]] | |
| [[[0 6] [5 [5 3]]] [[4 [0 0]] 8]] | |
| [7 [6 8]] | |
| [[[[8 5] 9] [[3 2] 7]] [[[6 6] 5] 2]] | |
| [[[[4 4] [0 4]] 9] 0] | |
| [[0 [3 [9 3]]] [9 [[8 0] [0 9]]]] | |
| [[[[4 0] 0] [1 [1 7]]] [[3 [3 0]] [[1 3] 6]]] | |
| [[9 4] [3 [[7 1] 6]]] | |
| [[[[3 7] 7] 1] [[4 3] [[6 9] [6 9]]]] | |
| [[[8 [2 5]] [[8 4] 4]] [[[3 4] [6 7]] [5 [8 5]]]] | |
| [2 [4 [[3 2] 7]]] | |
| [[[[3 1] [5 6]] [[2 7] 7]] [4 [8 [7 4]]]] | |
| [[7 8] [[[3 9] 7] 2]] | |
| [[[[8 8] [5 8]] [[1 0] [6 0]]] [[[1 2] 6] [[4 2] [5 5]]]] | |
| [[1 [0 9]] [[[2 1] 1] 1]] | |
| [[6 [8 1]] [4 [[7 8] 5]]] | |
| [[[1 [1 6]] [1 [5 7]]] [[[2 8] 6] 0]] | |
| [9 1] | |
| [[[0 [6 5]] [[8 5] 2]] [[[2 4] [7 3]] [[1 5] [9 2]]]] | |
| [[[2 7] [0 [3 6]]] [[[1 0] [9 6]] [1 [0 4]]]] | |
| [6 [[[5 9] 8] [0 2]]] | |
| [7 [[[9 4] [8 6]] [[1 1] 1]]] | |
| [[[2 1] 0] 8] | |
| [1 [[6 [1 4]] [[0 0] [1 9]]]] | |
| [[[1 [7 9]] 2] 8] | |
| [[[[0 9] 2] [[8 4] 9]] [0 [[7 7] [4 8]]]] | |
| [[1 [2 [1 8]]] [[[3 6] [2 1]] [3 [5 0]]]] | |
| [[3 3] [3 5]] | |
| [[[[9 3] [4 3]] [5 [8 1]]] [[6 [5 0]] 9]] | |
| [0 [[9 [3 5]] 3]] | |
| [[[9 1] 0] [[[5 9] [8 0]] [7 [4 8]]]] | |
| [[[[7 7] 8] 3] [[[6 6] [6 5]] [6 4]]] | |
| [[[[3 7] 1] [9 [4 2]]] [[9 [2 5]] [[9 0] 5]]] | |
| [5 [[0 2] 6]] | |
| [[[[2 7] [5 3]] [1 8]] 2] | |
| [[[8 [7 7]] [9 [0 0]]] 4] | |
| [[[4 [1 4]] 0] [[[8 7] 8] [[4 1] 7]]] | |
| [[[[0 6] 0] [[3 2] [9 8]]] [[9 [4 5]] [[7 7] [0 8]]]] | |
| [[[[6 3] 3] [[1 5] 7]] [[0 1] [7 7]]] | |
| [[[[2 0] 2] [3 [3 5]]] [[[0 8] [8 2]] [[0 6] 5]]] | |
| [[[6 [5 3]] [[5 5] 9]] [[5 9] [[8 7] [3 7]]]] | |
| [[[[1 7] [3 4]] [9 2]] 1] | |
| [[[[8 2] 6] 1] [[5 [2 7]] [3 9]]] | |
| [5 [5 7]] | |
| [[[[9 8] [3 4]] [[2 5] [5 6]]] [[[2 7] 7] [9 [8 7]]]] | |
| [[[1 4] [[6 1] [1 3]]] [1 [7 [1 7]]]] | |
| [[[[1 4] 8] [[5 1] 8]] [[[1 3] [6 9]] [6 [3 3]]]] | |
| [[[[4 0] [0 7]] [4 5]] [4 2]] | |
| [3 8] | |
| [7 [[[7 6] 5] [[6 6] 5]]] | |
| [[[5 [0 5]] [4 4]] [3 [[4 2] [7 0]]]] | |
| [[[[7 9] 8] [9 6]] [5 0]] | |
| [[[[3 0] [5 2]] 1] [[[6 9] [5 3]] [[2 5] [6 3]]]] | |
| [7 [[[7 7] [4 5]] [9 2]]] | |
| [[7 [[4 2] [9 3]]] [7 [6 1]]] | |
| [7 9] | |
| [[[8 [8 1]] [[7 3] 1]] [[9 8] [2 [8 3]]]] | |
| [[[9 3] 3] 3] | |
| [[[8 [5 7]] [[2 1] [1 3]]] [[[3 5] 2] 0]] | |
| [[[8 8] 0] [[1 4] [[8 6] 9]]] | |
| [[9 [3 [3 0]]] [1 7]] | |
| [1 [[[8 8] 1] [2 [0 5]]]] | |
| [[0 [1 5]] [9 [0 [9 0]]]] | |
| [1 [[[1 1] [8 3]] [1 8]]] | |
| [[5 [[7 7] [3 3]]] [[[6 6] [7 8]] [1 [0 0]]]] | |
| [[[[6 7] 1] [0 2]] [[[4 2] [7 6]] [[8 4] [4 9]]]] | |
| [[6 [[3 3] [9 0]]] [1 [[4 5] 4]]] | |
| [[[[3 4] 7] [9 0]] [[[4 5] 1] [[5 1] [9 3]]]]]) | |
| (->> input (reduce sn-add) (sn-magtitude)) | |
| (->> | |
| (for [i input | |
| j input | |
| :when (not (= i j))] | |
| (-> (sn-add i j) (sn-magtitude))) | |
| (apply max)) | |
| ;; (let [t (z/vector-zip [[[[[4 3] 4] 4] [7 [[8 4] 9]]] [1 1]])] | |
| ;; ;; (-> t (explode) (z/vector-zip) (explode) (z/vector-zip) (explode))) | |
| ;; (let [n (-> t (z/next) (z/next) (z/next) (z/next))] | |
| ;; (-> n (z/replace 0) (exp-left 9) (exp-right 8) (z/root))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment