Mercurial > lbo > hg > aoc22
changeset 18:6ad216d8abee
Day 12 part 1
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Wed, 14 Dec 2022 21:12:55 +0100 |
parents | fc0bae3dddac |
children | 9b6e6ace0e72 |
files | 12/12.jl 12/input.txt 12/test_input.txt Manifest.toml Project.toml |
diffstat | 5 files changed, 136 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/12/12.jl Wed Dec 14 21:12:55 2022 +0100 @@ -0,0 +1,82 @@ + +import DataStructures: PriorityQueue, enqueue!, dequeue!; + +const test_input = "12/test_input.txt"; +const input = "12/input.txt"; + +const START = -1; +const END = -2; + +const MAX_DIFF = 1; + +function read_map(fh::IOStream)::Matrix{Int} + lines = readlines(fh); + m = zeros(Int, length(lines), length(lines[1])); + for (i, line) in enumerate(lines) + for (j, char) in enumerate(line) + m[i,j] = char - 'a'; + if char == 'E' + m[i,j] = END; + elseif char == 'S' + m[i,j] = START; + end + end + end + m +end + +function find_start_end(m::Matrix{Int})::Tuple{CartesianIndex, CartesianIndex} + findnext((==)(START), m, CartesianIndex((1,1))), findnext((==)(END), m, CartesianIndex((1,1))) +end + +function reconstruct_path(parents::Matrix{CartesianIndex{2}}, start::CartesianIndex, endd::CartesianIndex)::Vector{CartesianIndex} + v = Vector{CartesianIndex}(); + current = endd; + while current != start + push!(v, current); + current = parents[(current)]; + end + reverse!(v); + v +end + +function find_path(m::Matrix{Int}) + s, e = find_start_end(m); + current_best = zeros(Int, size(m)) .+ 10000; + parents = [CartesianIndex((-1,-1)) for i = 1:size(m, 1), j = 1:size(m, 2)]; + top = PriorityQueue{Tuple{CartesianIndex,Int}, Int}(); + enqueue!(top, (s, 0), 0); + + valid(x) = x[1] > 0 && x[1] <= size(m, 1) && x[2] > 0 && x[2] <= size(m, 2); + + while length(top) > 0 + (cb, dist) = dequeue!(top); + for mov in [(0,1),(0,-1),(1,0),(-1,0)] + nb = cb + CartesianIndex(mov); + if !valid(nb) + continue + end + if m[nb] == END && m[cb] >= 24 + parents[nb] = cb; + return reconstruct_path(parents, s, nb) + elseif m[nb] == END || (m[nb]-m[cb]) > 1 + continue; + end + if current_best[nb] > dist + 1 + current_best[nb] = dist + 1; + parents[nb] = cb; + enqueue!(top, (nb, dist + 1), dist + 1); + end + end + end + error("no path found!"); +end + +open(input; read=true) do fh + m = read_map(fh); + for c in eachrow(m) + println(c); + end + @time p = find_path(m); + println("PART 1: Path $p with length $(length(p))"); +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/12/input.txt Wed Dec 14 21:12:55 2022 +0100 @@ -0,0 +1,41 @@ +abacccaaaacccccccccccaaaaaacccccaaaaaaccccaaacccccccccccccccccccccccccccccccccccccccccccaaaaa +abaaccaaaacccccccccccaaaaaaccccccaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccccccccaaaaa +abaaccaaaacccccccccccaaaaacccccaaaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccccccccaaaaa +abccccccccccccccccccccaaaaacccaaaaaaaaaaaaaaaacccccccccccccccccccccccccccaaaccccccccccccaaaaa +abccccccccccccccccccccaacaacccaaaaaaaaccaaaaaccccccccccccccccccccccccccccaaaccccccccccccaccaa +abcccccccccccccaacccaaaccccccaaaaaaaaaccaaaaaccccccccccccccccccccccccccccccacccccccccccccccca +abcccccccccccaaaaaaccaaaccacccccaaaaaaacccccccccccccccccccccccccciiiicccccccddddddccccccccccc +abcccccccccccaaaaaaccaaaaaaaccccaaaaaacccccaacccccccaaaccccccccciiiiiiiicccdddddddddacaaccccc +abccccccccccccaaaaaaaaaaaaacccccaaaaaaacaaaacccccccaaaacccccccchhiiiiiiiiicddddddddddaaaccccc +abcccccccccccaaaaaaaaaaaaaacccccccaaacccaaaaaacccccaaaaccccccchhhipppppiiiijjjjjjjddddaaccccc +abcccccccccccaaaaaaaaaaaaaaccccccccccccccaaaaaccccccaaaccccccchhhpppppppiijjjjjjjjjddeeaccccc +abcccccccccccccccccaaaaaaaacccccccccccccaaaaaccccccccccccccccchhppppppppppjjqqqjjjjjeeeaacccc +abccccccccccccccccccaaaaaaaacccccccccccccccaacccccccccccccccchhhpppuuuupppqqqqqqqjjjeeeaacccc +abcccccccccccccccccccaacccacccccccccccccccccccccccccccccccccchhhopuuuuuuppqqqqqqqjjjeeecccccc +abacccccccccccccaaacaaaccccccccccccccccccccccccccccaaccccccchhhhoouuuuuuuqvvvvvqqqjkeeecccccc +abaccccccccccccaaaaaacccccaaccccccccccccccccccccccaaaccccccchhhooouuuxxxuvvvvvvqqqkkeeecccccc +abaccccccccccccaaaaaacccaaaaaaccccccccccccccccccaaaaaaaaccchhhhooouuxxxxuvyyyvvqqqkkeeecccccc +abcccccccccccccaaaaacccaaaaaaaccccccccccccccccccaaaaaaaaccjjhooooouuxxxxyyyyyvvqqqkkeeecccccc +abccccccccccccccaaaaaacaaaaaaaccccccccaaaccccccccaaaaaaccjjjooootuuuxxxxyyyyyvvqqkkkeeecccccc +abccccccccccccccaaaaaaaaaaaaacccccccccaaaacccccccaaaaaacjjjooootttuxxxxxyyyyvvrrrkkkeeecccccc +SbccccccccccccccccccaaaaaaaaacccccccccaaaacccccccaaaaaacjjjoootttxxxEzzzzyyvvvrrrkkkfffcccccc +abcccccccccccaaacccccaaaaaaacaaaccccccaaaccccccccaaccaacjjjoootttxxxxxyyyyyyvvvrrkkkfffcccccc +abcccccccccaaaaaacccaaaaaacccaaacacccaacccccccccccccccccjjjoootttxxxxyxyyyyyywvvrrkkkfffccccc +abcccccccccaaaaaacccaaaaaaaaaaaaaaaccaaacaaacccccaacccccjjjnnnttttxxxxyyyyyyywwwrrkkkfffccccc +abcaacacccccaaaaacccaaacaaaaaaaaaaaccaaaaaaacccccaacaaacjjjnnnntttttxxyywwwwwwwwrrrlkfffccccc +abcaaaaccccaaaaacccccccccaacaaaaaaccccaaaaaacccccaaaaacccjjjnnnnnttttwwywwwwwwwrrrrllfffccccc +abaaaaaccccaaaaaccccccaaaaaccaaaaacaaaaaaaaccccaaaaaaccccjjjjinnnntttwwwwwsssrrrrrllllffccccc +abaaaaaaccccccccccccccaaaaacaaaaaacaaaaaaaaacccaaaaaaacccciiiiinnnntswwwwssssrrrrrlllfffccccc +abacaaaaccccccccccccccaaaaaacaaccccaaaaaaaaaaccccaaaaaaccccciiiinnnssswwsssssllllllllfffccccc +abccaaccccccccccccccccaaaaaaccccccccccaaacaaaccccaaccaacccccciiiinnsssssssmmllllllllfffaacccc +abccccccccccccccccccccaaaaaaccccccccccaaaccccccccaaccccccccccciiinnmsssssmmmmlllllgggffaacccc +abcccccccccccccccaccccccaaacccccccccccaaccccccccccccccccccccccciiimmmsssmmmmmgggggggggaaacccc +abcccccccccaaaaaaaaccccccccccccccccccccccccccccaaaaaccccccccccciiimmmmmmmmmgggggggggaaacccccc +abccccccccccaaaaaaccccccccccccccccccaacccccccccaaaaacccccccccccciiimmmmmmmhhggggcaaaaaaaccccc +abccccccccccaaaaaacccccccccccccccccaacccccccccaaaaaacccccccccccciihhmmmmhhhhgccccccccaacccccc +abccccaacaaaaaaaaaaccccccccccccccccaaaccccccccaaaaaaccccccccccccchhhhhhhhhhhaaccccccccccccccc +abccccaaaaaaaaaaaaaaccccccccccaaccaaaaccccccccaaaaaacccaaacccccccchhhhhhhhaaaaccccccccccccccc +abcccaaaaaaaaaaaaaaaccccccccaaaaaacaaaacacaccccaaaccccaaaacccccccccchhhhccccaaccccccccccaaaca +abcccaaaaaacacaaacccccccccccaaaaaaaaaaaaaaacccccccccccaaaacccccccccccaaaccccccccccccccccaaaaa +abcccccaaaacccaaaccccccccccaaaaaaaaaaaaaaaaccccccccccccaaacccccccccccaaacccccccccccccccccaaaa +abcccccaacccccaacccccccccccaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccccccccccccccaaaaa
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/12/test_input.txt Wed Dec 14 21:12:55 2022 +0100 @@ -0,0 +1,5 @@ +Sabqponm +abcryxxl +accszExk +acctuvwj +abdefghi
--- a/Manifest.toml Wed Dec 14 19:48:28 2022 +0100 +++ b/Manifest.toml Wed Dec 14 21:12:55 2022 +0100 @@ -2,7 +2,7 @@ julia_version = "1.8.0" manifest_format = "2.0" -project_hash = "3f88d5b42b2d6582663e96fe337b4c1e0f59d4fd" +project_hash = "a9c9254dd6533f580c6a736737f716edb529b934" [[deps.Adapt]] deps = ["LinearAlgebra"] @@ -70,6 +70,12 @@ uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" version = "1.13.0" +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.13" + [[deps.DataValueInterfaces]] git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464"
--- a/Project.toml Wed Dec 14 19:48:28 2022 +0100 +++ b/Project.toml Wed Dec 14 21:12:55 2022 +0100 @@ -1,4 +1,5 @@ [deps] BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" ParserCombinator = "fae87a5f-d1ad-5cf0-8f61-c941e1580b46" Transducers = "28d57a85-8fef-5791-bfe6-a80928e7c999"