blob: 951877917729bd794f057d57324bd7517bb8a73f (
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
|
#lang racket
(define (number->digits n [acc '()])
(cond
[(< n 10) (cons n acc)]
[else (number->digits (quotient n 10) (cons (remainder n 10) acc))]))
(define (always-increasing? xs)
(match xs
[(list _) #t]
[(list* a b _) #:when (<= a b) (always-increasing? (cdr xs))]
[_ #f]))
(define (adjacent-pair? xs)
(match xs
[(list _) #f]
[(list* a a _) a]
[_ (adjacent-pair? (cdr xs))]))
;; part 1
(for/sum ([password (inclusive-range 125730 579381)]
#:do [(define digits (number->digits password))]
#:when ((conjoin always-increasing? adjacent-pair?) digits))
1)
;; part 2
(define (not-in-adjacent-triplet? xs)
(match xs
[(list a a c _ _ _) #:when (not (= a c)) #t]
[(list b a a c _ _) #:when (not (or (= a b) (= a c))) #t]
[(list _ b a a c _) #:when (not (or (= a b) (= a c))) #t]
[(list _ _ b a a c) #:when (not (or (= a b) (= a c))) #t]
[(list _ _ _ b a a) #:when (not (= a b)) #t]
[_ #f]))
(for/sum ([password (inclusive-range 125730 579381)]
#:do [(define digits (number->digits password))]
#:when ((conjoin always-increasing? adjacent-pair? not-in-adjacent-triplet?) digits))
1)
|