-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAoC Day 12.m
47 lines (35 loc) · 1.39 KB
/
AoC Day 12.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
(* ::Package:: *)
(* ::Text:: *)
(*Written December 12th, 2022.*)
(*Import*)
day = 12;
inputPath = FileNameJoin[{NotebookDirectory[], "Day" <> ToString[day] <> "Input.txt"}];
toExpression[inputText_] :=
Map[
If[! IntegerQ[#] \[And]
StringMatchQ[#,
Alternatives["+", "-", ""] ~~ DigitCharacter ..],
ToExpression[#], #] &,
inputText,
{Depth[inputText] - 1, Depth[inputText]}];
input = Characters /@ toExpression[Import[inputPath, "Table"]];
(*Setup*)
map = Flatten[input /. Thread[CharacterRange["a", "z"] -> Range[26]], 1];
sPos = ToString[FirstPosition[map, "S"]];
ePos = ToString[FirstPosition[map, "E"]];
map = map /. {"S" -> 1, "E" -> 26};
g = Graph@Flatten[
Table[
{If[i + 1 <= Length[map] \[And] map[[i + 1, j]] - map[[i, j]] <= 1,
ToString[{i, j}] -> ToString[{i + 1, j}], Nothing],
If[j + 1 <= Length[map[[i]]] \[And] map[[i, j + 1]] - map[[i, j]] <= 1,
ToString[{i, j}] -> ToString[{i, j + 1}], Nothing],
If[i + 1 <= Length[map] \[And] map[[i, j]] - map[[i + 1, j]] <= 1,
ToString[{i + 1, j}] -> ToString[{i, j}], Nothing],
If[j + 1 <= Length[map[[i]]] \[And] map[[i, j]] - map[[i, j + 1]] <= 1,
ToString[{i, j + 1}] -> ToString[{i, j}], Nothing]},
{i, Length[map]}, {j, Length[map[[i]]]}]];
(*Part 1*)
GraphDistance[g, sPos, ePos]
(*Part 2*)
Min[GraphDistance[g, #, ePos] & /@ (ToString /@ Position[map, 1])]