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