You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
2.0 KiB
61 lines
2.0 KiB
#lang racket |
|
(require "lib/common.rkt") |
|
|
|
(struct posn (x y) #:transparent) |
|
(struct fold (axis n) #:transparent) |
|
|
|
(define (parse input) |
|
(match-define `(,paper ,instrs) (string-split input "\n\n")) |
|
(values (for/set ([p (in-list (string-split paper))]) |
|
(match-define (pregexp #px"([0-9]+),([0-9]+)" |
|
(list _ |
|
(app string->number x) |
|
(app string->number y))) |
|
p) |
|
(posn x y)) |
|
(for/list ([instr (in-list (string-split instrs "\n"))]) |
|
(match-define (pregexp #px"fold along (x|y)=([0-9]+)" |
|
(list _ |
|
(app string->symbol axis) |
|
(app string->number n))) |
|
instr) |
|
(fold axis n)))) |
|
|
|
(define (fold-along paper instr) |
|
(for/set ([p (in-set paper)]) |
|
(match-define (posn x y) p) |
|
(match instr |
|
[(fold 'x n) #:when (> x n) (posn (- (* 2 n) x) y)] |
|
[(fold 'y n) #:when (> y n) (posn x (- (* 2 n) y))] |
|
[_ p]))) |
|
|
|
(define (day13a paper instrs) |
|
(set-count (fold-along paper (first instrs)))) |
|
|
|
(define (max-on-axis paper axis) |
|
(for/max ([pt (in-set paper)]) |
|
(match axis |
|
['x (posn-x pt)] |
|
['y (posn-y pt)]))) |
|
|
|
(define (print-paper paper) |
|
(for ([y (in-inclusive-range 0 (max-on-axis paper 'y))]) |
|
(displayln |
|
(apply string |
|
(for/list ([x (in-inclusive-range 0 (max-on-axis paper 'x))]) |
|
(cond [(set-member? paper (posn x y)) #\█] |
|
[else #\space])))))) |
|
|
|
(define (day13b paper instrs) |
|
(print-paper |
|
(for/fold ([cur-paper paper]) |
|
([instr (in-list instrs)]) |
|
(fold-along cur-paper instr)))) |
|
|
|
(module+ main |
|
(call-with-input-file "data/day13.txt" |
|
(λ (prt) |
|
(define-values (paper instrs) (parse (port->string prt))) |
|
(answer 13 1 (day13a paper instrs)) |
|
(displayln "answer 13.2:") |
|
(day13b paper instrs))))
|
|
|