diff --git a/input/18.txt b/input/18.txt new file mode 100644 index 0000000..b1f8cc9 --- /dev/null +++ b/input/18.txt @@ -0,0 +1,81 @@ +################################################################################# +#.............#..o..........#...........#...............#b......#...#.........#.# +#.#######.#.#.#.#.#########.###.#######.###.#########.###.###.###.#.#C#####.#.#.# +#.#...A.#.#.#.#.#.#w....#.#...#..e#.....#...#.....#...#...#...#...#.#.....#.#k..# +#.#.###.###.#.###.###.#.#.###.#####.###.#.###.#####.###.###.###.###.#####.#.###.# +#.#...#.....#...#.#...#.....#.....#...#.#...#.#...#.#...#.#.....#.#.....#.#.#...# +#.###.#########.#.#.#######.#####.###.#.###.#.#.#.#.#.###.#######.###.#.#.#.##### +#...#.#...........#.......#.....#.....#.#...#...#.#.#.......#.....#...#.#.#.#...# +###.#.###.#############.#.#############.#.###.###.#P#######.###.#.#.###.#.#.#.#.# +#...#...#.#.....#.....#.#.....#...#.....#.#.....#.......#...#...#.#.#...#.#...#.# +#.#####.#.#.###.#.###.#######.#.#.#.#####.###############.###.#####.#.###.#####.# +#.....#.#.#.#.#.#...#.#.....#.#.#.#.....#.......#.......#.#.......#.#...#.#...#.# +###.###.#.#.#.#.###.#.#.###.#.#.#.#####.#.#####.#.#####.#.#######.#.###.#.#.###.# +#...#...#.#...#.#...#.#.#...#...#.....#.#.#.#...#.#.#...#...#.....#.#...#.#.#...# +#.###.#######.#.#.###.#.###.#.#####.###.#.#.#.#.#.#.#.#####.#.###.#D###.#.#.#.### +#...#.....#...#.....#.#...#.#.#...#.#...#...#.#.#...#.....#.#.#.X.#...#.#...#...# +###.#####.#.#####.###.###.#.###.#.#.#.#######.#.###.#####.#.#.###.###.#####.###.# +#.#.....#...#...#.#...#.#.#.#...#.#.#...#.....#.#.#.#...#.#.#...#...#...#...#...# +#.#####.#####.#.###.#.#.#.#.#.###.#.###.#.#####.#.#.#.#.#.#.###.#.#####.#.###.### +#.#...#.#.....#.....#...#.#...#...#.....#.#.....#.#.#.#.#.......#.#...#.....#...# +#.#.#.#.#.###.#########.#.#####.#######.#.#.#####.#.###.#########.#.#.#########.# +#...#...#...#.#...#...#.#.#...#.......#.#.#.....#.#.#.....#...#...#.#.........#i# +#.#####.###.#.#.#.#.#####.#.#########.#.#.#####.#.#.#.#####.#######.#########.#.# +#.#...#...#.#.#.#...#.....#.........#.#.#.....#...#...#n..#..f..#.Z.#...W...#.#.# +#K#Y#.#.###.#.#.#####.#####.###.#####.#.#####.#####.###.#.#####.#.###.#.#####.#.# +#.#.#.#.#...#.#.#.#...#...#.#.#.#...#.#.#.....#.....#...#.......#.#.#.#......h#.# +#.#.#.###.#.###.#.#.#.###.#.#.#.#.#.#.#.#.#J###.#####.###########.#.#.#########.# +#.#.#.....#.#...#...#...#...#.#.#.#...#.#.#.#...#...#.....#...#g..#.#.#...#.....# +###.#######.#.###.#####.#.###.#.#.#######.###.#####.#####.#.#.#.###.#.#.###.###.# +#...#.....#.#.#...#.....#.....#.#.......#...#.#.......#.#...#...#.....#.....#...# +#.#####.###.#.#.###.#########.#.#######.#.#.#.###.###.#.#########.#####.#####.### +#.....#.....#d#...#.#...#...#.#.......#.#.#.#...#...#.#.......#.#.#...#...#.#...# +#.###.#.#####.###.#.#.#.#.#.#.###.#####.###.###.###.#.###.###.#.#.###.###.#.###.# +#.#...#...#.#.#...#.#.#.#.#...#.#.....#.#...#.#.....#...#.#.#...#...#.....#.#...# +#.#.#####.#.#.#####.#.#.#.#####.#####.#.#.#.#.#########.#.#.###.###.#####.#.#.### +#.#.....#.#.#...#...#.#.#...#.......#.#.#.#.......#...#...#...#...#.....#.#.#...# +#.#####V#.#.###.#.###.#.###.#.#####.#.#.#.#######.#.#.#####.#.###.#####.#.#U###.# +#.....#.#.....#...#...#...#.#.....#.#...#...#.....#.#.......#.#...#..v#.#.....#.# +#####.#.###########.#######.#####.#.#####.#.#######.#####.#####.#####.#.#######.# +#.....#...........................#.......#.............#.........R...#l........# +#######################################.@.####################################### +#.............#......r..#.......#...........#.........#...#.......#.....#.#.....# +#.###########.#######.###.#.###.#.#####.#.###.#######.#.#.#.###.###.#.#.#.#.#.### +#...#.......#.......#.....#.#.#...#...#.#.#...#.....#...#.#...#.....#y#...#.#...# +###.#.###.#.#######.#.#####.#.#######.#.#.#.###.###.#####.###.#######.###.#.###Q# +#...#.#...#.#.......#.#.....#.......#.#.#...#...#...#...#...#...#...#...#.#.#.#.# +#.###.#.#.###.#######.#.#######.###.#.#.#.###.#####.#.#.###.###.#.#.###.#.#.#.#.# +#.#...#.#.#.........#.#...#.....#.....#.#.#...#...#...#.#.#.....#.#.#...#.#...#.# +#.#.###.###.#######.#####.#.#.#########.#.###.#.#.#####.#.#######.#.#.#######.#.# +#q#...#.....#.....#.....#.#.#.#...#.....#...#...#.#...#.........#.#.#.#.......#.# +#.#######.###.###.#####.#.#.###.#.#.#######.#.###.#.#.#########.#.#.#.#.#######.# +#.#.....#...#.#.#.#...#.#.#.#...#.#.....#..j#.#...#.#.....#.....#.#.#.....#.....# +#.#.###.#####.#.#.###.#.#.#.#.###.#####.#.###.#.###.#####.###.###.#.#######.###.# +#.#.#.#...#...#.#.#...#...#.#...#.......#.#.#.#.....#...#...#...#.#.......#...#.# +#.#L#.###.#.###.#.#.#######.###.#########.#.#.#########.###.###.#.#######.###S#.# +#.#...#.#.#.#...#.#.#...#.......#...#...#.#.............#.#.#.#.#.#.....#...#.#.# +#.###.#.#.#.###.#.#.#.#.#.#######.#.#.#.#.#.###########.#.#.#.#.#.###.#.###.#.#.# +#...#...#...#...#.#.#.#.........#.#.#.#.#.#.#.......#.#.#.#.#...#...#.#...#.#.#.# +#.#.###.#####.#.#H#.#.#########.#.#.#N#.#.#.#.#####.#.#.#.#.#######.###.#.#.#.#.# +#.#.#...#.....#.#.#.....#...#...#.#...#.#.#.#.#...#.#.....#.#.....#...#.#.#...#.# +###.#.###.#.#####.#.#####.#.#.###.#####.#.###.#.#.#.#.#####.#.###.###.#.#######.# +#...#...#.#...#...#.#.T...#.#.#.F.#.#...#.....#.#.#.#...#...#.#...#...#...#...#.# +#.#####.#.###.#.###########.###.###.#.#########.#.#.###.#.#.###.###.###.#.#.#.#.# +#.....#.#.#u..#..z........#....t#.G...#.#.......#.#.#...#.#...#.#...#...#...#...# +###.#.#.###.###########.#########.#####.#.#####.#.#.#####.#.###.#.#######.####### +#...#s#...#.....#.....#.........#.#.....#.....#.#.#.....#.#.#...#.......#...#...# +#.###.###.###.#.#.###.#######.###.#.###########.#######.#.#.#.###.#####.#####.#.# +#.#.....#...#.#.....#.......#.....#.....#.....#.......#.#.#.#...#.#...#...#...#.# +#.#########.###############.###########.#.###.#####.###.#.#####.#.#.#####.#.###.# +#.#x......#.#...#...........#...........#.#.........#...#.#.....#...#.....#.#...# +#.#.#####.#I#.#.#.#########.#####.#####.#.###########.###.#.#######.#.#####.#.### +#.#...#...#...#...#.....#.#.#...#...#...#.............#...#.....#.#.#.......#.O.# +#.###.#.#############.#.#.#.#.#.###.#.###.###############.#####.#.#.#######.###.# +#...#.#.....#...#.....#...#.#.#.....#.#.#.#...#...#.....#..m#...#...#.....#.#...# +#.###.###.#.#.#.###.#######.#.#######.#.#.#.#.#.#.#.###.###.#.#######.###.#.#.### +#.#...#.#.#...#.....#.....#...#.....#...#.#.#...#.#...#.#...#.....#...#...#.#...# +#.#M###.#.###########.###.#####.###.###.#.#.#####.###.#.#.#######.#.###.#######.# +#.#...#.#...#..a..#...#.#.....#.#.....#.#p..#...#...#.#.#.#.......#.#...#.....#.# +#.###.#.###.#.###.#.###.###.###.#.#####.#####.#####.#.#.#.#.#######.#.###.###.#.# +#.........#...B.#.........#.....#.......#.............#...#.......E.#.....#....c# +################################################################################# diff --git a/lib.rkt b/lib.rkt index a9e577e..52fe4f1 100644 --- a/lib.rkt +++ b/lib.rkt @@ -11,6 +11,7 @@ show-solution make-vector-grid + lists->vectors vectors->lists hash->vectors show-list-grid @@ -78,6 +79,10 @@ (define (make-vector-grid width height [default 0]) (build-vector height (λ (_) (make-vector width default)))) +;; lists->vectors : list-grid -> vector-grid +(define (lists->vectors list-grid) + (list->vector (map list->vector list-grid))) + ;; vectors->lists : vector-grid -> list-grid (define (vectors->lists vector-grid) (map vector->list (vector->list vector-grid))) @@ -118,6 +123,13 @@ (show-vector-grid char-hash (hash->vectors hash-grid default))) +;; Char helpers ;; + +;; nchar=? : char -> char -> boolean +(define (nchar=? c1 c2) + (not (char=? c1 c2))) + + ;; Number helpers ;; ;; sum : (listof number) -> number @@ -127,10 +139,6 @@ (define (!= n1 n2) (not (= n1 n2))) -;; nchar=? : char -> char -> boolean -(define (nchar=? c1 c2) - (not (char=? c1 c2))) - ;; nzero? : number -> boolean (define (nzero? n) (not (zero? n))) diff --git a/src/18.rkt b/src/18.rkt new file mode 100644 index 0000000..a3dcd93 --- /dev/null +++ b/src/18.rkt @@ -0,0 +1,74 @@ +#lang racket + +(require data/queue + graph + (except-in "../lib.rkt" transpose)) + +(define input + (problem-input 18)) + +(define list-grid + (map string->list input)) + +(define vector-grid + (lists->vectors list-grid)) + +(define width + (length (car list-grid))) + +(define height + (length list-grid)) + +(define (get-char coord) + (match-let ([(list x y) coord]) + (if (or (< x 0) (< y 0) + (>= x width) + (>= y height)) + #\# + (vector-ref (vector-ref vector-grid y) x)))) + +(define (neighbours coord) + (match-let ([(list x y) coord]) + (let ([U (list x (sub1 y))] + [D (list x (add1 y))] + [L (list (sub1 x) y)] + [R (list (add1 x) y)]) + (filter-not + (∘ (∂ char=? #\#) (∂ get-char)) + (list U D L R))))) + +(define key-door-graph + (let* ([Q (make-queue)] + [entrance (list (round (/ width 2)) + (round (/ height 2)))] + [visited (make-hash `((,entrance . #t)))] + [graph (weighted-graph/undirected '())]) + (enqueue! Q (list entrance #\@ 0)) + (let loop () + (if (queue-empty? Q) + graph + (match-let* ([(list coord prev dist) (dequeue! Q)] + [ncoords (neighbours coord)]) + (for-each + (λ (ncoord) + (let ([nc (get-char ncoord)]) + (cond + [(hash-ref visited ncoord #f)] + [(char=? #\. nc) + (hash-set! visited ncoord #t) + (enqueue! Q (list ncoord prev (add1 dist)))] + [else + (hash-set! visited ncoord #t) + (enqueue! Q (list ncoord nc 0)) + (add-edge! graph prev nc (add1 dist))]))) + ncoords) + (loop)))))) + +(define ordered-keys + (let ([keys (filter char-lower-case? (get-vertices key-door-graph))]) + (displayln keys) + (define (sort-fn c1 c2) + (not (member (char-upcase c2) (fewest-vertices-path key-door-graph #\@ c1)))) + (sort keys sort-fn))) + +#;(for-each displayln (map (λ (s) (string-replace (string-replace s "#" "█") "." " ")) input)) \ No newline at end of file