From f86149e4df5cedee025aa7f7e4202dfbbd186cb2 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Sun, 18 Dec 2016 22:47:31 -0800 Subject: [PATCH] start day19 --- 2016/day19/input.rkt | 2 ++ 2016/day19/lang.rkt | 33 +++++++++++++++++++++++++++++++++ 2016/day19/test.rkt | 2 ++ 3 files changed, 37 insertions(+) create mode 100644 2016/day19/input.rkt create mode 100644 2016/day19/lang.rkt create mode 100644 2016/day19/test.rkt diff --git a/2016/day19/input.rkt b/2016/day19/input.rkt new file mode 100644 index 0000000..ae5b64d --- /dev/null +++ b/2016/day19/input.rkt @@ -0,0 +1,2 @@ +#lang reader "lang.rkt" +3017957 \ No newline at end of file diff --git a/2016/day19/lang.rkt b/2016/day19/lang.rkt new file mode 100644 index 0000000..be1b5c3 --- /dev/null +++ b/2016/day19/lang.rkt @@ -0,0 +1,33 @@ +#lang br/quicklang ;; http://adventofcode.com/2016/day/18 +(provide read-syntax + (rename-out [mb #%module-begin])) + +(define (read-syntax path port) + (strip-bindings + #`(module mod "lang.rkt" + #,(string-trim (port->string port))))) + +(define-macro (mb NUM-STR) + #'(#%module-begin + (displayln (solve (string->number NUM-STR) #f)) + (displayln (solve (string->number NUM-STR) #t)))) + +(define (idx-after vec x) + (or + (for/first ([idx (in-range (modulo (add1 x) (vector-length vec)) (vector-length vec))] + #:when (vector-ref vec idx)) + idx) + (idx-after vec 0))) + +(define (solve num [circle? #f]) + (define elves (make-vector num #t)) + (let loop ([taker 0][elves-left num]) + (cond + [(= elves-left 2) (add1 taker)] + [else + (define giver (for/fold ([elf taker]) + ([i (in-range (if circle? (floor (/ num 2)) 1))]) + (idx-after elves elf))) + (vector-set! elves giver #f) + (loop (idx-after elves taker) (sub1 elves-left))]))) + diff --git a/2016/day19/test.rkt b/2016/day19/test.rkt new file mode 100644 index 0000000..2c1028d --- /dev/null +++ b/2016/day19/test.rkt @@ -0,0 +1,2 @@ +#lang reader "lang.rkt" +5 \ No newline at end of file