Skip to content

Instantly share code, notes, and snippets.

@aaronjeline
Created December 7, 2021 08:07
Show Gist options
  • Save aaronjeline/78c985b1345dd1eda46a34dd7290ee6f to your computer and use it in GitHub Desktop.
Save aaronjeline/78c985b1345dd1eda46a34dd7290ee6f to your computer and use it in GitHub Desktop.

Revisions

  1. Aaron Eline created this gist Dec 7, 2021.
    86 changes: 86 additions & 0 deletions 7.rkt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,86 @@
    #lang racket
    (require threading)

    (define sample-pos
    (~>
    "16,1,2,0,4,2,7,1,2,14"
    #;
    (with-input-from-file
    "/tmp/input"
    (λ () (port->string (current-input-port))))
    string-trim
    (string-split _ ",")
    (map string->number _)))

    (define real-pos
    (~>
    (with-input-from-file
    "/tmp/input"
    (λ () (port->string (current-input-port))))
    string-trim
    (string-split _ ",")
    (map string->number _)))

    (define (average lst)
    (define sum (apply + lst))
    (floor (/ sum (length lst))))

    (define memo (make-hash '()))

    (module+ test
    (require rackunit))

    (define (indv-cost target at)
    (define dist (abs (- target at)))
    (define (f dist acc)
    (if (zero? dist)
    acc
    (f (sub1 dist) (+ dist acc))))
    (f dist 0))

    (module+ test
    (check-equal? (indv-cost 16 5) 66)
    (check-equal? (indv-cost 1 5) 10))


    (define (cost target lst)
    (if (hash-has-key? memo target)
    (hash-ref memo target)
    (let* [
    (result (apply + (map (λ (i) (indv-cost i target)) lst)))]
    (begin
    (hash-set! memo target result)
    result))))
    (module+ test
    (check-equal? (cost 5 sample-pos) 168)
    (check-equal? (cost 2 sample-pos) 206))

    (define (list-range lst)
    (define mx (foldl max (first lst) lst))
    (define mn (foldl min (first lst) lst))
    (in-range mn mx))

    (define start (average sample-pos))

    (define (go-left? target lst)
    (< (cost (sub1 target) lst)
    (cost target lst)))

    (define (go-right? target lst)
    (< (cost (add1 target) lst)
    (cost target lst)))

    (define (done? target lst)
    (not (or (go-left? target lst) (go-right? target lst))))


    (define (step target lst)
    (if (go-right? target lst)
    (add1 target)
    (sub1 target)))


    (define (loop target lst)
    (if (done? target lst)
    (cost target lst)
    (loop (step target lst) lst)))