Add Advent 2021 - day 18.

Lots and lots of recursion.

test6.txt is my puzzle input.
This commit is contained in:
Érico Nogueira 2021-12-18 19:33:23 -03:00
parent f259ef3441
commit 87e6927028
7 changed files with 228 additions and 0 deletions

95
2021/day18/p.rkt Normal file
View File

@ -0,0 +1,95 @@
#lang racket/base
(require racket/string)
(require racket/match)
(define slist
(let-values ([(in out) (make-pipe)])
(for/list ([t (in-lines)])
(display (string-replace t "," " . ") out)
(read in))))
(define (reduce-number v)
(define (get-explosion vl depth position)
(define explode (= depth 4))
(define (recurse fn p)
(let* ([nc (fn vl)]
[np (add1 p)])
(if (pair? nc)
(get-explosion nc (add1 depth) p)
(begin
;(printf "nc np ~a ~a~n" nc np)
(values explode np nc (cdr vl))))))
(match/values (recurse car position)
[(#t p a b) (values #t p a b)]
[(#f p a b) (recurse cdr p)]))
(define-values (explode where-explode v1 v2) (get-explosion v 0 0))
;(printf "explosion ~a ~a~n" explode where-explode)
(define (traverse-number vl position)
;(printf "~a ~a~n" vl position)
(define (recurse fn p)
(let* ([nc (fn vl)]
[np (add1 p)])
;(printf "pair ~a~n" nc)
(if (pair? nc)
(traverse-number nc p)
(values
(if (not explode)
nc
(if (= (- where-explode 2) p)
(+ v1 nc)
(if (= (+ 1 where-explode) p)
(+ v2 nc)
nc)))
np))))
(if (and explode (not (pair? (car vl))) (not (pair? (cdr vl))) (= (add1 position) where-explode))
(values 0 (+ 2 position))
(let*-values ([(r p) (recurse car position)]
[(l p) (recurse cdr p)])
;(printf "new cons ~a ~a ~n" r l)
(values (cons r l) p))))
(define can-do #t)
(define (split-number vl)
(define (recurse fn)
(let ([nc (fn vl)])
(if (pair? nc)
(split-number nc)
(if (and can-do (>= nc 10))
(let ([rdiv (/ nc 2)])
(set! can-do #f)
(cons (floor rdiv) (ceiling rdiv)))
nc))))
(cons
(recurse car)
(recurse cdr)))
(let-values ([(nv p) (traverse-number v 0)])
(if (equal? nv v)
(let ([nv (split-number v)])
(if (equal? nv v)
v
(reduce-number nv)))
(reduce-number nv))))
(define (add-values v l)
(if (null? l)
v
(add-values (reduce-number (cons v (car l))) (cdr l))))
(define (magnitude-number v)
(define (recurse fn)
(let ([nc (fn v)])
(if (pair? nc)
(magnitude-number nc)
nc)))
(+ (* 3 (recurse car)) (* 2 (recurse cdr))))
; part 1
(magnitude-number (add-values (car slist) (cdr slist)))
; part 2
(apply max (for*/list ([v1 slist] [v2 slist] #:unless (equal? v1 v2))
(magnitude-number (add-values v1 (list v2)))))

5
2021/day18/test1.txt Normal file
View File

@ -0,0 +1,5 @@
[1 . 1]
[2 . 2]
[3 . 3]
[4 . 4]
[5 . 5]

6
2021/day18/test2.txt Normal file
View File

@ -0,0 +1,6 @@
[1,1]
[2,2]
[3,3]
[4,4]
[5,5]
[6,6]

10
2021/day18/test3.txt Normal file
View File

@ -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]]

2
2021/day18/test4.txt Normal file
View File

@ -0,0 +1,2 @@
[[[[4,3],4],4],[7,[[8,4],9]]]
[1,1]

10
2021/day18/test5.txt Normal file
View File

@ -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]]]

100
2021/day18/test6.txt Normal file
View File

@ -0,0 +1,100 @@
[[[7,1],2],3]
[[1,7],7]
[[6,8],[[6,[3,6]],[0,5]]]
[[[[2,1],8],[[9,4],8]],[[6,5],4]]
[[1,[[3,8],[9,1]]],[[9,1],[[1,7],0]]]
[[[7,4],[8,[7,6]]],[9,[[6,3],[7,8]]]]
[[[[5,0],1],4],[[5,[6,9]],[[4,3],2]]]
[[[3,8],8],[[[3,2],8],[9,[0,5]]]]
[[[[5,8],[3,9]],[7,[1,4]]],[6,1]]
[3,[[[3,3],9],[0,7]]]
[[[6,9],1],[[0,[8,4]],[[2,2],9]]]
[[[[6,2],3],[0,4]],3]
[[[[3,8],7],[[7,4],0]],[2,[5,[2,8]]]]
[[4,[9,[8,0]]],[[1,5],[[9,3],8]]]
[[[8,5],[3,[1,4]]],[[6,[8,0]],[[2,7],[2,6]]]]
[4,7]
[[[[2,3],0],[[1,9],[4,1]]],[[1,[4,2]],3]]
[[[8,[5,3]],[[5,7],7]],[[5,6],[6,4]]]
[[[[2,4],1],[8,6]],[[6,5],[0,[9,1]]]]
[[[1,[5,7]],8],[[[9,1],9],[[1,2],4]]]
[[[[5,5],[4,0]],[4,[9,6]]],[[[2,1],1],7]]
[[[[1,9],[9,5]],[[5,0],[3,1]]],[[[6,7],[8,8]],[[7,3],0]]]
[[6,[[6,7],[9,0]]],[[7,7],[[0,3],0]]]
[[0,6],[5,2]]
[[[[5,8],3],[[9,0],8]],[7,4]]
[[0,[[9,9],[9,4]]],[[[1,1],2],[1,[6,7]]]]
[0,[[5,7],2]]
[[2,[[5,4],6]],[1,[8,[7,6]]]]
[[[1,7],[8,[5,8]]],[[[2,1],[9,1]],[[5,6],9]]]
[[1,8],[9,[4,3]]]
[5,[2,[[5,5],9]]]
[3,[8,[[2,8],[4,8]]]]
[[[4,9],[[5,5],0]],[9,[8,[3,0]]]]
[[[2,[6,4]],[8,[9,9]]],[[[0,4],8],[3,[9,7]]]]
[[[[8,1],[2,4]],3],[1,[[3,3],[6,3]]]]
[[[8,[7,3]],[1,8]],2]
[[8,[8,4]],[[6,[4,7]],[3,0]]]
[[[[4,6],[8,3]],9],[9,[[8,9],[0,9]]]]
[[3,[[2,7],[4,4]]],2]
[8,[[[8,6],2],[[8,9],6]]]
[[[[5,7],[2,0]],[[0,2],[5,5]]],[[[8,5],5],[[1,3],[2,3]]]]
[[1,6],[[9,8],[9,[4,9]]]]
[[[[1,4],5],9],[4,[6,8]]]
[[[[6,4],[9,0]],[[1,4],[6,6]]],[[9,[2,8]],2]]
[[[[5,9],2],[[0,0],5]],[2,1]]
[6,[[3,2],[[3,0],0]]]
[[[[7,4],1],[[4,1],1]],[[3,4],4]]
[3,[9,[9,7]]]
[[[3,[3,3]],[0,3]],[1,[1,8]]]
[[8,[8,7]],[[9,2],5]]
[[[1,[3,9]],[5,9]],[1,5]]
[[[[7,8],[9,7]],9],[[[9,2],[2,2]],[[9,6],8]]]
[4,[[3,5],[[1,3],[5,5]]]]
[7,[[[0,1],2],[[3,6],5]]]
[0,[[[2,4],[3,4]],[8,9]]]
[[1,[[6,8],1]],[8,0]]
[1,1]
[7,0]
[[1,2],[[0,[8,3]],[[4,5],[9,7]]]]
[[[[2,3],[5,9]],[7,[1,9]]],2]
[[3,5],[[9,7],9]]
[[[[6,9],[4,8]],6],0]
[[[[2,4],[3,9]],[2,[9,4]]],[[[8,9],[3,1]],7]]
[[5,[[0,2],4]],[[[9,9],[7,4]],[1,5]]]
[3,[6,[[5,4],1]]]
[[[2,[2,7]],2],[[4,[7,3]],5]]
[7,[[0,[2,0]],[[9,4],6]]]
[[4,[3,[6,2]]],9]
[[[0,[5,6]],[8,3]],[[7,9],[0,[9,6]]]]
[8,[[6,4],[4,8]]]
[[[8,[6,8]],[5,[7,3]]],[[[7,8],5],2]]
[[[[3,5],[4,7]],5],[[0,0],[9,[1,9]]]]
[[7,[[1,5],9]],[[[3,4],[1,7]],[1,[7,9]]]]
[[0,[3,[4,1]]],[[[2,9],3],[4,[0,8]]]]
[[[8,[1,6]],[[0,1],7]],[[[1,1],[0,2]],[[9,4],[9,6]]]]
[[[[6,7],0],[[6,8],9]],[[1,[6,6]],[[2,9],[4,7]]]]
[[[[5,0],[1,2]],[1,[5,1]]],[[0,4],1]]
[[9,1],6]
[[7,2],[[[5,5],[4,3]],6]]
[[9,[[0,6],9]],[[7,9],[7,1]]]
[[[[7,3],[6,4]],[[2,5],[7,2]]],[[[4,4],0],[[9,5],[8,5]]]]
[[[[8,8],[6,4]],[[0,2],[9,5]]],2]
[[[[3,0],7],[9,2]],[[0,[8,6]],[[7,2],[8,5]]]]
[[0,6],[1,[9,[4,3]]]]
[[0,8],[[[5,0],6],[5,[2,0]]]]
[[[[7,1],[0,3]],[[9,9],[3,5]]],[4,[8,4]]]
[7,[[1,[3,7]],[[3,4],[2,3]]]]
[[[[2,2],[4,8]],[[3,4],0]],[[[1,5],[2,8]],5]]
[6,[[[9,1],5],[9,9]]]
[[[2,[8,6]],[[9,9],[6,3]]],4]
[[[[3,2],[9,3]],8],9]
[[[[6,9],0],[[0,6],[1,3]]],[[5,[9,8]],[[1,5],[3,7]]]]
[[2,[4,[2,3]]],[[[6,0],[7,2]],3]]
[[[[8,3],4],[6,[8,8]]],4]
[[[9,8],5],[[[4,4],[6,3]],[8,6]]]
[9,2]
[[[3,4],[4,[7,0]]],[0,[4,[6,9]]]]
[[[0,8],[3,9]],[[[3,8],6],[[9,3],6]]]
[[[[5,6],[0,3]],1],[8,[2,9]]]
[[[[4,2],8],[[9,3],7]],0]