Day 9 some refactoring
This commit is contained in:
parent
2b48797e63
commit
22af467a17
52
src/09.rkt
52
src/09.rkt
|
@ -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))
|
Loading…
Reference in New Issue