This commit is contained in:
Jonathan Chan 2022-12-09 01:21:32 -05:00
parent 06542efb47
commit 2b48797e63
2 changed files with 2047 additions and 0 deletions

2000
input/09.txt Normal file

File diff suppressed because it is too large Load Diff

47
src/09.rkt Normal file
View File

@ -0,0 +1,47 @@
#lang curly-fn racket
(require "../lib.rkt")
(define input (map #{string-split %1 " "} (problem-input 9)))
(define (sign H T)
(cond
[(> H T) 1]
[(= H T) 0]
[(< H T) -1]))
(define (follow xH yH xT yT)
(if (or (and (= xH xT) (> (abs (- yH yT)) 1))
(and (= yH yT) (> (abs (- xH xT)) 1))
(> (+ (abs (- xH xT)) (abs (- yH yT))) 2))
(values (+ xT (sign xH xT)) (+ yT (sign yH yT)))
(values xT yT)))
(define (model knots)
(define visited (mutable-set))
(for/fold ([xH 0] [yH 0]
[xTs (repeat knots '(0))]
[yTs (repeat knots '(0))])
([motion input])
(match-let* ([`(,dir , n) motion]
[n (string->number n)])
(for/fold ([xH xH] [yH yH]
[xTs xTs] [yTs yTs])
([_ (in-range n)])
(define-values (xH* yH*)
(match dir
["U" (values xH (add1 yH))]
["D" (values xH (sub1 yH))]
["R" (values (add1 xH) yH)]
["L" (values (sub1 xH) yH)]))
(define-values (xTs* yTs*)
(for/fold ([xTs `(,xH)] [yTs `(,yH)]
#:result (values (rest (reverse xTs)) (rest (reverse yTs))))
([xT xTs] [yT yTs])
(define-values (xT* yT*) (follow (first xTs) (first yTs) xT yT))
(values (cons xT* xTs) (cons yT* yTs))))
(set-add! visited (cons (last xTs*) (last yTs*)))
(values xH* yH* xTs* yTs*))))
(set-count visited))
(show-solution (model 1) (model 9))