#lang br
(require racket/file sugar rackunit racket/set)
(define-values (point-strs fold-strs) (splitf-at (file->lines "13.rktd") non-empty-string?))
(define points
(for/seteqv ([str point-strs])
(apply make-rectangular (map string->number (string-split (string-replace str "," " "))))))
(define creases
(for/list ([str fold-strs]
#:when (non-empty-string? str))
(match (string-split str "=")
[(list "fold along y" numstr) (* +i (string->number numstr))]
[(list "fold along x" numstr) (string->number numstr)])))
(define (do-crease points [stop-at +inf.0])
(for/fold ([points points])
([crease creases]
[i (in-range stop-at)])
(for/seteqv ([pt points])
(define imag-diff (- (imag-part pt) (imag-part crease)))
(define real-diff (- (real-part pt) (real-part crease)))
(cond
[(and (zero? (real-part crease)) (positive? imag-diff))
(+ (real-part pt) (* +i (- (imag-part crease) imag-diff)))]
[(and (zero? (imag-part crease)) (positive? real-diff))
(+ (- (real-part crease) real-diff) (* +i (imag-part pt)))]
[else pt]))))
(check-equal? (set-count (do-crease points 1)) 706)
(define matrix (do-crease points))
(for-each displayln
(map string-join
(for/list ([row (add1 (apply max (map imag-part (set->list matrix))))])
(for/list ([col (add1 (apply max (map real-part (set->list matrix))))])
(if (set-member? matrix (make-rectangular col row)) "X" " ")))))
;; draws word LRFJBJEH