aboutsummaryrefslogtreecommitdiff
path: root/racket/aoc2020/day-02/day-02.rkt
blob: 9e22a1ac4999a604bda8f0543ba24a09a38bf1ad (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
#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)