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"