aoc2023/10.rkt

92 lines
2.3 KiB
Racket

#lang curly-fn racket
(require "scripts/aoc.rkt")
;; solution for day 10
(define (pt+ a b)
(cons (+ (car a) (car b))
(+ (cdr a) (cdr b))))
(define (part1 input)
(define ccs (cc (second input)))
(for/first ([cc-cand (in-list ccs)] #:when (member (first input) cc-cand))
(/ (length cc-cand) 2)))
(define (part2 input [size 140])
(define lines (list->vector (file->lines "inputs/10")))
(define ccs (cc (second input)))
(define loop
(~>
(for/first ([cc-cand (in-list ccs)] #:when (member (first input) cc-cand))
cc-cand)
list->set))
(define (count-crossings pt)
(cond
[(< (car pt) 0) 0]
[(< (cdr pt) 0) 0]
[else
(+ (cond
[(not (set-member? loop pt)) 0]
[(eq? (string-ref (vector-ref lines (cdr pt)) (car pt)) #\7) 2]
[(eq? (string-ref (vector-ref lines (cdr pt)) (car pt)) #\L) 2]
[else 1])
(count-crossings (pt+ pt '(-1 . -1))))]))
; (displayln loop)
(for*/sum ([y (in-range size)] [x (in-range size)])
(cond
[(set-member? loop (cons x y)) 0]
[(even? (count-crossings (cons x y))) 0]
[else
; (displayln (cons x y))
1])))
; (part2 (parse "inputs/10-test2") 10)
; (error)
(define (parse fname)
(define lines (list->vector (file->lines fname)))
(define-values [N E S W] (values '(0 . -1) '(1 . 0) '(0 . 1) '(-1 . 0)))
(define start #f)
(define (get-conns x y)
(match (string-ref (vector-ref lines y) x)
[#\. '()]
[#\| `(,N ,S)]
[#\- `(,E ,W)]
[#\L `(,N ,E)]
[#\J `(,N ,W)]
[#\7 `(,S ,W)]
[#\F `(,S ,E)]
[#\S
(set! start (cons x y))
`(,N ,E ,S ,W)]))
(define edges-raw
(for/fold ([out (set)])
([y (in-range (vector-length lines))]
#:do []
[x (in-range (string-length (vector-ref lines 0)))])
(define this-pt (cons x y))
(define conns (get-conns x y))
(set-union out (list->set (map #{list this-pt (pt+ this-pt %)} conns)))))
(define edges
(for/set ([x (in-set edges-raw)]
#:when (set-member? edges-raw (list (second x) (first x))))
x))
(list start (unweighted-graph/undirected (set->list edges))))
(module+ main
(define input (parse "inputs/10"))
(answer 10 1 (time (part1 input)))
(answer 10 2 (time (part2 input)))
(displayln "meow"))