From 291d4512927bdcdf5ed37b7ca42b4f9552d11625 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Fri, 15 Dec 2017 02:23:02 -0500 Subject: [PATCH] d15 --- 2017/d15/main.rkt | 28 ++++++++++++++++++++++++++++ 2017/d15/star1.rkt | 3 +++ 2017/d15/star2.rkt | 3 +++ 2017/d15/test1.rkt | 3 +++ 2017/d15/test2.rkt | 3 +++ 5 files changed, 40 insertions(+) create mode 100644 2017/d15/main.rkt create mode 100644 2017/d15/star1.rkt create mode 100644 2017/d15/star2.rkt create mode 100644 2017/d15/test1.rkt create mode 100644 2017/d15/test2.rkt 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