92 lines
2.3 KiB
Racket
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"))
|