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)
|