๐Ÿ“ฆ Bogdanp / aoc2020

๐Ÿ“„ day05.rkt ยท 54 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54#lang racket/base

(require racket/match)

(define (fx/ a b)
  (inexact->exact (round (/ a b))))

(define (lower-half lo hi)
  (values lo (- hi (fx/ (- hi lo) 2))))

(define (upper-half lo hi)
  (values (+ lo (fx/ (- hi lo) 2)) hi))

(define (parse-seat l)
  (define in (open-input-string l))
  (let loop ([row    0]
             [row-lo 0]
             [row-hi 127]
             [col    0]
             [col-lo 0]
             [col-hi 7])
    (case (read-char in)
      [(#\F) (let-values ([(new-row-lo new-row-hi) (lower-half row-lo row-hi)])
               (loop new-row-lo new-row-lo new-row-hi col col-lo col-hi))]
      [(#\B) (let-values ([(new-row-lo new-row-hi) (upper-half row-lo row-hi)])
               (loop new-row-hi new-row-lo new-row-hi col col-lo col-hi))]
      [(#\L) (let-values ([(new-col-lo new-col-hi) (lower-half col-lo col-hi)])
               (loop row row-lo row-hi new-col-lo new-col-lo new-col-hi))]
      [(#\R) (let-values ([(new-col-lo new-col-hi) (upper-half col-lo col-hi)])
               (loop row row-lo row-hi new-col-hi new-col-lo new-col-hi))]
      [else (cons row col)])))

(define seats
  (call-with-input-file "input05.txt"
    (lambda (in)
      (for/list ([line (in-lines in)])
        (parse-seat line)))))

(define seat-ids
  (sort
   (for/list ([seat (in-list seats)])
     (match-define (cons row col) seat)
     (+ (* row 8) col))
   <))

(define highest-id
  (apply max seat-ids))

(define missing-id
  (for/fold ([last-id (car seat-ids)] #:result (add1 last-id))
            ([seat-id (in-list (cdr seat-ids))])
    #:break (> (- seat-id last-id) 1)
    seat-id))