diff --git a/2017/d6/main.rkt b/2017/d6/main.rkt new file mode 100644 index 0000000..d2c5b5e --- /dev/null +++ b/2017/d6/main.rkt @@ -0,0 +1,28 @@ +#lang reader "../aoc-lang.rkt" + +(provide (rename-out [#%mb #%module-begin])) +(define-macro (#%mb (STARS) (BANK ...)) + #`(#%module-begin + (count-redists (list->vector '(BANK ...)) 'STARS))) + +(define (redist starting-vec) + (define vec (vector-copy starting-vec)) + (define max-blocks (vector-argmax values vec)) + (define start-at (vector-member max-blocks vec)) + (vector-set! vec start-at 0) + (for ([block (in-range max-blocks)] + [idx (in-cycle (shift-left-cycle (range (vector-length vec)) (add1 start-at)))]) + (vector-set! vec idx (+ (vector-ref vec idx) 1))) + vec) + +(define (count-redists bankvec stars) + (let/ec exit + (for/fold ([bankvecs-seen (list bankvec)]) + ([i (in-naturals)]) + (cond + [(member (car bankvecs-seen) (cdr bankvecs-seen)) + => (λ (tail) (exit (if (eq? stars '★) + i + (- (length bankvecs-seen) (length tail)))))]) + (cons (redist (car bankvecs-seen)) bankvecs-seen)))) + diff --git a/2017/d6/star1.rkt b/2017/d6/star1.rkt new file mode 100644 index 0000000..678977b --- /dev/null +++ b/2017/d6/star1.rkt @@ -0,0 +1,2 @@ +#lang reader "main.rkt" ★ ; 14029 +10 3 15 10 5 15 5 15 9 2 5 8 5 2 3 6 \ No newline at end of file diff --git a/2017/d6/star2.rkt b/2017/d6/star2.rkt new file mode 100644 index 0000000..55760ea --- /dev/null +++ b/2017/d6/star2.rkt @@ -0,0 +1,2 @@ +#lang reader "main.rkt" ★★ ; 2765 +10 3 15 10 5 15 5 15 9 2 5 8 5 2 3 6 \ No newline at end of file diff --git a/2017/d6/test1.rkt b/2017/d6/test1.rkt new file mode 100644 index 0000000..1a2eadd --- /dev/null +++ b/2017/d6/test1.rkt @@ -0,0 +1,2 @@ +#lang reader "main.rkt" ★ +0 2 7 0 \ No newline at end of file diff --git a/2017/d6/test2.rkt b/2017/d6/test2.rkt new file mode 100644 index 0000000..f6dce32 --- /dev/null +++ b/2017/d6/test2.rkt @@ -0,0 +1,2 @@ +#lang reader "main.rkt" ★★ +0 2 7 0 \ No newline at end of file