-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathday05.rkt
57 lines (38 loc) · 1.16 KB
/
day05.rkt
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
46
47
48
49
50
51
52
53
54
55
56
57
#lang racket
(require "aoc.rkt" threading)
(struct point (x y) #:transparent)
(define (points->lines pts)
(define (aux a b)
(values (abs (- b a)) (sgn (- b a))))
(match-define (list x1 y1 x2 y2) pts)
(define-values (dx sx) (aux x1 x2))
(define-values (dy sy) (aux y1 y2))
(list x1 sx y1 sy (max dx dy)))
(define (solve instrs part)
(define c (make-hash))
(for ([pts (in-list instrs)])
(match-define (list x sx y sy dist) pts)
(for ([i (in-inclusive-range 0 dist)])
(define pt (point (+ x (* i sx))
(+ y (* i sy))))
(cond [(match part
[1 (or (= sx 0) (= sy 0))]
[2 #t])
(hash-update! c pt add1 0)])))
(count (curryr >= 2) (hash-values c)))
(define (parse filename)
(define (parse-line line)
(~>> line
(regexp-match #px"^(\\d+),(\\d+) -> (\\d+),(\\d+)$")
rest
(map int)
(points->lines)))
(map parse-line (read-input filename)))
(define data (parse 5))
(solve data 1)
(solve data 2)
(module+ test
(require rackunit)
(define data (parse "05-test"))
(check-equal? (solve data 1) 5)
(check-equal? (solve data 2) 12))