d22
parent
f85815ea65
commit
efc0c1bcd6
@ -0,0 +1,63 @@
|
|||||||
|
#lang br/quicklang
|
||||||
|
(require "../helper.rkt")
|
||||||
|
(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)
|
||||||
|
#,@(cdr lines))))
|
||||||
|
|
||||||
|
(define-macro (#%mb STARS LINE ...)
|
||||||
|
#'(#%module-begin
|
||||||
|
(time (STARS (list LINE ...)))))
|
||||||
|
|
||||||
|
(define (infect lines bursts #:weak-mode [weak-mode? #f])
|
||||||
|
(define chars (make-hasheqv))
|
||||||
|
(define origin-adjust (/ (sub1 (string-length (car lines))) 2))
|
||||||
|
(for* ([(line lidx) (in-indexed lines)]
|
||||||
|
[(c cidx) (in-indexed (string->list line))])
|
||||||
|
(define key (+ (- lidx origin-adjust) (* +i (- cidx origin-adjust))))
|
||||||
|
(hash-set! chars key c))
|
||||||
|
|
||||||
|
(define turn-left +i) (define turn-right -i)
|
||||||
|
|
||||||
|
(define-macro (define-state ID CHAR)
|
||||||
|
(with-pattern ([ID? (suffix-id #'ID "?")]
|
||||||
|
[SET-ID (prefix-id "set-" #'ID)])
|
||||||
|
#'(begin (define ID CHAR)
|
||||||
|
(define (SET-ID x) (hash-set! chars x ID))
|
||||||
|
(define (ID? x) (eqv? (hash-ref! chars x #\.) ID)))))
|
||||||
|
(define-state clean #\.)
|
||||||
|
(define-state infected #\#)
|
||||||
|
(define-state weakened #\W)
|
||||||
|
(define-state flagged #\F)
|
||||||
|
|
||||||
|
(for/fold ([here 0]
|
||||||
|
[dir -1]
|
||||||
|
[infections 0]
|
||||||
|
#:result infections)
|
||||||
|
([burst (in-range bursts)])
|
||||||
|
(match here
|
||||||
|
[(? infected?)
|
||||||
|
(define next-dir (* dir turn-right))
|
||||||
|
((if weak-mode? set-flagged set-clean) here)
|
||||||
|
(values (+ here next-dir) next-dir infections)]
|
||||||
|
[(? clean?)
|
||||||
|
(define next-dir (* dir turn-left))
|
||||||
|
((if weak-mode? set-weakened set-infected) here)
|
||||||
|
(values (+ here next-dir) next-dir ((if weak-mode? values add1) infections))]
|
||||||
|
[(? weakened?)
|
||||||
|
(define next-dir dir)
|
||||||
|
(set-infected here)
|
||||||
|
(values (+ here next-dir) next-dir (add1 infections))]
|
||||||
|
[(? flagged?)
|
||||||
|
(define next-dir (- dir))
|
||||||
|
(set-clean here)
|
||||||
|
(values (+ here next-dir) next-dir infections)])))
|
||||||
|
|
||||||
|
(define (★ lines) (infect lines 10000))
|
||||||
|
|
||||||
|
(define (★★ lines) (infect lines 10000000 #:weak-mode #t))
|
||||||
|
|
@ -0,0 +1,26 @@
|
|||||||
|
#lang reader "main.rkt" ★ ; 5411
|
||||||
|
#.#.#.##.#.##.###.#.###.#
|
||||||
|
.#..#.....#..#######.##.#
|
||||||
|
......###..##..###..#...#
|
||||||
|
##....#.#.#....#..#..#..#
|
||||||
|
#..#....#.##.#.#..#..#.#.
|
||||||
|
..##..##.##..##...#...###
|
||||||
|
..#.#....#..####.##.##...
|
||||||
|
###...#.#...#.######...#.
|
||||||
|
..#####...###..#####.#.##
|
||||||
|
...#..#......####.##..#.#
|
||||||
|
#...##..#.#####...#.##...
|
||||||
|
..#.#.###.##.##....##.###
|
||||||
|
##.##...###....#######.#.
|
||||||
|
#.#...#.#..#.##..##..##.#
|
||||||
|
.#...###...#..#..####....
|
||||||
|
####...#...##.####..#.#..
|
||||||
|
......#.....##.#.##....##
|
||||||
|
###.......####..##.#.##..
|
||||||
|
....###.....##.##..###.#.
|
||||||
|
.##..##.#.###.###..#.###.
|
||||||
|
..#..##.######.##........
|
||||||
|
#..#.#..#.###....##.##..#
|
||||||
|
.##.#.#...######...##.##.
|
||||||
|
##..#..#..##.#.#..#..####
|
||||||
|
#######.#.######.#.....##
|
@ -0,0 +1,26 @@
|
|||||||
|
#lang reader "main.rkt" ★★ ; 2511416
|
||||||
|
#.#.#.##.#.##.###.#.###.#
|
||||||
|
.#..#.....#..#######.##.#
|
||||||
|
......###..##..###..#...#
|
||||||
|
##....#.#.#....#..#..#..#
|
||||||
|
#..#....#.##.#.#..#..#.#.
|
||||||
|
..##..##.##..##...#...###
|
||||||
|
..#.#....#..####.##.##...
|
||||||
|
###...#.#...#.######...#.
|
||||||
|
..#####...###..#####.#.##
|
||||||
|
...#..#......####.##..#.#
|
||||||
|
#...##..#.#####...#.##...
|
||||||
|
..#.#.###.##.##....##.###
|
||||||
|
##.##...###....#######.#.
|
||||||
|
#.#...#.#..#.##..##..##.#
|
||||||
|
.#...###...#..#..####....
|
||||||
|
####...#...##.####..#.#..
|
||||||
|
......#.....##.#.##....##
|
||||||
|
###.......####..##.#.##..
|
||||||
|
....###.....##.##..###.#.
|
||||||
|
.##..##.#.###.###..#.###.
|
||||||
|
..#..##.######.##........
|
||||||
|
#..#.#..#.###....##.##..#
|
||||||
|
.##.#.#...######...##.##.
|
||||||
|
##..#..#..##.#.#..#..####
|
||||||
|
#######.#.######.#.....##
|
@ -0,0 +1,4 @@
|
|||||||
|
#lang reader "main.rkt" ★ ; 5587
|
||||||
|
..#
|
||||||
|
#..
|
||||||
|
...
|
@ -0,0 +1,4 @@
|
|||||||
|
#lang reader "main.rkt" ★★ ; 2511944
|
||||||
|
..#
|
||||||
|
#..
|
||||||
|
...
|
Reference in New Issue