aboutsummaryrefslogtreecommitdiff
path: root/2020/day-02/day-02.rkt
blob: 3296d32ce7edba8bc2a0f0b22ad43b34269fc925 (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
44
45
#lang racket
(require "../../jj-aoc.rkt"
         threading)

(struct policy (least most char pwd) #:transparent)

(define (make-policy least-str most-str char-str pwd)
  (policy (string->number least-str)
          (string->number most-str)
          (string-ref char-str 0)
          pwd))

(define policies
  (for/list ([l (in-lines (open-day 02 2020))])
    (~>> l
         (regexp-match #px"(\\d+)-(\\d+) (\\w): (.*)")
         rest
         (apply make-policy))))

;; part 1
(define (valid-policy? p)
  (~>> p
       policy-pwd
       string->list
       (count (curry char=? (policy-char p)))
       ((λ (n) (and (>= n (policy-least p))
                    (<= n (policy-most p)))))))

(for/sum ([p (in-list policies)]
          #:when (valid-policy? p))
  1)

;; part 2
(define (valid-revised-policy? p)
  (~>> p
       policy-pwd
       string->list
       ((λ (lst) (list (list-ref lst (sub1 (policy-most p)))
                       (list-ref lst (sub1 (policy-least p))))))
       (count (curry char=? (policy-char p)))
       (= 1)))

(for/sum ([p (in-list policies)]
          #:when (valid-revised-policy? p))
  1)