Day 12
This commit is contained in:
@@ -30,6 +30,7 @@ library
|
|||||||
Day10
|
Day10
|
||||||
Day11
|
Day11
|
||||||
Day11.Parser
|
Day11.Parser
|
||||||
|
Day12
|
||||||
Day2
|
Day2
|
||||||
Day2.Part1
|
Day2.Part1
|
||||||
Day2.Part2
|
Day2.Part2
|
||||||
@@ -67,10 +68,12 @@ library
|
|||||||
, hspec
|
, hspec
|
||||||
, hspec-megaparsec
|
, hspec-megaparsec
|
||||||
, lens
|
, lens
|
||||||
|
, linear
|
||||||
, matrix
|
, matrix
|
||||||
, megaparsec
|
, megaparsec
|
||||||
, mtl
|
, mtl
|
||||||
, parsec
|
, parsec
|
||||||
|
, search-algorithms
|
||||||
, sort
|
, sort
|
||||||
, split
|
, split
|
||||||
, text
|
, text
|
||||||
@@ -94,10 +97,12 @@ executable aoc2022-exe
|
|||||||
, hspec
|
, hspec
|
||||||
, hspec-megaparsec
|
, hspec-megaparsec
|
||||||
, lens
|
, lens
|
||||||
|
, linear
|
||||||
, matrix
|
, matrix
|
||||||
, megaparsec
|
, megaparsec
|
||||||
, mtl
|
, mtl
|
||||||
, parsec
|
, parsec
|
||||||
|
, search-algorithms
|
||||||
, sort
|
, sort
|
||||||
, split
|
, split
|
||||||
, text
|
, text
|
||||||
@@ -111,6 +116,7 @@ test-suite aoc2022-test
|
|||||||
other-modules:
|
other-modules:
|
||||||
Day10Spec
|
Day10Spec
|
||||||
Day11Spec
|
Day11Spec
|
||||||
|
Day12Spec
|
||||||
Day1Spec
|
Day1Spec
|
||||||
Day2Spec
|
Day2Spec
|
||||||
Day3Spec
|
Day3Spec
|
||||||
@@ -133,10 +139,12 @@ test-suite aoc2022-test
|
|||||||
, hspec
|
, hspec
|
||||||
, hspec-megaparsec
|
, hspec-megaparsec
|
||||||
, lens
|
, lens
|
||||||
|
, linear
|
||||||
, matrix
|
, matrix
|
||||||
, megaparsec
|
, megaparsec
|
||||||
, mtl
|
, mtl
|
||||||
, parsec
|
, parsec
|
||||||
|
, search-algorithms
|
||||||
, sort
|
, sort
|
||||||
, split
|
, split
|
||||||
, text
|
, text
|
||||||
|
|||||||
@@ -37,6 +37,8 @@ dependencies:
|
|||||||
- hspec-megaparsec
|
- hspec-megaparsec
|
||||||
- mtl
|
- mtl
|
||||||
- sort
|
- sort
|
||||||
|
- search-algorithms
|
||||||
|
- linear
|
||||||
|
|
||||||
ghc-options:
|
ghc-options:
|
||||||
- -Wall
|
- -Wall
|
||||||
|
|||||||
82
ressources/day12-input
Normal file
82
ressources/day12-input
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
abaaacccccccccaaaaaaccccccccccccccccaacccccccccccaacaaaaaaaaaaaaaaaaaccaaaaacccaaaaccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaa
|
||||||
|
abaaacccccccccaaaaaacccccccccccccccaaaaccccccccccaaaaaaaacaaaaaaaaaaaccaaaaaaccaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaa
|
||||||
|
abaaaccccccccccaaaaacccccccccccccccaaaacccccccccccaaaaacccaaaaaaaaaacccaaaaaacccaaccccccccccccccaaaaacccccccccccccccccccccccccccccccccccccaaaaaa
|
||||||
|
abccccaaccccccaaaaacccccccccaaaaaccaaaaccccccccccccaaaaacaaaaaaaaacccccaaaaaccccccccccccccccccccaaaaacccccccccccccccccaaaccccaaaccccccccccaaacaa
|
||||||
|
abcccaaaacccccaaaaacccccccccaaaaacccccccccccccccccaaacaaaaaaaaaacccccccaaaaacccccccccccccccccccaaaaaacccccccccccccccccaaaaccaaaaccccccccccccccaa
|
||||||
|
abcccaaaaacacccccccccccccccaaaaaaccccccccccccccccccaaccaaaaacaaaaccccccccccccccccccccccccccccccaaaaaaccccccccccccccccccaaaaaaaacccccccccccccccaa
|
||||||
|
abaaaaaaaaaacccccccccccccccaaaaaaccccccccccccccccccccccaaaacccaaaccccccccccccccccccccccccccccccaaaaaacccccccccccccccciiiiijaaaaccccccccccccccccc
|
||||||
|
abaaaaaaaaaacccccccccccccccaaaaaacccccccccccccccccccccccccccccaaacccccccccccccccccccccccccccccccaaaccccccccccccccccciiiiiijjjaccccccccaaaccccccc
|
||||||
|
abccaaaaaaccccccccccccccccccaaaccccccccccccccccccccccccccccccccacccccccccccaacccccccccccccccccccccccccccccccccccccciiiiioijjjjaaccccccaaaaaacccc
|
||||||
|
abccaaaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaacccccccccccccccccccccccccccccccccccciiinnooojjjjjaaccaaaaaaaacccc
|
||||||
|
abccaaaaaacccccccccccccccccccccccccccccccccccccaacccccaacccccccccccccccccaaaaaacccccccccccccccccccccccccccaaaccccciiinnnoooojjjjjjkkkaaaaaaacccc
|
||||||
|
abcaaaaaaaaccccccccccccccccccccccccccccccccccccaaaccaaaaaaccccaaacccccccccaaaacccccccccccccccccccccccccccccaaaaccciiinnnouooojjjjkkkkkaaaaaccccc
|
||||||
|
abccaccccccccccccccccccaaccccccaccccccccccccaaaaaaaaaaaaaacccaaaacccccccccaaaacccccccccccccccccccccccccccaaaaaacchhinnnttuuooooookkkkkkkaaaccccc
|
||||||
|
abccccccccccccccccccaacaaaccccaaaaaaaaccccccaaaaaaaacaaaaacccaaaacccccccccaccacccccccccccccccccccccccccccaaaaacchhhhnntttuuuooooppppkkkkcaaacccc
|
||||||
|
abccccccccaaacccccccaaaaaccccccaaaaaaccccccccaaaaaacaaaaaccccaaaaccccccccccccccccccccccccccccaccccccccccccaaaaahhhhnnntttxuuuooppppppkkkcccccccc
|
||||||
|
abccccccccaaaacccccccaaaaaaccccaaaaaaccaaacccaaaaaacaaaaaccccccccccccccaaccccccccccccccaaaaaaaacccccccccccaachhhhhnnnntttxxuuuuuuuupppkkkccccccc
|
||||||
|
abccccccccaaaacccccaaaaaaaacccaaaaaaaacaaacacaaaaaaccccccccccccccccccccaacccccccccccccccaaaaaacccccccccccccchhhhmnnnntttxxxxuuuuuuupppkkcccccccc
|
||||||
|
abacccccccaaaacccccaaaaacaaccaaaaaaaaaaaaaaaaaaccaacccccccccccccccccaaaaaaaaccccccccccccaaaaaaccccccccccccchhhhmmmntttttxxxxuyyyuvvpppklcccccccc
|
||||||
|
abacccccccccccccccccacaaaccaaaaaaaaaaaaaaaaaaaccccccccccccccccccccccaaaaaaaacccccccccccaaaaaaaaccccccccccccgghmmmtttttxxxxxxyyyyvvvpplllcccccccc
|
||||||
|
abaccccccccaacccccccccaaaccaaaaaaaacaaaaaaaaaaccccccccccccccccccccccccaaaaccccccccccccaaaaaaaaaaccccccaccccgggmmmtttxxxxxxxyyyyyvvppplllcccccccc
|
||||||
|
SbaaaccccccaaacaaaccccccccaaaaaaaaacaaaaaaaaacccccccccccccccccccccccccaaaaacccccccccccaaaaaaaaaaaaacaaaccaagggmmmtttxxxEzzzzyyyvvppplllccccccccc
|
||||||
|
abaacccccccaaaaaaacccccccaaaaaaacaaccaaaaaaaccccccccccccccaaaccccccccaaaaaacccccccccccacacaaacccaaaaaaacaaagggmmmsssxxxxxyyyyyvvvqqqlllccccccccc
|
||||||
|
abaccccccccaaaaaaccacccaaaaaaaaacccccccaaaaaaccccccccccccaaaaccccccccaaccaacccccccccccccccaaaccccaaaaaaccaagggmmmssssxxwwyyyyyyvvqqqlllccccccccc
|
||||||
|
abaccccccaaaaaaaaccaacaaaccaaaaaacccccaaaaaaaccccccccccccaaaaccccccccccaacccccccccccccccccaacccccaaaaaaaaaaggggmmmssssswwyywyyyyvvqqlllccccccccc
|
||||||
|
abaccccccaaaaaaaaacaaaaacccaaaaaacccccaaacaaaccccccccccccaaaaccccccccaaaaaaccccccccccccaacccccccaaaaaaaaaaaaggggmmmossswwyywwyyvvvqqqllccccccccc
|
||||||
|
abcccccccaaaaaaaaaacaaaaaacaaccccccccaaacccccccccccccccccccccccccccccaaaaaaccccccccccccaaaaacccaaaaaaaaaaaaaaggggoooosswwywwwwvvvvqqqmlccccccccc
|
||||||
|
abccccccccccaaacaaaaaaaaaacccccccccccaaacaccccccccccccccccccccccccccccaaaaccccccccccccaaaaaccccaaacaaacccaaacagggfooosswwwwwrvvvvqqqqmmccccccccc
|
||||||
|
abccccccccccaaacccaaaaaaaacccccccccaacaaaaacccccccccccccccccccccccccccaaaaccccccccccccaaaaaacccccccaaacccaaccccfffooosswwwwrrrrrqqqqqmmccccccccc
|
||||||
|
abccccccccccaacccccccaaccccccccccccaaaaaaaacccccccccccccaaccccccccccccaccaccccccccccccccaaaacccccccaacccccccccccfffoossrwrrrrrrrqqqqmmmccccccccc
|
||||||
|
abccaaaccccccccccccccaacccccccccccccaaaaaccccccccccccaacaacccccccaaaaacccccccccccccccccaacccccccccccccccccccccccfffoossrrrrrnnnmqqmmmmmccccccccc
|
||||||
|
abcaaaaccccccccccccccccccccccccccccccaaaaacccccccccccaaaaacccccccaaaaacccaaaccccccccccccccccccccccccccccccccccccfffooorrrrrnnnnmmmmmmmccccaacccc
|
||||||
|
abcaaaacccccccccccccccccccccccccccccaaacaaccccacccccccaaaaaaccccaaaaaaccccaaaccacccccccccccccccccccccccccccccccccffoooonnnnnnnnmmmmmmccccaaacccc
|
||||||
|
abccaaacccccccccccccccccccccaaaaaccccaaccccaaaacccccaaaaaaaaccccaaaaaaccccaaaaaaaccccccccccccccccaccaccccccccccccfffooonnnnnnddddddddcccaaaccccc
|
||||||
|
abccccccccccccccccccccccccccaaaaaccccccccccaaaaaacccaaaaacaacccaaaaaaaccaaaaaaaacccccccccccccccccaaaaccccccccccccfffeonnnnneddddddddddcaaacccccc
|
||||||
|
abccccccccccaaaccccccccccccaaaaaacccccccccccaaaacccccacaaacccccaacaacccaaaaaaaaacccccccccccccccccaaaacccccccccccccffeeeeeeeeddddddddcccaaacccccc
|
||||||
|
abcccccccccaaaaccccacccccccaaaaaaccccccccccaaaaacccccccaaaacccaaacaccccaaaaaaaaaccccccccccccccccaaaaaaccccccccccccceeeeeeeeedacccccccccccccccccc
|
||||||
|
abaccccccccaaaaccccaaacaaacaaaaaaccccccccccaacaaccccccccaaaacaaaacaaacaaaaaaaaaacccccccccccccaacaaaaaacccccccccccccceeeeeeeaaacccccccccccccccaaa
|
||||||
|
abaaacccccccaaaccccaaaaaaaccaaaccccccccaaacccccccccccccccaaaaaaaacaaaaaaaaaaaaaaacacaaccaaacaaacccaacccccccccccccccccaacccaaaacccccccccccccccaaa
|
||||||
|
abaaaccccccccccccccaaaaaaccccccccccccccaaacccccccccccccccaaaaaaaccaaaaaaccaacccaccaaaaccaaaaaaaccccccccaaccccccccccccccccccaaacccccccccccccccaaa
|
||||||
|
abaaccccccccccccccaaaaaaacccccccccccaaaaaaaaccccccccccccccaaaaaaaaaaaaaacaaaccccccaaaaaccaaaaaaccccccaaaaccccccccccccccccccaaaccccccccccccaaaaaa
|
||||||
|
abaaaccccccccccccaaaaaaaaaacccccccccaaaaaaaacccccccccccaaaaaaaaaaaaaaaaaaacccccccaaaaaacaaaaaaaaaccccaaaaaacccccccccccccccccccccccccccccccaaaaaa
|
||||||
|
abaaacccccccccaaaaaaccccccccccccccccaacccccccccccaacaaaaaaaaaaaaaaaaaccaaaaacccaaaaccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaa
|
||||||
|
abaaacccccccccaaaaaacccccccccccccccaaaaccccccccccaaaaaaaacaaaaaaaaaaaccaaaaaaccaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaa
|
||||||
|
abaaaccccccccccaaaaacccccccccccccccaaaacccccccccccaaaaacccaaaaaaaaaacccaaaaaacccaaccccccccccccccaaaaacccccccccccccccccccccccccccccccccccccaaaaaa
|
||||||
|
abccccaaccccccaaaaacccccccccaaaaaccaaaaccccccccccccaaaaacaaaaaaaaacccccaaaaaccccccccccccccccccccaaaaacccccccccccccccccaaaccccaaaccccccccccaaacaa
|
||||||
|
abcccaaaacccccaaaaacccccccccaaaaacccccccccccccccccaaacaaaaaaaaaacccccccaaaaacccccccccccccccccccaaaaaacccccccccccccccccaaaaccaaaaccccccccccccccaa
|
||||||
|
abcccaaaaacacccccccccccccccaaaaaaccccccccccccccccccaaccaaaaacaaaaccccccccccccccccccccccccccccccaaaaaaccccccccccccccccccaaaaaaaacccccccccccccccaa
|
||||||
|
abaaaaaaaaaacccccccccccccccaaaaaaccccccccccccccccccccccaaaacccaaaccccccccccccccccccccccccccccccaaaaaacccccccccccccccciiiiijaaaaccccccccccccccccc
|
||||||
|
abaaaaaaaaaacccccccccccccccaaaaaacccccccccccccccccccccccccccccaaacccccccccccccccccccccccccccccccaaaccccccccccccccccciiiiiijjjaccccccccaaaccccccc
|
||||||
|
abccaaaaaaccccccccccccccccccaaaccccccccccccccccccccccccccccccccacccccccccccaacccccccccccccccccccccccccccccccccccccciiiiioijjjjaaccccccaaaaaacccc
|
||||||
|
abccaaaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaacccccccccccccccccccccccccccccccccccciiinnooojjjjjaaccaaaaaaaacccc
|
||||||
|
abccaaaaaacccccccccccccccccccccccccccccccccccccaacccccaacccccccccccccccccaaaaaacccccccccccccccccccccccccccaaaccccciiinnnoooojjjjjjkkkaaaaaaacccc
|
||||||
|
abcaaaaaaaaccccccccccccccccccccccccccccccccccccaaaccaaaaaaccccaaacccccccccaaaacccccccccccccccccccccccccccccaaaaccciiinnnouooojjjjkkkkkaaaaaccccc
|
||||||
|
abccaccccccccccccccccccaaccccccaccccccccccccaaaaaaaaaaaaaacccaaaacccccccccaaaacccccccccccccccccccccccccccaaaaaacchhinnnttuuooooookkkkkkkaaaccccc
|
||||||
|
abccccccccccccccccccaacaaaccccaaaaaaaaccccccaaaaaaaacaaaaacccaaaacccccccccaccacccccccccccccccccccccccccccaaaaacchhhhnntttuuuooooppppkkkkcaaacccc
|
||||||
|
abccccccccaaacccccccaaaaaccccccaaaaaaccccccccaaaaaacaaaaaccccaaaaccccccccccccccccccccccccccccaccccccccccccaaaaahhhhnnntttxuuuooppppppkkkcccccccc
|
||||||
|
abccccccccaaaacccccccaaaaaaccccaaaaaaccaaacccaaaaaacaaaaaccccccccccccccaaccccccccccccccaaaaaaaacccccccccccaachhhhhnnnntttxxuuuuuuuupppkkkccccccc
|
||||||
|
abccccccccaaaacccccaaaaaaaacccaaaaaaaacaaacacaaaaaaccccccccccccccccccccaacccccccccccccccaaaaaacccccccccccccchhhhmnnnntttxxxxuuuuuuupppkkcccccccc
|
||||||
|
abacccccccaaaacccccaaaaacaaccaaaaaaaaaaaaaaaaaaccaacccccccccccccccccaaaaaaaaccccccccccccaaaaaaccccccccccccchhhhmmmntttttxxxxuyyyuvvpppklcccccccc
|
||||||
|
abacccccccccccccccccacaaaccaaaaaaaaaaaaaaaaaaaccccccccccccccccccccccaaaaaaaacccccccccccaaaaaaaaccccccccccccgghmmmtttttxxxxxxyyyyvvvpplllcccccccc
|
||||||
|
abaccccccccaacccccccccaaaccaaaaaaaacaaaaaaaaaaccccccccccccccccccccccccaaaaccccccccccccaaaaaaaaaaccccccaccccgggmmmtttxxxxxxxyyyyyvvppplllcccccccc
|
||||||
|
SbaaaccccccaaacaaaccccccccaaaaaaaaacaaaaaaaaacccccccccccccccccccccccccaaaaacccccccccccaaaaaaaaaaaaacaaaccaagggmmmtttxxxEzzzzyyyvvppplllccccccccc
|
||||||
|
abaacccccccaaaaaaacccccccaaaaaaacaaccaaaaaaaccccccccccccccaaaccccccccaaaaaacccccccccccacacaaacccaaaaaaacaaagggmmmsssxxxxxyyyyyvvvqqqlllccccccccc
|
||||||
|
abaccccccccaaaaaaccacccaaaaaaaaacccccccaaaaaaccccccccccccaaaaccccccccaaccaacccccccccccccccaaaccccaaaaaaccaagggmmmssssxxwwyyyyyyvvqqqlllccccccccc
|
||||||
|
abaccccccaaaaaaaaccaacaaaccaaaaaacccccaaaaaaaccccccccccccaaaaccccccccccaacccccccccccccccccaacccccaaaaaaaaaaggggmmmssssswwyywyyyyvvqqlllccccccccc
|
||||||
|
abaccccccaaaaaaaaacaaaaacccaaaaaacccccaaacaaaccccccccccccaaaaccccccccaaaaaaccccccccccccaacccccccaaaaaaaaaaaaggggmmmossswwyywwyyvvvqqqllccccccccc
|
||||||
|
abcccccccaaaaaaaaaacaaaaaacaaccccccccaaacccccccccccccccccccccccccccccaaaaaaccccccccccccaaaaacccaaaaaaaaaaaaaaggggoooosswwywwwwvvvvqqqmlccccccccc
|
||||||
|
abccccccccccaaacaaaaaaaaaacccccccccccaaacaccccccccccccccccccccccccccccaaaaccccccccccccaaaaaccccaaacaaacccaaacagggfooosswwwwwrvvvvqqqqmmccccccccc
|
||||||
|
abccccccccccaaacccaaaaaaaacccccccccaacaaaaacccccccccccccccccccccccccccaaaaccccccccccccaaaaaacccccccaaacccaaccccfffooosswwwwrrrrrqqqqqmmccccccccc
|
||||||
|
abccccccccccaacccccccaaccccccccccccaaaaaaaacccccccccccccaaccccccccccccaccaccccccccccccccaaaacccccccaacccccccccccfffoossrwrrrrrrrqqqqmmmccccccccc
|
||||||
|
abccaaaccccccccccccccaacccccccccccccaaaaaccccccccccccaacaacccccccaaaaacccccccccccccccccaacccccccccccccccccccccccfffoossrrrrrnnnmqqmmmmmccccccccc
|
||||||
|
abcaaaaccccccccccccccccccccccccccccccaaaaacccccccccccaaaaacccccccaaaaacccaaaccccccccccccccccccccccccccccccccccccfffooorrrrrnnnnmmmmmmmccccaacccc
|
||||||
|
abcaaaacccccccccccccccccccccccccccccaaacaaccccacccccccaaaaaaccccaaaaaaccccaaaccacccccccccccccccccccccccccccccccccffoooonnnnnnnnmmmmmmccccaaacccc
|
||||||
|
abccaaacccccccccccccccccccccaaaaaccccaaccccaaaacccccaaaaaaaaccccaaaaaaccccaaaaaaaccccccccccccccccaccaccccccccccccfffooonnnnnnddddddddcccaaaccccc
|
||||||
|
abccccccccccccccccccccccccccaaaaaccccccccccaaaaaacccaaaaacaacccaaaaaaaccaaaaaaaacccccccccccccccccaaaaccccccccccccfffeonnnnneddddddddddcaaacccccc
|
||||||
|
abccccccccccaaaccccccccccccaaaaaacccccccccccaaaacccccacaaacccccaacaacccaaaaaaaaacccccccccccccccccaaaacccccccccccccffeeeeeeeeddddddddcccaaacccccc
|
||||||
|
abcccccccccaaaaccccacccccccaaaaaaccccccccccaaaaacccccccaaaacccaaacaccccaaaaaaaaaccccccccccccccccaaaaaaccccccccccccceeeeeeeeedacccccccccccccccccc
|
||||||
|
abaccccccccaaaaccccaaacaaacaaaaaaccccccccccaacaaccccccccaaaacaaaacaaacaaaaaaaaaacccccccccccccaacaaaaaacccccccccccccceeeeeeeaaacccccccccccccccaaa
|
||||||
|
abaaacccccccaaaccccaaaaaaaccaaaccccccccaaacccccccccccccccaaaaaaaacaaaaaaaaaaaaaaacacaaccaaacaaacccaacccccccccccccccccaacccaaaacccccccccccccccaaa
|
||||||
|
abaaaccccccccccccccaaaaaaccccccccccccccaaacccccccccccccccaaaaaaaccaaaaaaccaacccaccaaaaccaaaaaaaccccccccaaccccccccccccccccccaaacccccccccccccccaaa
|
||||||
|
abaaccccccccccccccaaaaaaacccccccccccaaaaaaaaccccccccccccccaaaaaaaaaaaaaacaaaccccccaaaaaccaaaaaaccccccaaaaccccccccccccccccccaaaccccccccccccaaaaaa
|
||||||
|
abaaaccccccccccccaaaaaaaaaacccccccccaaaaaaaacccccccccccaaaaaaaaaaaaaaaaaaacccccccaaaaaacaaaaaaaaaccccaaaaaacccccccccccccccccccccccccccccccaaaaaa
|
||||||
87
src/Day12.hs
Normal file
87
src/Day12.hs
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
module Day12
|
||||||
|
( day12,
|
||||||
|
possibleStarts,
|
||||||
|
parseGrid,
|
||||||
|
findPath,
|
||||||
|
GridPoints (..),
|
||||||
|
Grid,
|
||||||
|
findBestPath
|
||||||
|
)
|
||||||
|
where
|
||||||
|
|
||||||
|
import Algorithm.Search (dijkstra)
|
||||||
|
import Data.Char (ord)
|
||||||
|
import Data.Map (Map)
|
||||||
|
import qualified Data.Map as Map
|
||||||
|
import Data.Maybe (mapMaybe)
|
||||||
|
import Data.Tuple (swap)
|
||||||
|
import Linear.V2 (V2 (..))
|
||||||
|
import Data.Sort (sortOn)
|
||||||
|
|
||||||
|
type Pos = V2 Int
|
||||||
|
|
||||||
|
type Grid = Map Pos Char
|
||||||
|
|
||||||
|
data GridPoints = GridPoints { _start :: Pos, _end :: Pos }
|
||||||
|
deriving (Show, Eq)
|
||||||
|
|
||||||
|
parseGrid :: String -> (GridPoints, Grid)
|
||||||
|
parseGrid input =
|
||||||
|
( GridPoints
|
||||||
|
{ _start = inverseGrid Map.! 'S',
|
||||||
|
_end = inverseGrid Map.! 'E'
|
||||||
|
},
|
||||||
|
Map.fromList grid
|
||||||
|
)
|
||||||
|
where
|
||||||
|
rows = zip [0 ..] $ lines input
|
||||||
|
grid = concatMap (uncurry colsForRow) rows
|
||||||
|
inverseGrid = Map.fromList $ map swap grid
|
||||||
|
|
||||||
|
colsForRow :: Int -> String -> [(Pos, Char)]
|
||||||
|
colsForRow r = zipWith makePos [0 ..]
|
||||||
|
where
|
||||||
|
makePos c height = (V2 r c, height)
|
||||||
|
|
||||||
|
findPath :: Grid -> GridPoints -> Maybe (Int, [Pos])
|
||||||
|
findPath grid GridPoints {_start = start, _end = end} =
|
||||||
|
dijkstra (neighbors grid) (const . const 1) solutionFound start
|
||||||
|
where
|
||||||
|
solutionFound = (==) end
|
||||||
|
|
||||||
|
neighbors :: Grid -> Pos -> [Pos]
|
||||||
|
neighbors grid pos = filter (canMove grid pos) possiblePositions
|
||||||
|
where
|
||||||
|
directions = [V2 1 0, V2 (-1) 0, V2 0 1, V2 0 (-1)]
|
||||||
|
possiblePositions = map (+ pos) directions
|
||||||
|
|
||||||
|
canMove :: Grid -> Pos -> Pos -> Bool
|
||||||
|
canMove grid from p = case grid Map.!? p of
|
||||||
|
Just c -> asHeight c <= (currentHeight + 1)
|
||||||
|
Nothing -> False
|
||||||
|
where
|
||||||
|
asHeight 'S' = asHeight 'a'
|
||||||
|
asHeight 'E' = asHeight 'z'
|
||||||
|
asHeight x = ord x - ord 'a'
|
||||||
|
currentHeight = asHeight $ grid Map.! from
|
||||||
|
|
||||||
|
possibleStarts :: Grid -> [Pos]
|
||||||
|
possibleStarts grid = map fst $ filter (\(_, v) -> v == 'a') (Map.toList grid)
|
||||||
|
|
||||||
|
findBestPath :: Grid -> GridPoints -> (Int, [Pos])
|
||||||
|
findBestPath grid points = fastest
|
||||||
|
where
|
||||||
|
starts = possibleStarts grid
|
||||||
|
newPoints = [points { _start = s} | s <- starts]
|
||||||
|
allPaths = mapMaybe (findPath grid) newPoints
|
||||||
|
fastest = head $ sortOn fst allPaths
|
||||||
|
|
||||||
|
day12 :: IO ()
|
||||||
|
day12 = do
|
||||||
|
input <- readFile "ressources/day12-input"
|
||||||
|
putStrLn "Day12"
|
||||||
|
let (positions, grid) = parseGrid input
|
||||||
|
let path = findPath grid positions
|
||||||
|
putStrLn ("Cost and path : " ++ show path)
|
||||||
|
let fastest = findBestPath grid positions
|
||||||
|
putStrLn ("Cost and path for nices route: " ++ show fastest)
|
||||||
@@ -13,9 +13,10 @@ import Day8 (day8)
|
|||||||
import Day9 (day9)
|
import Day9 (day9)
|
||||||
import Day10 (day10)
|
import Day10 (day10)
|
||||||
import Day11 (day11)
|
import Day11 (day11)
|
||||||
|
import Day12 (day12)
|
||||||
|
|
||||||
days :: [IO ()]
|
days :: [IO ()]
|
||||||
days = [day1, day2, day3, day4, day5, day6, day7, day8, day9, day10, day11]
|
days = [day1, day2, day3, day4, day5, day6, day7, day8, day9, day10, day11, day12]
|
||||||
|
|
||||||
sep :: IO ()
|
sep :: IO ()
|
||||||
sep = putStrLn "---------"
|
sep = putStrLn "---------"
|
||||||
|
|||||||
30
test/Day12Spec.hs
Normal file
30
test/Day12Spec.hs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
{-# LANGUAGE QuasiQuotes #-}
|
||||||
|
|
||||||
|
module Day12Spec (spec) where
|
||||||
|
|
||||||
|
import Day12
|
||||||
|
import Test.Hspec
|
||||||
|
import Text.Heredoc
|
||||||
|
import Data.Maybe (fromJust, isJust)
|
||||||
|
|
||||||
|
testInput :: String
|
||||||
|
testInput = [str|Sabqponm
|
||||||
|
|abcryxxl
|
||||||
|
|accszExk
|
||||||
|
|acctuvwj
|
||||||
|
|abdefghi
|
||||||
|
|]
|
||||||
|
|
||||||
|
spec :: Spec
|
||||||
|
spec =
|
||||||
|
describe "Day12" $ do
|
||||||
|
describe "Part1" $ do
|
||||||
|
it "finds a path" $ do
|
||||||
|
let (points, grid) = parseGrid testInput
|
||||||
|
let result = findPath grid points
|
||||||
|
isJust result `shouldBe` True
|
||||||
|
fst (fromJust result) `shouldBe` 31
|
||||||
|
it "finds shortest paths from all lowest points" $ do
|
||||||
|
let (points, grid) = parseGrid testInput
|
||||||
|
let fastest = findBestPath grid points
|
||||||
|
fst fastest `shouldBe` 29
|
||||||
Reference in New Issue
Block a user