#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)))