blob: 60cb95fa72356dcf69ea10b4ded4897312525af5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
#lang racket
(require "../../jj-aoc.rkt"
threading)
(define (make-pt x y)
(hash 'x x 'y y))
(struct fold (dir loc) #:transparent)
(define (make-fold dir loc)
(fold (string->symbol dir)
(string->number loc)))
(define data (port->lines (open-day 13 2021)))
(define-values (points-list folds-list) (splitf-at data (λ~> (equal? "") not)))
(define pts
(for/set ([p (in-list points-list)])
(~> p
(string-split ",")
(map string->number _)
(apply make-pt _))))
(define folds
(for/list ([f (in-list (rest folds-list))])
(~>> f
(regexp-match #px"fold along (.)=(.*)")
rest
(apply make-fold))))
(define (fold-over f pts)
(define dir (fold-dir f))
(define loc (fold-loc f))
(for/set ([p (in-set pts)])
(cond
[(> (hash-ref p dir) loc) (hash-update p dir (λ (l) (- (* 2 loc) l)))]
[else p])))
;; part 1
(~>> pts
(fold-over (first folds))
set-count)
;; part 2
(define final-fold
(for/fold ([p pts])
([f (in-list folds)])
(fold-over f p)))
(for/list ([y (in-range 6)])
(~>> (for/list ([x (in-range 39)])
(if (set-member? final-fold (hash 'x x 'y y))
#\█
#\space))
(apply string)
println))
#|
for this data set, the result looks like
" ██ █ █ ██ ██ ███ ██ ██ █ █"
"█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █"
"█ █ ████ █ █ █ █ █ █ █ █ █"
"████ █ █ █ ██ █ ███ █ ██ ████ █ █"
"█ █ █ █ █ █ █ █ █ █ █ █ █ █ █"
"█ █ █ █ ███ ██ █ ███ █ █ ██ "
|#
|