Day 18: Partial progress.
This commit is contained in:
parent
7873fda361
commit
2c24047346
|
@ -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#
|
||||
#################################################################################
|
16
lib.rkt
16
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)))
|
||||
|
|
|
@ -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))
|
Loading…
Reference in New Issue