puzzle-01.scm 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. (import
  2. (except (rnrs base) let-values map error)
  3. (only (guile) lambda* λ command-line string-null?)
  4. ;; (ice-9 peg)
  5. (srfi srfi-1)
  6. (fileio))
  7. (define forward? (λ (char) (char=? char #\F)))
  8. (define backward? (λ (char) (char=? char #\B)))
  9. (define right? (λ (char) (char=? char #\R)))
  10. (define left? (λ (char) (char=? char #\L)))
  11. (define lower-half-interval
  12. (λ (min-num max-num)
  13. (cons min-num
  14. (floor
  15. (- max-num
  16. (/ (- max-num min-num) 2))))))
  17. (define upper-half-interval
  18. (λ (min-num max-num)
  19. (cons (ceiling
  20. (+ min-num
  21. (/ (- max-num min-num) 2)))
  22. max-num)))
  23. (define line->seat
  24. (lambda* (line #:key (num-rows 128) (num-cols 8))
  25. (let ([chars (string->list line)])
  26. (let next-char ([remaining-chars chars]
  27. [row-range (cons 0 (- num-rows 1))]
  28. [col-range (cons 0 (- num-cols 1))])
  29. (cond
  30. [(null? remaining-chars) (cons row-range col-range)]
  31. [(forward? (car remaining-chars))
  32. (next-char (cdr remaining-chars)
  33. (lower-half-interval (car row-range) (cdr row-range))
  34. col-range)]
  35. [(backward? (car remaining-chars))
  36. (next-char (cdr remaining-chars)
  37. (upper-half-interval (car row-range) (cdr row-range))
  38. col-range)]
  39. [(left? (car remaining-chars))
  40. (next-char (cdr remaining-chars)
  41. row-range
  42. (lower-half-interval (car col-range) (cdr col-range)))]
  43. [(right? (car remaining-chars))
  44. (next-char (cdr remaining-chars)
  45. row-range
  46. (upper-half-interval (car col-range) (cdr col-range)))]
  47. [else
  48. (error "unexpected char" (car remaining-chars))])))))
  49. (define seat-row
  50. (λ (seat)
  51. (car (car seat))))
  52. (define seat-col
  53. (λ (seat)
  54. (car (cdr seat))))
  55. (define seat->seat-id
  56. (lambda* (seat #:key (row-width 8))
  57. (let ([row (seat-row seat)]
  58. [col (seat-col seat)])
  59. (+ (* row row-width) col))))
  60. (define main
  61. (λ (cmd-line-args)
  62. (let* ([lines (get-lines-from-file (second cmd-line-args))]
  63. [seats (map line->seat lines)]
  64. [seat-ids (map seat->seat-id seats)])
  65. (apply max seat-ids))))
  66. (simple-format (current-output-port)
  67. "~a\n"
  68. (main (command-line)))