diff --git a/2017/d21/main.rkt b/2017/d21/main.rkt new file mode 100644 index 0000000..f51c80e --- /dev/null +++ b/2017/d21/main.rkt @@ -0,0 +1,51 @@ +#lang br/quicklang +(require "../helper.rkt" racket/sequence) +(provide read-syntax (rename-out [#%mb #%module-begin]) ★ ★★) + +(define (read-syntax path port) + (define lines (port->lines port)) + (strip-context #`(module mod "main.rkt" + #,(for/list ([datum (in-port read (open-input-string (car lines)))]) + datum) + #,@(for/list ([line (in-list (cdr lines))]) + (for/list ([datum (string-split line)]) + datum))))) + +(define-macro (#%mb (STARS ITERATIONS) (LH "=>" RH) ...) + #`(#%module-begin + (time (STARS ITERATIONS '(LH . RH) ...)))) + +(define (charify str) (map string->list (string-split str "/"))) + +(define (grid-size grid) (length (car grid))) + +(define (grid-split grid size) + (append* + (for/list ([rowset (in-slice size grid)]) + (apply map list (map (λ (row) (slice-at row size)) rowset))))) + +(define (enhance-grid grid rules) + (let/ec exit + (for*/fold ([rotations (list grid)]) + ([i (in-range 4)]) + (define rot (apply map list (reverse (car rotations)))) + (cond + [(hash-ref rules rot (λ () (hash-ref rules (map reverse rot) #f))) => exit] + [else (cons rot rotations)])))) + +(define (join-grids grids) + (define side (sqrt (length grids))) + (append* + (for/list ([gridset (in-slice side grids)]) + (apply map append gridset)))) + +(define (★ iterations . rulepairs) + (define rules (for/hash ([rp (in-list rulepairs)]) + (values (charify (car rp)) (charify (cdr rp))))) + (for/fold ([grid (charify ".#./..#/###")] + #:result (count (λ (c) (char=? c #\#)) (flatten grid))) + ([i (in-range iterations)]) + (define grid-pieces (grid-split grid (if (even? (grid-size grid)) 2 3))) + (join-grids (map (λ (gp) (enhance-grid gp rules)) grid-pieces)))) + +(define ★★ ★) \ No newline at end of file diff --git a/2017/d21/star1.rkt b/2017/d21/star1.rkt new file mode 100644 index 0000000..396f657 --- /dev/null +++ b/2017/d21/star1.rkt @@ -0,0 +1,109 @@ +#lang reader "main.rkt" ★ 5 ; 190 +../.. => #.#/###/#.# +#./.. => ..#/.../### +##/.. => .../.##/### +.#/#. => #.#/##./.#. +##/#. => #../#.#/..# +##/## => #.#/#../### +.../.../... => .###/..##/.#../###. +#../.../... => ##.#/.###/#.../##.# +.#./.../... => ..../#.##/..../.#.# +##./.../... => ..#./#.../#.../.### +#.#/.../... => ..##/####/#.#./..## +###/.../... => .##./#.#./###./.#.. +.#./#../... => #..#/..#./...#/#.#. +##./#../... => ##../.##./##.#/#..# +..#/#../... => #.##/.##./##.#/.### +#.#/#../... => ...#/#.##/..#./##.. +.##/#../... => #.#./..#./##.#/.#.# +###/#../... => #..#/...#/..#./##.# +.../.#./... => .#.#/#.../.##./.#.# +#../.#./... => #.#./.##./..../.#.# +.#./.#./... => .#../#.##/..##/..## +##./.#./... => ..##/##.#/...#/..#. +#.#/.#./... => ...#/.##./####/.#.. +###/.#./... => ###./####/...#/#### +.#./##./... => ...#/.#.#/#.#./#.#. +##./##./... => ..../...#/#.#./...# +..#/##./... => .##./#.../##.#/.#.. +#.#/##./... => .#../.#../...#/.... +.##/##./... => ..#./.##./####/.#.. +###/##./... => ##../.#.#/##../.#.. +.../#.#/... => ..#./.#../.#../.### +#../#.#/... => ####/..../#..#/#... +.#./#.#/... => #.##/##../##.#/##.# +##./#.#/... => ###./..../#.##/###. +#.#/#.#/... => ###./.#../#.#./#.#. +###/#.#/... => ...#/#..#/#.#./..## +.../###/... => .#../...#/...#/.... +#../###/... => ####/#.../##../.#.# +.#./###/... => ...#/####/.##./#..# +##./###/... => .###/##.#/..#./.#.. +#.#/###/... => ####/###./.###/.### +###/###/... => .#.#/..##/..#./##.. +..#/.../#.. => #.../.###/###./...# +#.#/.../#.. => ..../#.../##../..#. +.##/.../#.. => ####/####/...#/#### +###/.../#.. => #.../.#../#.#./#.#. +.##/#../#.. => ##../..#./.#../##.# +###/#../#.. => ..../#..#/.###/.### +..#/.#./#.. => ...#/##../.##./##.. +#.#/.#./#.. => #.##/.###/#.#./##.# +.##/.#./#.. => ..../..../.#.#/#..# +###/.#./#.. => ##../.#.#/.#.#/#### +.##/##./#.. => #.##/##.#/####/.... +###/##./#.. => ..../..##/#.#./.### +#../..#/#.. => #.#./...#/#.##/.### +.#./..#/#.. => ####/#.##/.#../.### +##./..#/#.. => .##./..#./.#.#/##.# +#.#/..#/#.. => .#.#/#.##/##../#... +.##/..#/#.. => ..../.###/####/.#.. +###/..#/#.. => ##.#/##.#/..##/.#.. +#../#.#/#.. => #.##/###./##../.... +.#./#.#/#.. => ..../###./####/###. +##./#.#/#.. => ##.#/#.##/##../#.## +..#/#.#/#.. => .###/#.../.#../##.. +#.#/#.#/#.. => ##../##.#/#.../.##. +.##/#.#/#.. => ...#/..#./.###/##.# +###/#.#/#.. => #.../#.##/..##/..## +#../.##/#.. => #.##/#.../.##./##.. +.#./.##/#.. => #.#./#.../..##/.#.. +##./.##/#.. => .###/.#.#/####/.#.# +#.#/.##/#.. => ####/.#../##.#/.### +.##/.##/#.. => .#../##.#/####/#.#. +###/.##/#.. => #.##/#.../...#/.... +#../###/#.. => ###./.#.#/##../#..# +.#./###/#.. => #..#/..##/..../.... +##./###/#.. => ..#./#.../...#/###. +..#/###/#.. => ##../..##/##../#.## +#.#/###/#.. => ..../..#./.###/##.. +.##/###/#.. => #..#/####/.#.#/.##. +###/###/#.. => ###./#.##/##.#/.#.. +.#./#.#/.#. => #.../####/#.#./.##. +##./#.#/.#. => ..##/..../.#.#/##.. +#.#/#.#/.#. => ####/..##/####/#... +###/#.#/.#. => ##.#/#.#./.##./#### +.#./###/.#. => .#.#/.#.#/##.#/###. +##./###/.#. => .#../###./#.##/#... +#.#/###/.#. => #.../.###/.#../.#.. +###/###/.#. => #.#./.##./.###/#### +#.#/..#/##. => .#../#..#/###./#.## +###/..#/##. => #.#./####/###./###. +.##/#.#/##. => .#.#/...#/..../#.## +###/#.#/##. => ...#/..../#.##/#### +#.#/.##/##. => ##../.#../.#.#/##.. +###/.##/##. => #.../#.#./#.#./#.#. +.##/###/##. => ..../#.##/#.##/..## +###/###/##. => ####/##.#/#..#/.##. +#.#/.../#.# => ##.#/.#.#/####/.##. +###/.../#.# => #..#/.#.#/#.../#..# +###/#../#.# => ..##/###./.###/..## +#.#/.#./#.# => #.##/#.#./##../...# +###/.#./#.# => ..#./.###/..##/#... +###/##./#.# => #.../...#/..##/.### +#.#/#.#/#.# => #..#/.#../...#/#..# +###/#.#/#.# => ###./#.../##../.##. +#.#/###/#.# => ...#/..#./...#/#..# +###/###/#.# => ###./####/.###/###. +###/#.#/### => .###/.#../..../##.# +###/###/### => #..#/.###/##../.##. \ No newline at end of file diff --git a/2017/d21/star2.rkt b/2017/d21/star2.rkt new file mode 100644 index 0000000..458b556 --- /dev/null +++ b/2017/d21/star2.rkt @@ -0,0 +1,109 @@ +#lang reader "main.rkt" ★★ 18 ; 2335049 +../.. => #.#/###/#.# +#./.. => ..#/.../### +##/.. => .../.##/### +.#/#. => #.#/##./.#. +##/#. => #../#.#/..# +##/## => #.#/#../### +.../.../... => .###/..##/.#../###. +#../.../... => ##.#/.###/#.../##.# +.#./.../... => ..../#.##/..../.#.# +##./.../... => ..#./#.../#.../.### +#.#/.../... => ..##/####/#.#./..## +###/.../... => .##./#.#./###./.#.. +.#./#../... => #..#/..#./...#/#.#. +##./#../... => ##../.##./##.#/#..# +..#/#../... => #.##/.##./##.#/.### +#.#/#../... => ...#/#.##/..#./##.. +.##/#../... => #.#./..#./##.#/.#.# +###/#../... => #..#/...#/..#./##.# +.../.#./... => .#.#/#.../.##./.#.# +#../.#./... => #.#./.##./..../.#.# +.#./.#./... => .#../#.##/..##/..## +##./.#./... => ..##/##.#/...#/..#. +#.#/.#./... => ...#/.##./####/.#.. +###/.#./... => ###./####/...#/#### +.#./##./... => ...#/.#.#/#.#./#.#. +##./##./... => ..../...#/#.#./...# +..#/##./... => .##./#.../##.#/.#.. +#.#/##./... => .#../.#../...#/.... +.##/##./... => ..#./.##./####/.#.. +###/##./... => ##../.#.#/##../.#.. +.../#.#/... => ..#./.#../.#../.### +#../#.#/... => ####/..../#..#/#... +.#./#.#/... => #.##/##../##.#/##.# +##./#.#/... => ###./..../#.##/###. +#.#/#.#/... => ###./.#../#.#./#.#. +###/#.#/... => ...#/#..#/#.#./..## +.../###/... => .#../...#/...#/.... +#../###/... => ####/#.../##../.#.# +.#./###/... => ...#/####/.##./#..# +##./###/... => .###/##.#/..#./.#.. +#.#/###/... => ####/###./.###/.### +###/###/... => .#.#/..##/..#./##.. +..#/.../#.. => #.../.###/###./...# +#.#/.../#.. => ..../#.../##../..#. +.##/.../#.. => ####/####/...#/#### +###/.../#.. => #.../.#../#.#./#.#. +.##/#../#.. => ##../..#./.#../##.# +###/#../#.. => ..../#..#/.###/.### +..#/.#./#.. => ...#/##../.##./##.. +#.#/.#./#.. => #.##/.###/#.#./##.# +.##/.#./#.. => ..../..../.#.#/#..# +###/.#./#.. => ##../.#.#/.#.#/#### +.##/##./#.. => #.##/##.#/####/.... +###/##./#.. => ..../..##/#.#./.### +#../..#/#.. => #.#./...#/#.##/.### +.#./..#/#.. => ####/#.##/.#../.### +##./..#/#.. => .##./..#./.#.#/##.# +#.#/..#/#.. => .#.#/#.##/##../#... +.##/..#/#.. => ..../.###/####/.#.. +###/..#/#.. => ##.#/##.#/..##/.#.. +#../#.#/#.. => #.##/###./##../.... +.#./#.#/#.. => ..../###./####/###. +##./#.#/#.. => ##.#/#.##/##../#.## +..#/#.#/#.. => .###/#.../.#../##.. +#.#/#.#/#.. => ##../##.#/#.../.##. +.##/#.#/#.. => ...#/..#./.###/##.# +###/#.#/#.. => #.../#.##/..##/..## +#../.##/#.. => #.##/#.../.##./##.. +.#./.##/#.. => #.#./#.../..##/.#.. +##./.##/#.. => .###/.#.#/####/.#.# +#.#/.##/#.. => ####/.#../##.#/.### +.##/.##/#.. => .#../##.#/####/#.#. +###/.##/#.. => #.##/#.../...#/.... +#../###/#.. => ###./.#.#/##../#..# +.#./###/#.. => #..#/..##/..../.... +##./###/#.. => ..#./#.../...#/###. +..#/###/#.. => ##../..##/##../#.## +#.#/###/#.. => ..../..#./.###/##.. +.##/###/#.. => #..#/####/.#.#/.##. +###/###/#.. => ###./#.##/##.#/.#.. +.#./#.#/.#. => #.../####/#.#./.##. +##./#.#/.#. => ..##/..../.#.#/##.. +#.#/#.#/.#. => ####/..##/####/#... +###/#.#/.#. => ##.#/#.#./.##./#### +.#./###/.#. => .#.#/.#.#/##.#/###. +##./###/.#. => .#../###./#.##/#... +#.#/###/.#. => #.../.###/.#../.#.. +###/###/.#. => #.#./.##./.###/#### +#.#/..#/##. => .#../#..#/###./#.## +###/..#/##. => #.#./####/###./###. +.##/#.#/##. => .#.#/...#/..../#.## +###/#.#/##. => ...#/..../#.##/#### +#.#/.##/##. => ##../.#../.#.#/##.. +###/.##/##. => #.../#.#./#.#./#.#. +.##/###/##. => ..../#.##/#.##/..## +###/###/##. => ####/##.#/#..#/.##. +#.#/.../#.# => ##.#/.#.#/####/.##. +###/.../#.# => #..#/.#.#/#.../#..# +###/#../#.# => ..##/###./.###/..## +#.#/.#./#.# => #.##/#.#./##../...# +###/.#./#.# => ..#./.###/..##/#... +###/##./#.# => #.../...#/..##/.### +#.#/#.#/#.# => #..#/.#../...#/#..# +###/#.#/#.# => ###./#.../##../.##. +#.#/###/#.# => ...#/..#./...#/#..# +###/###/#.# => ###./####/.###/###. +###/#.#/### => .###/.#../..../##.# +###/###/### => #..#/.###/##../.##. \ No newline at end of file diff --git a/2017/d21/test1.rkt b/2017/d21/test1.rkt new file mode 100644 index 0000000..1ecd487 --- /dev/null +++ b/2017/d21/test1.rkt @@ -0,0 +1,3 @@ +#lang reader "main.rkt" ★ 2 ; 12 +../.# => ##./#../... +.#./..#/### => #..#/..../..../#..# \ No newline at end of file