Compare commits
2 Commits
78747594b7
...
d2c04effce
Author | SHA1 | Date |
---|---|---|
Érico Nogueira | d2c04effce | |
Érico Nogueira | c6059bf54e |
|
@ -0,0 +1,92 @@
|
|||
#lang racket/base
|
||||
(require racket/match)
|
||||
|
||||
(define ss (read-line))
|
||||
(define slen (* (string-length ss) 4))
|
||||
(define sn (string->number ss 16))
|
||||
|
||||
; part 1
|
||||
(define version-sum 0)
|
||||
|
||||
; l=list p=initial_position n=number_of_bits
|
||||
(define (get-value-bits l p n)
|
||||
(let* ([base (- slen p)] [base-start (- base n)])
|
||||
(bitwise-bit-field l base-start base)))
|
||||
(define (is-bit-set? l p)
|
||||
(bitwise-bit-set? l (- slen p 1)))
|
||||
|
||||
; l=number 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 (not (is-bit-set? l p)))
|
||||
(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 (is-bit-set? l p)])
|
||||
(advance-p! 1)
|
||||
(if (not c)
|
||||
; 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 sn 0)
|
||||
; part 1
|
||||
version-sum
|
|
@ -0,0 +1 @@
|
|||
020D790050D26C13EC1348326D336ACE00EC299E6A8B929ED59C880502E00A526B969F62BF35CB4FB15B93A6311F67F813300470037500043E2D4218FA000864538E905A39CAF77386E35AB01802FC01BA00021118617C1F00043A3F4748A53CF66008D00481272D73308334EDB0ED304E200D4E94CF612A49B40036C98A7CF24A53CA94C6370FBDCC9018029600ACD529CA9A4F62ACD2B5F928802F0D2665CA7D6CC013919E78A3800D3CF7794A8FC938280473057394AFF15099BA23CDD37A08400E2A5F7297F916C9F97F82D2DFA734BC600D4E3BC89CCBABCBE2B77D200412599244D4C0138C780120CC67E9D351C5AB4E1D4C981802980080CDB84E034C5767C60124F3BC984CD1E479201232C016100662D45089A00087C1084F12A724752BEFEA9C51500566759BF9BE6C5080217910CD00525B6350E8C00E9272200DCE4EF4C1DD003952F7059BCF675443005680103976997699795E830C02E4CBCE72EFC6A6218C88C9DF2F3351FCEF2D83CADB779F59A052801F2BAACDAE7F52A8190073937FE1D700439234DBB4F7374DC0CC804CF1006A0D47B8A4200F445865170401F8251662D100909401AB8803313217C680004320D43F871308D140C010E0069E7EDD1796AFC8255800052E20043E0F42A8B6400864258E51088010B85910A0F4ECE1DFE069C0229AE63D0B8DC6F82529403203305C00E1002C80AF5602908400A20240100852401E98400830021400D30029004B6100294008400B9D0023240061C000D19CACCD9005F694AEF6493D3F9948DEB3B4CC273FFD5E9AD85CFDFF6978B80050392AC3D98D796449BE304FE7F0C13CD716656BD0A6002A67E61A400F6E8029300B300B11480463D004C401889B1CA31800211162204679621200FCAC01791CF6B1AFCF2473DAC6BF3A9F1700016A3D90064D359B35D003430727A7DC464E6401594A57C93A0084CC56A662B8C00AA424989F2A9112
|
Loading…
Reference in New Issue