diff options
| author | Mistivia <i@mistivia.com> | 2024-02-25 20:11:54 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2024-02-25 20:11:54 +0800 |
| commit | 515ecbf5a20a8e432a998b0a543bedcb1bd64cf4 (patch) | |
| tree | 6353c603a8cf0276553f420205f8d1c730a318ce /02/1.rkt | |
| parent | e191b610c11326b587cf0b01fd6fc37b8d07bb19 (diff) | |
reorg code
Diffstat (limited to '02/1.rkt')
| -rw-r--r-- | 02/1.rkt | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/02/1.rkt b/02/1.rkt new file mode 100644 index 0000000..3ccd4ad --- /dev/null +++ b/02/1.rkt @@ -0,0 +1,52 @@ +#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 (possible? game) + (if (null? game) + #t + (let () + (define head (car game)) + (if (or (> (car head) 12) ; r + (> (cadr head) 13) ; g + (> (caddr head) 14)) ; b + #f + (possible? (cdr game)))))) + +(apply + (map cadr + (filter (λ (game) + (possible? (car game))) + (enumerate (map extract-game lines))))) |
