d06
parent
de4018ffd5
commit
50e2a39a2a
@ -0,0 +1,6 @@
|
||||
1, 1
|
||||
1, 6
|
||||
8, 3
|
||||
3, 4
|
||||
5, 5
|
||||
8, 9
|
@ -0,0 +1,65 @@
|
||||
#lang debug br
|
||||
|
||||
#|
|
||||
Start with the area of the grid bounded by the locations.
|
||||
Calculate the neighborhoods within this grid.
|
||||
Any location that has a grid neighborhood that includes an edge piece
|
||||
will grow to infinity (because adjacent pieces outside the grid will also be closest to that location)
|
||||
So ignore those. And search the others for the answer.
|
||||
|#
|
||||
|
||||
(define locs (for/list ([ln (in-lines (open-input-file "06.txt"))])
|
||||
(match (map string->number (string-split ln ", "))
|
||||
[(list x y) (cons x y)])))
|
||||
|
||||
(define (bounding-box locs)
|
||||
(match locs
|
||||
[(list (cons xs ys) ...)
|
||||
(list (cons (apply min xs) (apply max ys))
|
||||
(cons (apply max xs) (apply min ys)))]))
|
||||
|
||||
(define bbox (bounding-box locs))
|
||||
|
||||
(define (manhattan-dist loca locb)
|
||||
(match (list loca locb)
|
||||
[(list (cons xa ya) (cons xb yb))
|
||||
(+ (abs (- xa xb)) (abs (- ya yb)))]))
|
||||
|
||||
(define (closest-to pt locs)
|
||||
(match (sort (map (λ (loc) (cons (manhattan-dist pt loc) loc)) locs) < #:key car)
|
||||
[(list* (cons score _) (cons score2 _) _) #:when (= score score2) #false] ; because tie
|
||||
[(cons (cons _ loc) _) loc]))
|
||||
|
||||
(define (finite-neighborhoods locs)
|
||||
(define closest-table (make-hash))
|
||||
(match-define (list (cons xmin ymax) (cons xmax ymin)) bbox)
|
||||
(for* ([x (in-range xmin (add1 xmax))]
|
||||
[y (in-range ymin (add1 ymax))])
|
||||
(define pt (cons x y))
|
||||
(define loc (closest-to pt locs))
|
||||
(when loc
|
||||
(if (or (= x xmin) (= x xmax) (= y ymin) (= y ymax)) ; on edge, therefore infinite
|
||||
(hash-set! closest-table loc #f) ; invalidate loc
|
||||
(hash-update! closest-table loc (λ (val) (and val (cons pt val))) null))))
|
||||
(filter values (hash-values closest-table)))
|
||||
|
||||
(define (★)
|
||||
(apply max (map length (finite-neighborhoods locs))))
|
||||
|
||||
(define (region locs target-dist)
|
||||
(match-define (list (cons xmin ymax) (cons xmax ymin)) bbox)
|
||||
(for*/list ([x (in-range xmin (add1 xmax))]
|
||||
[y (in-range ymin (add1 ymax))]
|
||||
[pt (in-value (cons x y))]
|
||||
[total-dist (in-value (for/sum ([loc (in-list locs)])
|
||||
(manhattan-dist pt loc)))]
|
||||
#:when (< total-dist target-dist))
|
||||
pt))
|
||||
|
||||
(define (★★)
|
||||
(length (region locs 10000)))
|
||||
|
||||
(module+ test
|
||||
(require rackunit)
|
||||
(check-equal? (time (★)) 6047)
|
||||
(check-equal? (time (★★)) 46320))
|
@ -0,0 +1,50 @@
|
||||
165, 169
|
||||
334, 217
|
||||
330, 227
|
||||
317, 72
|
||||
304, 232
|
||||
115, 225
|
||||
323, 344
|
||||
161, 204
|
||||
316, 259
|
||||
63, 250
|
||||
280, 205
|
||||
84, 282
|
||||
271, 158
|
||||
190, 296
|
||||
106, 349
|
||||
171, 178
|
||||
203, 108
|
||||
89, 271
|
||||
193, 254
|
||||
111, 210
|
||||
341, 343
|
||||
349, 311
|
||||
143, 172
|
||||
170, 307
|
||||
128, 157
|
||||
183, 315
|
||||
211, 297
|
||||
74, 281
|
||||
119, 164
|
||||
266, 345
|
||||
184, 62
|
||||
96, 142
|
||||
134, 61
|
||||
117, 52
|
||||
318, 72
|
||||
338, 287
|
||||
61, 215
|
||||
323, 255
|
||||
93, 171
|
||||
325, 249
|
||||
183, 171
|
||||
71, 235
|
||||
329, 306
|
||||
322, 219
|
||||
151, 298
|
||||
180, 255
|
||||
336, 291
|
||||
72, 300
|
||||
223, 286
|
||||
179, 257
|
Reference in New Issue