diff options
Diffstat (limited to '2021/18')
-rw-r--r-- | 2021/18/code.tl | 75 | ||||
-rw-r--r-- | 2021/18/code2.tl | 75 | ||||
-rw-r--r-- | 2021/18/input | 100 | ||||
-rw-r--r-- | 2021/18/testinput | 10 | ||||
-rw-r--r-- | 2021/18/testinput2 | 10 |
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]]] |