1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- #lang racket
- (require "../lib/utils.rkt")
- (define fp (open-input-file "input"))
- (define lines (get-lines fp))
- (define (extract-game line)
- (define game-str (cadr (string-split line ":")))
- (define sets-str (string-split game-str ";"))
- (set! sets-str (map string-trim sets-str))
- (map extract-set sets-str))
- (define (extract-set str)
- (define r 0)
- (define g 0)
- (define b 0)
- (define balls (string-split str ","))
- (set! balls
- (map (λ (s)
- (define pair (map string-trim (string-split s " ")))
- (list (string->number (car pair)) (cadr pair)))
- balls))
- (let loop ((balls balls))
- (if (null? balls)
- '()
- (let ()
- (define ball (car balls))
- (define number (car ball))
- (define color (cadr ball))
- (cond ((string=? "red" color) (set! r number))
- ((string=? "green" color) (set! g number))
- ((string=? "blue" color) (set! b number)))
- (loop (cdr balls)))))
- (list r g b))
- (define (power game)
- (define rs (map car game))
- (define gs (map cadr game))
- (define bs (map caddr game))
- (* (apply max rs) (apply max gs) (apply max bs)))
- (apply + (map power (map extract-game lines)))
|