aboutsummaryrefslogtreecommitdiff
path: root/aoc2018/day-04/day-04.rkt
blob: 366009911ec637559304e3a59a56c0c9f7730146 (plain)
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
#lang racket

(require advent-of-code
         data/applicative
         data/monad
         megaparsack
         megaparsack/text
         threading)

(struct entry (month day hour minute message) #:transparent)

(define (parse-message chrs)
  (define str (apply string chrs))
  (match str
    ["wakes up" 'awake]
    ["falls asleep" 'asleep]
    [shift (~> shift (string-trim "Guard #") (string-trim " begins shift") string->number)]))

(define entry/p
  (do (string/p "[1518-")
      [month <- integer/p]
      (char/p #\-)
      [day <- integer/p]
      space/p
      [hour <- integer/p]
      (char/p #\:)
      [minute <- integer/p]
      (string/p "] ")
      [message <- (many/p any-char/p)]
      (pure (entry month day hour minute (parse-message message)))))

(define (parse-entry str)
  (parse-result! (parse-string entry/p str)))

(define entries
  (~> (port->lines (open-aoc-input (find-session) 2018 4 #:cache #true)) (map parse-entry _)))

(define sorted-entries
  (~> entries
      (sort < #:key entry-minute)
      (sort < #:key entry-hour)
      (sort < #:key entry-day)
      (sort < #:key entry-month)))