2.rkt 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #lang racket
  2. (require "../../lib/utils.rkt")
  3. (define lines
  4. (call-with-input-file "input"
  5. (λ (fp) (get-lines fp))))
  6. (define games (map string-split lines))
  7. (define (transform-cheat mine oppo)
  8. (cond ((string=? "X" mine) (cond ((string=? "A" oppo) "Z")
  9. ((string=? "B" oppo) "X")
  10. ((string=? "C" oppo) "Y")))
  11. ((string=? "Y" mine) (cond ((string=? "A" oppo) "X")
  12. ((string=? "B" oppo) "Y")
  13. ((string=? "C" oppo) "Z")))
  14. ((string=? "Z" mine) (cond ((string=? "A" oppo) "Y")
  15. ((string=? "B" oppo) "Z")
  16. ((string=? "C" oppo) "X")))))
  17. (set! games
  18. (map
  19. (λ (x)
  20. (list (car x) (transform-cheat (cadr x) (car x))))
  21. games))
  22. (define (score game)
  23. (define (base-score mine)
  24. (cond ((string=? "X" mine) 1)
  25. ((string=? "Y" mine) 2)
  26. ((string=? "Z" mine) 3)))
  27. (define (win-score mine oppo)
  28. (cond ((string=? "X" mine) (cond ((string=? "A" oppo) 3)
  29. ((string=? "B" oppo) 0)
  30. ((string=? "C" oppo) 6)))
  31. ((string=? "Y" mine) (cond ((string=? "A" oppo) 6)
  32. ((string=? "B" oppo) 3)
  33. ((string=? "C" oppo) 0)))
  34. ((string=? "Z" mine) (cond ((string=? "A" oppo) 0)
  35. ((string=? "B" oppo) 6)
  36. ((string=? "C" oppo) 3)))))
  37. (+ (base-score (cadr game)) (win-score (cadr game) (car game))))
  38. (apply + (map score games))