This commit is contained in:
xenia 2023-12-03 00:52:34 -05:00
parent 85cb4a80c2
commit c950b870e3
1 changed files with 38 additions and 56 deletions

94
3.rkt
View File

@ -4,67 +4,49 @@
;; solution for day 3
(define *delta* '((0 . 1) (1 . 1) (1 . 0)
(1 . -1) (0 . -1) (-1 . -1)
(-1 . 0) (-1 . 1)))
(define (posn+ a b)
(cons (+ (car a) (car b))
(+ (cdr a) (cdr b))))
(define (part1 input)
(define (input-ref grid y x)
(string-ref (vector-ref grid y) x))
(define (symbol-adjacent? grid y x)
(for/or ([delta (in-list '((0 . 1) (1 . 1) (1 . 0)
(1 . -1) (0 . -1) (-1 . -1)
(-1 . 0) (-1 . 1)))]
#:unless (>= (+ (car delta) x) (string-length (vector-ref grid y)))
#:unless (< (+ (car delta) x) 0)
#:unless (>= (+ (cdr delta) y) (vector-length grid))
#:unless (< (+ (cdr delta) y) 0))
(match (input-ref grid (+ (cdr delta) y) (+ (car delta) x))
[(or #\. #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) #f]
[_ #t])))
(for/sum ([line (in-vector input)] [y (in-naturals)])
(for/sum ([posn (in-list (regexp-match-positions* #px"[0-9]+" line))]
#:do [(define xmin (car posn)) (define xmax (cdr posn))])
(if (for/or ([x (in-range xmin xmax)]) (symbol-adjacent? input y x))
(string->number (substring line xmin xmax))
0))))
(define numbers
(for/set ([(pos elem) (in-hash input)]
#:when (char? elem)
[d (in-list *delta*)]
#:do [(define neigh (hash-ref input (posn+ pos d) #f))]
#:when (list? neigh))
neigh))
(for/sum ([n (in-set numbers)])
(third n)))
(define (part2 input)
(define (input-ref grid y x)
(string-ref (vector-ref grid y) x))
(define (find-adj-numbers grid y x)
(for/list ([delta (in-list '((0 . 1) (1 . 1) (1 . 0)
(1 . -1) (0 . -1) (-1 . -1)
(-1 . 0) (-1 . 1)))]
#:unless (>= (+ (car delta) x) (string-length (vector-ref grid y)))
#:unless (< (+ (car delta) x) 0)
#:unless (>= (+ (cdr delta) y) (vector-length grid))
#:unless (< (+ (cdr delta) y) 0)
#:when (member (input-ref grid (+ (cdr delta) y) (+ (car delta) x))
'(#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9)))
(cons (+ (car delta) x) (+ (cdr delta) y))))
(define nums (make-hash))
(for ([line (in-vector input)] [y (in-naturals)])
(for ([posn (in-list (regexp-match-positions* #px"[0-9]+" line))]
#:do [(define xmin (car posn)) (define xmax (cdr posn))])
(for ([x (in-range xmin xmax)])
(hash-set! nums (cons x y) (list xmin y (string->number (substring line xmin xmax)))))))
(for/sum ([line (in-vector input)] [y (in-naturals)])
(for/sum ([chr (in-list (string->list line))] [x (in-naturals)]
#:when (equal? chr #\*))
(define adj-nums (find-adj-numbers input y x))
(define adj-num-entries
(for/set ([a-n (in-list adj-nums)])
(hash-ref nums a-n)))
(if (= 2 (set-count adj-num-entries))
(apply * (map #{third %} (set->list adj-num-entries)))
0))))
(for/sum ([(pos elem) (in-hash input)]
#:when (equal? elem #\*)
#:do [(define neighs
(for/set ([d (in-list *delta*)]
#:do [(define neigh (hash-ref input (posn+ pos d) #f))]
#:when (list? neigh))
neigh))]
#:when (= 2 (set-count neighs)))
(apply * (map third (set->list neighs)))))
(define (parse fname)
(list->vector (file->lines fname)))
(define elements (make-hash))
(for ([line (in-lines (open-input-file fname))] [y (in-naturals)]
#:do [(for ([posn (in-list (regexp-match-positions* #px"[0-9]+" line))]
#:do [(match-define (cons xmin xmax) posn)]
[x (in-range xmin xmax)])
(hash-set! elements (cons y x)
(list y xmin (string->number (substring line xmin xmax)))))]
[chr (in-string line)] [x (in-naturals)]
#:unless (equal? chr #\.)
#:unless (char-numeric? chr))
(hash-set! elements (cons y x) chr))
elements)
(module+ main
(define input (parse "inputs/3"))