summaryrefslogtreecommitdiffstats
path: root/2021/18
diff options
context:
space:
mode:
Diffstat (limited to '2021/18')
-rw-r--r--2021/18/code.tl75
-rw-r--r--2021/18/code2.tl75
-rw-r--r--2021/18/input100
-rw-r--r--2021/18/testinput10
-rw-r--r--2021/18/testinput210
5 files changed, 270 insertions, 0 deletions
diff --git a/2021/18/code.tl b/2021/18/code.tl
new file mode 100644
index 0000000..92b17e3
--- /dev/null
+++ b/2021/18/code.tl
@@ -0,0 +1,75 @@
+(defun read-string (str)
+ (flow str (mapcar (relate '(#\[ #\] #\,) '(#\( #\) #\space))) read))
+
+(defun read-input (: (name "input"))
+ (flow name file-get-lines (mapcar read-string)))
+
+(defun ladd (n sn)
+ (tree-case sn
+ ((a b) ^(,(ladd n a) ,b))
+ (m (+ n m))))
+
+(defun radd (sn n)
+ (tree-case sn
+ ((a b) ^(,a ,(radd b n)))
+ (m (+ m n))))
+
+(defun explode (sn)
+ (match-case sn
+ (^(((((,a ,b) ,x) ,y) ,z) ,w) ^((((0 ,(ladd b x)) ,y) ,z) ,w))
+ (^((((,x (,a ,b)) ,y) ,z) ,w) ^((((,(radd x a) 0) ,(ladd b y)) ,z) ,w))
+ (^(((,y ((,a ,b) ,x)) ,z) ,w) ^(((,(radd y a) (0 ,(ladd b x))) ,z) ,w))
+ (^(((,y (,x (,a ,b))) ,z) ,w) ^(((,y (,(radd x a) 0)) ,(ladd b z)) ,w))
+ (^((,z (((,a ,b) ,x) ,y)) ,w) ^((,(radd z a) ((0 ,(ladd b x)) ,y)) ,w))
+ (^((,z ((,x (,a ,b)) ,y)) ,w) ^((,z ((,(radd x a) 0) ,(ladd b y))) ,w))
+ (^((,z (,y ((,a ,b) ,x))) ,w) ^((,z (,(radd y a) (0 ,(ladd b x)))) ,w))
+ (^((,z (,y (,x (,a ,b)))) ,w) ^((,z (,y (,(radd x a) 0))) ,(ladd b w)))
+ (^(,w ((((,a ,b) ,x) ,y) ,z)) ^(,(radd w a) (((0 ,(ladd b x)) ,y) ,z)))
+ (^(,w (((,x (,a ,b)) ,y) ,z)) ^(,w (((,(radd x a) 0) ,(ladd b y)) ,z)))
+ (^(,w ((,y ((,a ,b) ,x)) ,z)) ^(,w ((,(radd y a) (0 ,(ladd b x))) ,z)))
+ (^(,w ((,y (,x (,a ,b))) ,z)) ^(,w ((,y (,(radd x a) 0)) ,(ladd b z))))
+ (^(,w (,z (((,a ,b) ,x) ,y))) ^(,w (,(radd z a) ((0 ,(ladd b x)) ,y))))
+ (^(,w (,z ((,x (,a ,b)) ,y))) ^(,w (,z ((,(radd x a) 0) ,(ladd b y)))))
+ (^(,w (,z (,y ((,a ,b) ,x)))) ^(,w (,z (,(radd y a) (0 ,(ladd b x))))))
+ (^(,w (,z (,y (,x (,a ,b))))) ^(,w (,z (,y (,(radd x a) 0)))))
+ (@else else)))
+
+(defun splt (sn)
+ (tree-case sn
+ ((a b)
+ (let ((as (splt a))
+ (bs (splt b)))
+ (cond
+ ((neq a as) ^(,as ,b))
+ ((neq b bs) ^(,a ,bs))
+ (t sn))))
+ (m (if (< m 10)
+ m
+ (let* ((x (trunc m 2))
+ (y (- m x)))
+ ^(,x ,y))))))
+
+(defun reduce (sn)
+ (let (sn*)
+ (while* (neq sn* sn)
+ (while* (neq sn* sn)
+ (shift sn* sn (explode sn)))
+ (shift sn* sn (splt sn)))
+ sn))
+
+(defun add (sn0 sn1)
+ (reduce (list sn0 sn1)))
+
+(defun mag (sn)
+ (tree-case sn
+ ((a b) (+ (* 3 (mag a)) (* 2 (mag b))))
+ (m m)))
+
+(defun solve-one (: (name :))
+ (flow name read-input (reduce-left add) mag))
+
+(defun solve-two (: (name :))
+ (flow name read-input (comb @1 2)
+ (mappend [juxt [chain [apf add] mag]
+ [chain [apf [flipargs add]] mag]])
+ find-max))
diff --git a/2021/18/code2.tl b/2021/18/code2.tl
new file mode 100644
index 0000000..58e2e32
--- /dev/null
+++ b/2021/18/code2.tl
@@ -0,0 +1,75 @@
+(defun read-string (str)
+ (flow str (mapcar (relate '(#\[ #\] #\,) '(#\( #\) #\space))) read))
+
+(defun read-input (: (name "input"))
+ (flow name file-get-lines (mapcar read-string)))
+
+(defun ladd (n sn)
+ (tree-case sn
+ ((a b) ^(,(ladd n a) ,b))
+ (m (+ n m))))
+
+(defun radd (sn n)
+ (tree-case sn
+ ((a b) ^(,a ,(radd b n)))
+ (m (+ m n))))
+
+(defun explode (sn)
+ (tree-case sn
+ ((((((a b) x) y) z) w) ^((((0 ,(ladd b x)) ,y) ,z) ,w))
+ (((((x (a b)) y) z) w) ^((((,(radd x a) 0) ,(ladd b y)) ,z) ,w))
+ ((((y ((a b) x)) z) w) ^(((,(radd y a) (0 ,(ladd b x))) ,z) ,w))
+ ((((y (x (a b))) z) w) ^(((,y (,(radd x a) 0)) ,(ladd b z)) ,w))
+ (((z (((a b) x) y)) w) ^((,(radd z a) ((0 ,(ladd b x)) ,y)) ,w))
+ (((z ((x (a b)) y)) w) ^((,z ((,(radd x a) 0) ,(ladd b y))) ,w))
+ (((z (y ((a b) x))) w) ^((,z (,(radd y a) (0 ,(ladd b x)))) ,w))
+ (((z (y (x (a b)))) w) ^((,z (,y (,(radd x a) 0))) ,(ladd b w)))
+ ((w ((((a b) x) y) z)) ^(,(radd w a) (((0 ,(ladd b x)) ,y) ,z)))
+ ((w (((x (a b)) y) z)) ^(,w (((,(radd x a) 0) ,(ladd b y)) ,z)))
+ ((w ((y ((a b) x)) z)) ^(,w ((,(radd y a) (0 ,(ladd b x))) ,z)))
+ ((w ((y (x (a b))) z)) ^(,w ((,y (,(radd x a) 0)) ,(ladd b z))))
+ ((w (z (((a b) x) y))) ^(,w (,(radd z a) ((0 ,(ladd b x)) ,y))))
+ ((w (z ((x (a b)) y))) ^(,w (,z ((,(radd x a) 0) ,(ladd b y)))))
+ ((w (z (y ((a b) x)))) ^(,w (,z (,(radd y a) (0 ,(ladd b x))))))
+ ((w (z (y (x (a b))))) ^(,w (,z (,y (,(radd x a) 0)))))
+ (else else)))
+
+(defun splt (sn)
+ (tree-case sn
+ ((a b)
+ (let ((as (splt a))
+ (bs (splt b)))
+ (cond
+ ((neq a as) ^(,as ,b))
+ ((neq b bs) ^(,a ,bs))
+ (t sn))))
+ (m (if (< m 10)
+ m
+ (let* ((x (trunc m 2))
+ (y (- m x)))
+ ^(,x ,y))))))
+
+(defun reduce (sn)
+ (let (sn*)
+ (while* (neq sn* sn)
+ (while* (neq sn* sn)
+ (shift sn* sn (explode sn)))
+ (shift sn* sn (splt sn)))
+ sn))
+
+(defun add (sn0 sn1)
+ (reduce (list sn0 sn1)))
+
+(defun mag (sn)
+ (tree-case sn
+ ((a b) (+ (* 3 (mag a)) (* 2 (mag b))))
+ (m m)))
+
+(defun solve-one (: (name :))
+ (flow name read-input (reduce-left add) mag))
+
+(defun solve-two (: (name :))
+ (flow name read-input (comb @1 2)
+ (mappend [juxt [chain [apf add] mag]
+ [chain [apf [flipargs add]] mag]])
+ find-max))
diff --git a/2021/18/input b/2021/18/input
new file mode 100644
index 0000000..5116955
--- /dev/null
+++ b/2021/18/input
@@ -0,0 +1,100 @@
+[[2,[2,[4,0]]],[6,1]]
+[[3,[4,[2,4]]],[[6,9],[6,1]]]
+[7,[8,[8,[0,8]]]]
+[[[[2,9],5],5],[[[0,1],8],[[7,9],5]]]
+[[[[3,0],[7,0]],[[9,6],[1,9]]],4]
+[[[0,[4,8]],8],[[[2,1],9],6]]
+[[[5,[7,7]],[[9,6],2]],[[[5,8],8],0]]
+[[0,3],[[8,2],[6,[2,2]]]]
+[[[9,0],[4,[4,7]]],[7,[[9,1],9]]]
+[0,[7,[1,1]]]
+[[[4,[0,1]],[[1,0],8]],[[[3,9],[0,1]],[[9,1],[8,8]]]]
+[[[6,0],3],2]
+[[[[4,1],[2,7]],[9,[8,9]]],[[3,0],0]]
+[[[[2,4],[8,7]],[9,[9,7]]],[[[2,5],6],9]]
+[[7,6],[[4,[2,4]],[3,8]]]
+[[7,2],[[8,8],7]]
+[[[[6,0],4],[[4,7],4]],[[6,[2,7]],[[6,5],3]]]
+[[[[8,8],[7,6]],4],5]
+[[0,[[6,9],[7,9]]],[9,5]]
+[9,[[[0,4],6],[[7,0],0]]]
+[[[[4,4],0],[3,[3,9]]],[[7,5],[5,[7,2]]]]
+[[[8,3],[[8,5],[4,4]]],[0,[0,3]]]
+[[9,[3,[6,7]]],[[7,0],[[9,2],7]]]
+[[[3,7],[[3,6],9]],7]
+[[2,[2,[5,7]]],[[[6,4],5],[4,7]]]
+[[[[9,0],2],[[4,4],6]],[[[3,2],[5,5]],[[5,9],7]]]
+[[[[2,5],4],[8,5]],6]
+[[[3,2],[[1,7],5]],[[8,1],[1,[1,2]]]]
+[8,[[3,[5,4]],5]]
+[[[2,[5,9]],[1,3]],[[[2,3],[8,3]],[[5,1],[8,9]]]]
+[[[2,0],[[3,3],[4,7]]],[[[8,7],[7,4]],1]]
+[[[[7,4],9],[3,[4,1]]],[[[8,4],5],7]]
+[[[[0,2],9],3],[9,[5,3]]]
+[3,4]
+[[[1,[0,2]],[[9,9],[8,2]]],6]
+[[[[2,9],[3,5]],9],[[9,3],[3,[6,7]]]]
+[[0,[[4,6],4]],[2,[5,2]]]
+[9,[[9,[6,8]],8]]
+[3,[[[1,2],[0,9]],[[4,9],1]]]
+[[[[8,7],[1,7]],[[2,6],[8,5]]],[3,[[8,0],[6,9]]]]
+[[8,[[4,9],7]],[3,[9,4]]]
+[[0,[[3,2],[2,2]]],0]
+[[[2,7],[[5,7],4]],[[[6,0],[2,1]],[[4,1],[1,6]]]]
+[[[[9,6],[0,3]],[[0,6],[0,4]]],[[[3,7],[6,7]],7]]
+[[[[1,1],6],[[5,6],4]],[[5,[0,7]],1]]
+[[[3,9],[[7,3],[1,5]]],[[[1,2],3],[0,[5,6]]]]
+[[[[4,4],[0,5]],6],[[7,[2,0]],6]]
+[[[[2,2],6],9],[[[9,1],2],[[8,6],8]]]
+[[[[5,0],8],[[5,7],7]],[6,[5,3]]]
+[[[[8,2],[8,4]],1],[[1,[7,3]],8]]
+[[[[3,2],2],[[4,9],[5,4]]],[[[9,2],4],[5,[6,0]]]]
+[[1,[[0,6],0]],[[[1,5],2],[[6,0],[3,7]]]]
+[4,[7,[6,[3,3]]]]
+[[[0,[2,5]],2],5]
+[[[0,[5,7]],9],[[[2,3],[3,4]],[[0,4],9]]]
+[[3,1],[[[4,1],9],[[0,5],[8,6]]]]
+[[9,[2,0]],[[0,[1,7]],[9,[6,4]]]]
+[[[[6,5],5],5],[5,8]]
+[[[[2,8],[1,3]],[[5,4],2]],[[[0,8],[5,1]],[9,[5,6]]]]
+[[[[6,9],7],[9,7]],2]
+[[[[1,7],8],[8,7]],[[[3,5],4],8]]
+[[[[1,8],[1,0]],0],[[7,1],5]]
+[[[9,[6,8]],3],[[5,1],[4,[8,2]]]]
+[[[0,[2,1]],1],[3,[9,[5,5]]]]
+[[2,5],[2,5]]
+[[[[1,1],[8,3]],[[1,9],[4,9]]],[[5,[4,8]],[[5,0],0]]]
+[[[0,7],[[3,4],1]],[[[1,2],[2,9]],[[2,0],9]]]
+[3,2]
+[[[9,[8,2]],[7,3]],7]
+[[[[6,9],9],[3,2]],0]
+[[3,[[6,1],8]],6]
+[[[[5,9],9],[[4,4],7]],[7,5]]
+[1,[[2,8],0]]
+[[2,[0,6]],[[[3,3],[0,4]],8]]
+[[[[4,8],9],[0,[3,0]]],[[0,[3,1]],[8,[7,4]]]]
+[[[6,[8,0]],[0,[8,9]]],[3,8]]
+[[[[0,8],[9,4]],[1,[2,0]]],1]
+[[7,6],[[[0,2],9],3]]
+[[[[1,0],3],2],1]
+[[[[1,2],8],5],7]
+[0,[[3,0],7]]
+[[7,[[0,9],[8,4]]],[[2,0],[[2,8],1]]]
+[[[1,8],[[8,1],1]],[3,[8,9]]]
+[4,[[3,7],[[5,2],9]]]
+[[[[3,8],[2,9]],[3,9]],[[[3,7],[6,9]],[[1,7],2]]]
+[9,[[[3,7],9],[[4,9],[8,6]]]]
+[[7,[3,9]],[0,7]]
+[[[1,6],0],[[7,[8,1]],[6,3]]]
+[[[[3,9],3],[[2,6],[8,0]]],[[3,3],9]]
+[[[1,2],[1,6]],[[1,[4,2]],0]]
+[[[0,[3,0]],2],[[7,[9,4]],[6,8]]]
+[6,[[[3,1],1],5]]
+[[[3,4],[[5,9],[1,1]]],[[2,[0,1]],3]]
+[[2,[[1,5],7]],[0,2]]
+[[1,[[6,7],7]],4]
+[6,[5,[[3,2],[6,8]]]]
+[[[3,9],[[4,0],6]],[8,[3,[5,2]]]]
+[[5,[[7,3],[2,2]]],[[7,7],7]]
+[[[1,2],[[2,4],[6,1]]],[[0,[4,2]],[[5,7],[2,3]]]]
+[[[8,7],8],[[7,[3,6]],[[1,0],4]]]
diff --git a/2021/18/testinput b/2021/18/testinput
new file mode 100644
index 0000000..70e9071
--- /dev/null
+++ b/2021/18/testinput
@@ -0,0 +1,10 @@
+[[[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]]
diff --git a/2021/18/testinput2 b/2021/18/testinput2
new file mode 100644
index 0000000..1368dc4
--- /dev/null
+++ b/2021/18/testinput2
@@ -0,0 +1,10 @@
+[[[0,[5,8]],[[1,7],[9,6]]],[[4,[1,2]],[[1,4],2]]]
+[[[5,[2,8]],4],[5,[[9,9],0]]]
+[6,[[[6,2],[5,6]],[[7,6],[4,7]]]]
+[[[6,[0,7]],[0,9]],[4,[9,[9,0]]]]
+[[[7,[6,4]],[3,[1,3]]],[[[5,5],1],9]]
+[[6,[[7,3],[3,2]]],[[[3,8],[5,7]],4]]
+[[[[5,4],[7,7]],8],[[8,3],8]]
+[[9,3],[[9,9],[6,[4,9]]]]
+[[2,[[7,7],7]],[[5,8],[[9,3],[0,2]]]]
+[[[[5,2],5],[8,[3,7]]],[[5,[7,5]],[4,4]]]