Day 9 some refactoring

This commit is contained in:
Jonathan Chan 2022-12-09 02:40:02 -05:00
parent 2b48797e63
commit 22af467a17
1 changed files with 26 additions and 26 deletions

View File

@ -2,7 +2,10 @@
(require "../lib.rkt") (require "../lib.rkt")
(define input (map #{string-split %1 " "} (problem-input 9))) (define input
(map (match-lambda [(pregexp "(\\w) (\\d+)" `(,_ ,d ,n))
(list (string->symbol d) (string->number n))])
(problem-input 9)))
(define (sign H T) (define (sign H T)
(cond (cond
@ -10,38 +13,35 @@
[(= H T) 0] [(= H T) 0]
[(< H T) -1])) [(< H T) -1]))
(define (lead d x y)
(match d
['U (values x (add1 y))]
['D (values x (sub1 y))]
['R (values (add1 x) y)]
['L (values (sub1 x) y)]))
(define (follow xH yH xT yT) (define (follow xH yH xT yT)
(if (or (and (= xH xT) (> (abs (- yH yT)) 1)) (if (or (and (= xH xT) (= (abs (- yH yT)) 2))
(and (= yH yT) (> (abs (- xH xT)) 1)) (and (= yH yT) (= (abs (- xH xT)) 2))
(> (+ (abs (- xH xT)) (abs (- yH yT))) 2)) (> (+ (abs (- xH xT)) (abs (- yH yT))) 2))
(values (+ xT (sign xH xT)) (+ yT (sign yH yT))) (values (+ xT (sign xH xT)) (+ yT (sign yH yT)))
(values xT yT))) (values xT yT)))
(define (model knots) (define (model knots)
(define visited (mutable-set)) (define visited (mutable-set))
(for/fold ([xH 0] [yH 0] (for*/fold ([xs (repeat (add1 knots) '(0))]
[xTs (repeat knots '(0))] [ys (repeat (add1 knots) '(0))])
[yTs (repeat knots '(0))]) ([motion input]
([motion input]) [_ (in-range (second motion))])
(match-let* ([`(,dir , n) motion] (for/fold ([xs '()] [ys '()]
[n (string->number n)]) #:result (begin (set-add! visited (cons (first xs) (first ys)))
(for/fold ([xH xH] [yH yH] (values (reverse xs) (reverse ys))))
[xTs xTs] [yTs yTs]) ([x xs] [y ys])
([_ (in-range n)]) (define-values (x* y*)
(define-values (xH* yH*) (if (empty? xs)
(match dir (lead (first motion) x y)
["U" (values xH (add1 yH))] (follow (first xs) (first ys) x y)))
["D" (values xH (sub1 yH))] (values (cons x* xs) (cons y* ys))))
["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)) (set-count visited))
(show-solution (model 1) (model 9)) (show-solution (model 1) (model 9))