Add Advent 2021 - day 16.

This commit is contained in:
Érico Nogueira 2021-12-16 04:18:32 -03:00
parent 78747594b7
commit c6059bf54e
2 changed files with 100 additions and 0 deletions

99
2021/day16/p.rkt Normal file
View File

@ -0,0 +1,99 @@
#lang racket/base
(require racket/list)
(require racket/match)
(define (char16->number c)
(string->number (string c) 16))
(define (make-line t)
(define numbers (map char16->number (string->list t)))
(flatten (for/list ([n numbers])
(define l (string->list (number->string n 2)))
(if (= (length l) 4)
l
(list (make-list (- 4 (length l)) #\0) l)))))
(define slist (make-line (read-line)))
; part 1
(define version-sum 0)
; l=list p=initial_position n=number_of_bits
(define (get-value-bits l p n)
(string->number (apply string (for/list ([index (in-range p (+ p n))]) (list-ref l index))) 2))
; l=list p=initial_position
; returns (values new_position return_value)
(define (advance-in-list l p)
(define (advance-p! n)
(set! p (+ p n)))
; get version
(set! version-sum (+ version-sum (get-value-bits l p 3)))
(advance-p! 3)
; get type ID
(define type-id (get-value-bits l p 3))
(advance-p! 3)
(define v (match type-id
; literal value
[4
(define sl (reverse (for/list ([i (in-naturals)] #:final (equal? (list-ref l p) #\0))
(define r (begin0 (get-value-bits l p 5) (advance-p! 5)))
(if (>= r 16)
(- r 16)
r))))
(for/sum ([r sl] [i (in-naturals)])
(* r (expt 2 (* i 4))))
]
; one of the operators
[operator
(define is-bits #t)
(define out-len
(let ([c (list-ref l p)])
(advance-p! 1)
(if (equal? c #\0)
; total length in bits
(let ([len (get-value-bits l p 15)])
(advance-p! 15)
len)
; number of subpackets
(let ([num (get-value-bits l p 11)])
(advance-p! 11)
(set! is-bits #f)
num))))
(define r
(if is-bits
(let ([pp p])
(for/list ([i (in-naturals)] #:break (= (- p pp) out-len))
(match-let-values ([(mp mr) (advance-in-list l p)])
(set! p mp)
mr)))
(let ([sub-count 0])
(for/list ([i (in-naturals)] #:break (= sub-count out-len))
(match-let-values ([(mp mr) (advance-in-list l p)])
(set! p mp)
(set! sub-count (add1 sub-count))
mr)))
))
; apply operators
(match operator
[0 (apply + r)]
[1 (apply * r)]
[2 (apply min r)]
[3 (apply max r)]
[5 (if (apply > r) 1 0)]
[6 (if (apply < r) 1 0)]
[7 (if (apply = r) 1 0)])
]
))
(values p v))
; returns result for part 2 and goes through input to update version sum
(advance-in-list slist 0)
; part 1
version-sum

1
2021/day16/test1.txt Normal file
View File

@ -0,0 +1 @@
020D790050D26C13EC1348326D336ACE00EC299E6A8B929ED59C880502E00A526B969F62BF35CB4FB15B93A6311F67F813300470037500043E2D4218FA000864538E905A39CAF77386E35AB01802FC01BA00021118617C1F00043A3F4748A53CF66008D00481272D73308334EDB0ED304E200D4E94CF612A49B40036C98A7CF24A53CA94C6370FBDCC9018029600ACD529CA9A4F62ACD2B5F928802F0D2665CA7D6CC013919E78A3800D3CF7794A8FC938280473057394AFF15099BA23CDD37A08400E2A5F7297F916C9F97F82D2DFA734BC600D4E3BC89CCBABCBE2B77D200412599244D4C0138C780120CC67E9D351C5AB4E1D4C981802980080CDB84E034C5767C60124F3BC984CD1E479201232C016100662D45089A00087C1084F12A724752BEFEA9C51500566759BF9BE6C5080217910CD00525B6350E8C00E9272200DCE4EF4C1DD003952F7059BCF675443005680103976997699795E830C02E4CBCE72EFC6A6218C88C9DF2F3351FCEF2D83CADB779F59A052801F2BAACDAE7F52A8190073937FE1D700439234DBB4F7374DC0CC804CF1006A0D47B8A4200F445865170401F8251662D100909401AB8803313217C680004320D43F871308D140C010E0069E7EDD1796AFC8255800052E20043E0F42A8B6400864258E51088010B85910A0F4ECE1DFE069C0229AE63D0B8DC6F82529403203305C00E1002C80AF5602908400A20240100852401E98400830021400D30029004B6100294008400B9D0023240061C000D19CACCD9005F694AEF6493D3F9948DEB3B4CC273FFD5E9AD85CFDFF6978B80050392AC3D98D796449BE304FE7F0C13CD716656BD0A6002A67E61A400F6E8029300B300B11480463D004C401889B1CA31800211162204679621200FCAC01791CF6B1AFCF2473DAC6BF3A9F1700016A3D90064D359B35D003430727A7DC464E6401594A57C93A0084CC56A662B8C00AA424989F2A9112