diff --git a/2017/d15/main.rkt b/2017/d15/main.rkt new file mode 100644 index 0000000..ca1639b --- /dev/null +++ b/2017/d15/main.rkt @@ -0,0 +1,28 @@ +#lang reader "../aoc-lang.rkt" +(provide (rename-out [#%mb #%module-begin]) ★ ★★) + +(define-macro (#%mb (STARS) (Generator X starts with NUM) ...) + #`(#%module-begin + (apply STARS '(NUM ...)))) + +(define (lower-16-bits x) (bitwise-bit-field x 0 16)) + +(define (generator-base a b rounds [modulo-a 1] [modulo-b 1]) + (for/fold ([a-last a] + [b-last b] + [sum 0] + #:result sum) + ([i (in-range rounds)]) + (define a (for/fold ([a a-last]) + ([i (in-naturals)] + #:break (and (positive? i) (zero? (modulo a modulo-a)))) + (remainder (* 16807 a) 2147483647))) + (define b (for/fold ([b b-last]) + ([i (in-naturals)] + #:break (and (positive? i) (zero? (modulo b modulo-b)))) + (remainder (* 48271 b) 2147483647))) + (values a b (+ sum (if (= (lower-16-bits a) (lower-16-bits b)) 1 0))))) + +(define (★ a-start b-start) (generator-base a-start b-start 40000000)) + +(define (★★ a-start b-start) (generator-base a-start b-start 5000000 4 8)) \ No newline at end of file diff --git a/2017/d15/star1.rkt b/2017/d15/star1.rkt new file mode 100644 index 0000000..bab0048 --- /dev/null +++ b/2017/d15/star1.rkt @@ -0,0 +1,3 @@ +#lang reader "main.rkt" ★ ; 650 +Generator A starts with 783 +Generator B starts with 325 \ No newline at end of file diff --git a/2017/d15/star2.rkt b/2017/d15/star2.rkt new file mode 100644 index 0000000..459e018 --- /dev/null +++ b/2017/d15/star2.rkt @@ -0,0 +1,3 @@ +#lang reader "main.rkt" ★★ +Generator A starts with 783 +Generator B starts with 325 \ No newline at end of file diff --git a/2017/d15/test1.rkt b/2017/d15/test1.rkt new file mode 100644 index 0000000..3ae6f92 --- /dev/null +++ b/2017/d15/test1.rkt @@ -0,0 +1,3 @@ +#lang reader "main.rkt" ★ ; 588 +Generator A starts with 65 +Generator B starts with 8921 \ No newline at end of file diff --git a/2017/d15/test2.rkt b/2017/d15/test2.rkt new file mode 100644 index 0000000..8e1b78a --- /dev/null +++ b/2017/d15/test2.rkt @@ -0,0 +1,3 @@ +#lang reader "main.rkt" ★★ ; 309 +Generator A starts with 65 +Generator B starts with 8921 \ No newline at end of file