diff --git a/input/10.txt b/input/10.txt new file mode 100644 index 0000000..7d05791 --- /dev/null +++ b/input/10.txt @@ -0,0 +1,33 @@ +.#..#..##.#...###.#............#. +.....#..........##..#..#####.#..# +#....#...#..#.......#...........# +.#....#....#....#.#...#.#.#.#.... +..#..#.....#.......###.#.#.##.... +...#.##.###..#....#........#..#.# +..#.##..#.#.#...##..........#...# +..#..#.......................#..# +...#..#.#...##.#...#.#..#.#...... +......#......#.....#............. +.###..#.#..#...#..#.#.......##..# +.#...#.................###......# +#.#.......#..####.#..##.###.....# +.#.#..#.#...##.#.#..#..##.#.#.#.. +##...#....#...#....##....#.#....# +......#..#......#.#.....##..#.#.. +##.###.....#.#.###.#..#..#..###.. +#...........#.#..#..#..#....#.... +..........#.#.#..#.###...#.....#. +...#.###........##..#..##........ +.###.....#.#.###...##.........#.. +#.#...##.....#.#.........#..#.### +..##..##........#........#......# +..####......#...#..........#.#... +......##...##.#........#...##.##. +.#..###...#.......#........#....# +...##...#..#...#..#..#.#.#...#... +....#......#.#............##..... +#......####...#.....#...#......#. +...#............#...#..#.#.#..#.# +.#...#....###.####....#.#........ +#.#...##...#.##...#....#.#..##.#. +.#....#.###..#..##.#.##...#.#..## diff --git a/lib.rkt b/lib.rkt index 92aafad..25db457 100644 --- a/lib.rkt +++ b/lib.rkt @@ -12,6 +12,7 @@ sum neq? nzero? + negate number->digits-reverse number->digits rac @@ -50,6 +51,10 @@ (define (nzero? n) (not (zero? n))) +;; negate : number -> number +(define (negate n) + (- 0 n)) + ;; number->digits-reverse : number -> (listof number) ;; Return the digits of the given number in reverse order (i.e. RTL) (define (number->digits-reverse n) diff --git a/src/10.rkt b/src/10.rkt new file mode 100644 index 0000000..6cea41e --- /dev/null +++ b/src/10.rkt @@ -0,0 +1,60 @@ +#lang racket + +(require "../lib.rkt") + +(define input + (problem-input 10)) + +(define width (string-length (car input))) +(define height (length input)) + +(define (coprime? ij) + (= 1 (gcd (first ij) + (second ij)))) + +(define (offsets x y) + (define is + (range (negate x) (- width x))) + (define js + (range (negate y) (- height y))) + (filter coprime? (cartesian-product is js))) + +(define (asteroid? xy) + (define row (list-ref input (second xy))) + (eq? #\# (string-ref row (first xy)))) + +(define (asteroid-offset? x y ij) + (define i (first ij)) + (define j (second ij)) + (define max-multiple + (let ([max-x + (cond + [(zero? i) width] + [(positive? i) (truncate (/ (- (sub1 width) x) i))] + [else (abs (truncate (/ x i)))])] + [max-y + (cond + [(zero? j) height] + [(positive? j) (truncate (/ (- (sub1 height) y) j))] + [else (abs (truncate (/ y j)))])]) + (min max-x max-y))) + (ormap (λ (m) (asteroid? `(,(+ x (* m i)) + ,(+ y (* m j))))) + (range 1 (add1 max-multiple)))) + +(define (asteroids xy) + (define x (first xy)) + (define y (second xy)) + (count (curry asteroid-offset? x y) (offsets x y))) + +(define-values (part1 location) + (let* ([cols (range width)] + [rows (range height)] + [locations (filter asteroid? (cartesian-product cols rows))] + [asteroid-counts (map asteroids locations)] + [maximum (apply max asteroid-counts)] + [index (index-of asteroid-counts maximum)] + [location (list-ref locations index)]) + (values maximum location))) + +(show-solution part1 #f) \ No newline at end of file