2016
Matthew Butterick 7 years ago
parent 95b784f621
commit 107965d5ee

@ -0,0 +1,8 @@
#lang reader "lang.rkt"
Disc #1 has 5 positions; at time=0, it is at position 2.
Disc #2 has 13 positions; at time=0, it is at position 7.
Disc #3 has 17 positions; at time=0, it is at position 10.
Disc #4 has 3 positions; at time=0, it is at position 2.
Disc #5 has 19 positions; at time=0, it is at position 9.
Disc #6 has 7 positions; at time=0, it is at position 0.
Disc #7 has 11 positions; at time=0, it is at position 0.

@ -0,0 +1,7 @@
#lang reader "lang.rkt"
Disc #1 has 5 positions; at time=0, it is at position 2.
Disc #2 has 13 positions; at time=0, it is at position 7.
Disc #3 has 17 positions; at time=0, it is at position 10.
Disc #4 has 3 positions; at time=0, it is at position 2.
Disc #5 has 19 positions; at time=0, it is at position 9.
Disc #6 has 7 positions; at time=0, it is at position 0.

@ -0,0 +1,27 @@
#lang br/quicklang ;; http://adventofcode.com/2016/day/15
(require openssl/md5)
(provide read-syntax
(rename-out [mb #%module-begin]))
(define (read-syntax path port)
(strip-bindings
#`(module mod "lang.rkt"
#,@(for/list ([line (in-list (string-split (port->string port) "\n"))])
`(disc ,@(map string->number (regexp-match* #px"\\d+" line)))))))
(define-macro (mb . DISCS)
#'(#%module-begin
(solve . DISCS)))
(define-macro (solve . DISCS)
(with-pattern ([(DISC# ...) (generate-temporaries #'DISCS)]
[(DISC-SLOTS ...) #'DISCS])
#'(for/or ([DISC# (in-cycle DISC-SLOTS)] ...
[i (in-naturals)]
#:when (= DISC# ...))
i)))
(require sugar/list)
(define-macro (disc TIME-OFFSET SIZE _ START)
#'(shift (range SIZE) (modulo (- (+ START TIME-OFFSET)) SIZE) #f #t))
(provide disc)

@ -0,0 +1,3 @@
#lang reader "lang.rkt"
Disc #1 has 5 positions; at time=0, it is at position 4.
Disc #2 has 2 positions; at time=0, it is at position 1.