You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
983 B
Racket
42 lines
983 B
Racket
2 years ago
|
#lang racket
|
||
|
|
||
|
(define crabs
|
||
|
(map string->number
|
||
|
(string-split
|
||
|
(first
|
||
|
(file->lines "day7.txt")) ",")))
|
||
|
|
||
|
(define (distances crabs position)
|
||
|
(foldl (λ (x acc) (+ acc (abs (- position x)))) 0 crabs))
|
||
|
|
||
|
(define (min-distance crab)
|
||
|
(let* ([rng (range (apply min crabs) (apply max crabs))]
|
||
|
[ds (map (λ (d) (distances crabs d)) rng)])
|
||
|
(apply min ds)))
|
||
|
|
||
|
(define part1 (min-distance crabs))
|
||
|
|
||
|
part1
|
||
|
|
||
|
; part 2
|
||
|
|
||
|
(define (big-distance d)
|
||
|
(if (= d 0) 0 (+ d (big-distance (sub1 d)))))
|
||
|
|
||
|
(define (memo1 fn arg1)
|
||
|
(let* ([ht (make-hash)])
|
||
|
(hash-ref! ht (list fn arg1) (fn arg1))))
|
||
|
|
||
|
(define bd2-memo (λ (x) (memo1 big-distance x)))
|
||
|
|
||
|
(define (distances2 crabs position)
|
||
|
(foldl (λ (x acc) (+ acc (bd2-memo (abs (- position x))))) 0 crabs))
|
||
|
|
||
|
(define (min-distance2 crab)
|
||
|
(let* ([rng (range (apply min crabs) (apply max crabs))]
|
||
|
[ds (map (λ (d) (distances2 crabs d)) rng)])
|
||
|
(apply min ds)))
|
||
|
|
||
|
(define part2 (min-distance2 crabs))
|
||
|
|
||
|
part2
|