Overview
| Comment: | Add Day 6 solutions |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
2228f026d361e9cd964387073c928c4d |
| User & Date: | joel on 2018-12-07 17:09:17 |
| Other Links: | manifest | tags |
Context
|
2018-12-07
| ||
| 19:09 | Add Day 7 input file check-in: d152a4 user: joel tags: trunk | |
| 17:09 | Add Day 6 solutions check-in: 2228f0 user: joel tags: trunk | |
| 17:09 | Add Day 6 input check-in: b4b3f5 user: joel tags: trunk | |
Changes
Added day06.rkt version [3ae9d4].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 58 59 60 61 62 63 64 65 66 67 68 69 |
#lang racket
(require rackunit)
(define (inputline->pair str)
(map string->number (string-split str ", ")))
(define input (map inputline->pair (file->lines "day06-input.txt")))
;; Get the biggest coordinate and use that as the grid size in both directions
(define grid-size (apply max (first (sort input > #:key (curry apply max)))))
;; Manhattan distance is just the sum of the diff between two x and y coordinates
(define (distance-between pt1 pt2)
(+ (abs (- (first pt1) (first pt2)))
(abs (- (second pt1) (second pt2)))))
;; Return the index of "input" that is the closest point to the point given,
;; or -1 if there is a tie
(define (closest-input-pt p)
(define distances (map (curry distance-between p) input))
(define closest-idxs (indexes-of distances (apply min distances)))
(cond
[(> (length closest-idxs) 1) -1]
[else (first closest-idxs)]))
;; Create a list of all x,y points in the grid, together with a third element:
;; the index of the closest point in `inputs` (-1 if a tie)
(define grid
(for*/list ([x (in-range grid-size)]
[y (in-range grid-size)])
(list x y (closest-input-pt (list x y)))))
; An edge point is one where either coordinate is 0 or equal to `grid-size`
(define (is-edge? pt)
(let ([coords (take pt 2)])
(or (member 0 coords) (member (sub1 grid-size) coords))))
;; Identify the indexes of the points in `input` whose areas are infinite
;; I assume the "infinite" areas are those which touch the grid edges
(define infinite-area-pt-idxs
(let ([edges (filter is-edge? grid)])
; don't include -1 in result
(remove-duplicates (filter positive? (map third edges)))))
;; A list of same length as `input`, where each element is the size of the area
;; of the corresponding point in `input`
(define point-areas
(for/list ([idx (in-range (length input))])
(count (curry = idx) (map third grid))))
(define (day06-part1)
(define filtered-pt-areas
(filter positive?
(for/list ([idx (in-range (length input))])
(if (member idx infinite-area-pt-idxs) 0 (list-ref point-areas idx)))))
(apply max filtered-pt-areas))
(module+ test
(check-equal? (time (day06-part1)) 5626)) ; Correct answer for part 1
(define (sum-of-distances grid-pt)
(apply + (map (curry distance-between (take grid-pt 2)) input)))
(define (day06-part2)
(count (curryr < 10000) (map sum-of-distances grid)))
(module+ test
(check-equal? (time (day06-part2)) 46554)) ; Correct answer for part 2
|