1.rkt 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #lang racket
  2. (define fp (open-input-file "input"))
  3. (define (get-lines fp)
  4. (let loop ((lines '()))
  5. (define l (read-line fp))
  6. (if (eof-object? l)
  7. (reverse lines)
  8. (loop (cons l lines)))))
  9. (define lines (get-lines fp))
  10. (define (extract-game line)
  11. (define game-str (cadr (string-split line ":")))
  12. (define sets-str (string-split game-str ";"))
  13. (set! sets-str (map string-trim sets-str))
  14. (map extract-set sets-str))
  15. (define (extract-set str)
  16. (define r 0)
  17. (define g 0)
  18. (define b 0)
  19. (define balls (string-split str ","))
  20. (set! balls
  21. (map (lambda (s)
  22. (define pair (map string-trim (string-split s " ")))
  23. (list (string->number (car pair)) (cadr pair)))
  24. balls))
  25. (let loop ((balls balls))
  26. (if (null? balls)
  27. '()
  28. (let ()
  29. (define ball (car balls))
  30. (define number (car ball))
  31. (define color (cadr ball))
  32. (cond ((string=? "red" color) (set! r number))
  33. ((string=? "green" color) (set! g number))
  34. ((string=? "blue" color) (set! b number)))
  35. (loop (cdr balls)))))
  36. (list r g b))
  37. (define (possible? game)
  38. (if (null? game)
  39. #t
  40. (let ()
  41. (define head (car game))
  42. (if (or (> (car head) 12) ; r
  43. (> (cadr head) 13) ; g
  44. (> (caddr head) 14)) ; b
  45. #f
  46. (possible? (cdr game))))))
  47. (define (enumerate lst)
  48. (let loop ((i 1) (ret '()) (remain lst))
  49. (if (null? remain)
  50. (reverse ret)
  51. (loop (+ 1 i) (cons (list (car remain) i) ret) (cdr remain)))))
  52. (apply + (map cadr
  53. (filter (lambda (game)
  54. (possible? (car game)))
  55. (enumerate (map extract-game lines)))))