day 12
parent
b7367da63b
commit
1bb65f20b4
@ -0,0 +1,5 @@
|
||||
Sabqponm
|
||||
abcryxxl
|
||||
accszExk
|
||||
acctuvwj
|
||||
abdefghi
|
@ -0,0 +1,41 @@
|
||||
abcccccccccaaaaaaaaaaccccccccccccaaaaaaaaccaaccccccccccccccccccccccccccccccccccccccccccccaaaaaa
|
||||
abccccccccccaaaaaaaaaccccccccccccaaaaaaaaaaaacccccccccccaacccacccccccccccccccccccccccccccaaaaaa
|
||||
abcccccccccccaaaaaaacccccccccccccaaaaaaaaaaaaaacccccccccaaacaacccccccccaaaccccccccccccccccaaaaa
|
||||
abccccccccccaaaaaaccccccccccccccaaaaaaaaaaaaaaaccccccccccaaaaaccccccccccaaacccccccccccccccccaaa
|
||||
abccccccccccaaaaaaaccccccccccccaaaaaaaaaaaaaacccccccccccaaaaaacccccccccaaaacccccccccccccccccaac
|
||||
abaaccaaccccaaccaaaccccccccaaaaaaaaaaaaaaacaaccccccccccaaaaaaaacccccccccaaalcccccccccccccccaaac
|
||||
abaaaaaacccccccccaaccccccccaaaaaacccaaaacccaaccccccccccaaaaaaaaccccccccalllllllcccccccccccccccc
|
||||
abaaaaaacccccccaaacccccccccaaaaccccccaaaccccaaaaacccccccccaacccccccaaaakllllllllcccccccaacccccc
|
||||
abaaaaaacccccccaaaacccccccccaacccccccaaaccccaaaaacccccccccaacccccccaakkklllpllllccccacaaacccccc
|
||||
abaaaaaaaccccccaaaaccccaaccccccccccccccccccaaaaaaccccccccccccccccccckkkkpppppplllcccaaaaaaacccc
|
||||
abaaaaaaacaaaccaaaaccaaaaaaccccccccccccccccaaaaaacccccccaaaccccckkkkkkkpppppppplllcddaaaaaacccc
|
||||
abcaaaacccaacccccccccaaaaaacccccaaaccccccccaaaaaacccccccaaaaccjkkkkkkkpppppuppplmmdddddaaaccccc
|
||||
abccaaaaaaaaaccccccccaaaaaaccccaaaaaacccccccaaacccccccccaaaajjjkkkkkrpppuuuuupppmmmdddddacccccc
|
||||
abccccaaaaaaaacccccccaaaaacccccaaaaaacccccccccccccccccccaaacjjjjrrrrrrppuuuuupqqmmmmmddddaccccc
|
||||
abccccaaaaaaaaacccccccaaaacccccaaaaaaccccccccccccccccccccccjjjrrrrrrrrpuuuxuvvqqqmmmmmddddccccc
|
||||
abccccaaaaaaaaacccccccccccccccccaaaaaccccaacccaccccccccaaccjjjrrrruuuuuuuxxyvvqqqqqmmmmmdddcccc
|
||||
abccccaaaaaaaacccccccccaaaccccccaacaaccccaaacaacccaaacaaaccjjjrrrtuuuuuuuxxyvvvqqqqqmmmmdddcccc
|
||||
abccaaaaaaaacccccccccccaaaaaccccccccccccccaaaaacccaaaaaaaccjjjrrttttxxxxxxyyvvvvvqqqqmmmmdeeccc
|
||||
abccaaaccaaaccccccccaacaaaaacccccccccccccaaaaaacccaaaaaacccjjjrrtttxxxxxxxyyvvvvvvvqqqmmmeeeccc
|
||||
abaaaaaaaaaacccaaaccaaaaaaaaaaaccaaaccccaaaaaaaacccaaaaaaaajjjqqrttxxxxxxxyyyyyyvvvqqqnnneeeccc
|
||||
SbaaaaaaaaccccaaaaccaaaaaaaaaaaaaaaaacccaaaaaaaaccaaaaaaaaacjjjqqtttxxxxEzzyyyyvvvvqqqnnneeeccc
|
||||
abcaaaaaacccccaaaaccccaaaaaaaccaaaaaaccccccaaccccaaaaaaaaaaciiiqqqtttxxxyyyyyyvvvvrrrnnneeecccc
|
||||
abcaaaaaacccccaaaacccaaaaaaaaccaaaaaaccccccaaccccaaacaaacccciiiqqqqttxxyyyyyywvvvrrrnnneeeecccc
|
||||
abcaaaaaaccccccccccccaaaaaaaaacaaaaacccccccccccccccccaaaccccciiiqqtttxxyyyyyywwrrrrnnnneeeccccc
|
||||
abcaaacaacccccaacccccaaaaaaaaacaaaaacccccccccccccccccaaaccccciiiqqttxxxywwyyywwrrrnnnneeecccccc
|
||||
abccccccccaaacaaccccccccccacccccccccccccccccccccccccccccccccciiqqqttxxwwwwwwywwrrrnnneeeccccccc
|
||||
abccaacccccaaaaaccccccccccccccccccccccccccccccccccccccccaacaaiiqqqttwwwwsswwwwwrrrnnfffeccccccc
|
||||
abaaaaccccccaaaaaacccccccccccccccccccccccccccccaaaccccccaaaaaiiqqqttssssssswwwwrrronfffaccccccc
|
||||
abaaaaaacccaaaaaaacccccccccccccccccccccccccccaaaaaacccccaaaaaiiqqqssssssssssswrrrooofffaaaacccc
|
||||
abaaaaaaccaaaaaacccccccccccccccccccccccccccccaaaaaacccccaaaaaiiqqqppssspppssssrrrooofffaaaacccc
|
||||
abaaaaaaccaacaaacccccccccccccccccccccccccccccaaaaaacccccaaaaaiihpppppppppppossrrooofffaaaaacccc
|
||||
abaaaaccccccccaacccccccccccccccccccccccccccccaaaaaccccccccaaahhhhppppppppppoooooooofffaaaaccccc
|
||||
abaaaaccccccccccaacccccccccccccccccaaacccccccaaaaacccccccccccchhhhhhhhhhggpoooooooffffaaaaccccc
|
||||
abccaacccccccacaaaccccccccccccccccaaaaacccccccccccccccccccccccchhhhhhhhhggggoooooffffaacaaacccc
|
||||
abccccccccccaaaaacaaccccccccccccccaaaaaccccccccccccccccccccccccchhhhhhhhggggggggggffcaacccccccc
|
||||
abccccccccccaaaaaaaaccccccccccccccaaaacccaacccccccccccaccccccccccccccaaaaaggggggggfcccccccccccc
|
||||
abccccccccccccaaaaaccccaacccccccccaaaacaaaaccccccccaaaaccccccccccccccaaaacaaagggggcccccccccaccc
|
||||
abcccccccccccaaaaacccccaacccccccccaaaaaaaaaccccccccaaaaaaccccccccccccaaaccaaaacccccccccccccaaac
|
||||
abcccccccccccaacaaccaaaaaaaacccaaaaaaaaaaaccccccccccaaaaccccccccccccccaccccaaacccccccccccccaaaa
|
||||
abccccccccccccccaaccaaaaaaaaccaaaaaaaaaaaccccccccccaaaaacccccccccccccccccccccacccccccccccccaaaa
|
||||
abccccccccccccccccccccaaaaacccaaaaaaaaaaaacccccccccaacaacccccccccccccccccccccccccccccccccaaaaaa
|
@ -0,0 +1,77 @@
|
||||
module Day12Lib
|
||||
( --
|
||||
processInput1,
|
||||
processInput2,
|
||||
)
|
||||
where
|
||||
|
||||
import Data.Array
|
||||
import Data.Char
|
||||
import Data.PQueue.Prio.Min
|
||||
( MinPQueue, fromList, singleton, union, deleteFindMin )
|
||||
import Debug.Trace
|
||||
|
||||
bfs :: Array (Int, Int) Int -> Array (Int, Int) Bool -> MinPQueue Int [(Int, Int)] -> (Int -> Int -> Bool) -> ((Int, Int) -> Bool) -> Int
|
||||
bfs mp visited queue isValidNeighbor isEnd =
|
||||
let ((_, p@(x, y) : path), queueTail) = deleteFindMin queue
|
||||
neigh = generateNeighbors mp visited p (isValidNeighbor (mp ! p))
|
||||
in if or [isEnd n | n <- neigh]
|
||||
then length path + 1
|
||||
else
|
||||
bfs
|
||||
mp
|
||||
(visited // [(n, True) | n <- neigh])
|
||||
(queueTail `union` fromList [(length path + 2, x : p : path) | x <- neigh])
|
||||
isValidNeighbor
|
||||
isEnd
|
||||
|
||||
inBounds :: (Ord a1, Ord a2) => (a1, a2) -> ((a1, a2), (a1, a2)) -> Bool
|
||||
inBounds (x, y) ((xmin, ymin), (xmax, ymax)) = x >= xmin && x <= xmax && y >= ymin && y <= ymax
|
||||
|
||||
neighborCoordinates :: (Num a1, Num a2) => (a1, a2) -> [(a1, a2)]
|
||||
neighborCoordinates (x, y) = [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]
|
||||
|
||||
generateNeighbors :: Array (Int, Int) Int -> Array (Int, Int) Bool -> (Int, Int) -> (Int -> Bool) -> [(Int, Int)]
|
||||
generateNeighbors mp visited p@(x, y) isValidNeighbor =
|
||||
[ n | n <- neighborCoordinates p, n `inBounds` bounds mp
|
||||
&& not (visited ! n)
|
||||
&& isValidNeighbor (mp ! n)
|
||||
]
|
||||
|
||||
elevation :: Char -> Int
|
||||
elevation 'S' = 0
|
||||
elevation 'E' = ord 'z' - ord 'a'
|
||||
elevation c = ord c - ord 'a'
|
||||
|
||||
-- ####################
|
||||
|
||||
processInput1 :: String -> Int
|
||||
processInput1 input =
|
||||
let l = lines input
|
||||
h = length l
|
||||
w = length (head l)
|
||||
mp = listArray ((0, 0), (h - 1, w - 1)) (concat l)
|
||||
p = head [i | (i, e) <- assocs mp, e == 'S']
|
||||
e = head [i | (i, e) <- assocs mp, e == 'E']
|
||||
ele = array (bounds mp) [(i, elevation e) | (i, e) <- assocs mp]
|
||||
in bfs
|
||||
ele
|
||||
(listArray ((0, 0), (h - 1, w - 1)) [(i, j) == p | i <- [0 .. h - 1], j <- [0 .. w - 1]])
|
||||
(singleton 1 [p])
|
||||
(\x y -> y - x <= 1)
|
||||
(== e)
|
||||
|
||||
processInput2 :: String -> Int
|
||||
processInput2 input =
|
||||
let l = lines input
|
||||
h = length l
|
||||
w = length (head l)
|
||||
mp = listArray ((0, 0), (h - 1, w - 1)) (concat l)
|
||||
e = head [i | (i, e) <- assocs mp, e == 'E']
|
||||
ele = array (bounds mp) [(i, elevation e) | (i, e) <- assocs mp]
|
||||
in bfs
|
||||
ele
|
||||
(listArray ((0, 0), (h - 1, w - 1)) [(i, j) == e | i <- [0 .. h - 1], j <- [0 .. w - 1]])
|
||||
(singleton 1 [e])
|
||||
(\x y -> x - y <= 1)
|
||||
(\p -> ele ! p == 0)
|
@ -0,0 +1,41 @@
|
||||
import Day12Lib (processInput1, processInput2)
|
||||
import System.IO
|
||||
import Test.HUnit
|
||||
|
||||
testCases1 =
|
||||
[ ("data/input120.txt", 31),
|
||||
("data/input121.txt", 420)
|
||||
]
|
||||
|
||||
testCase1 (file, result) = do
|
||||
withFile
|
||||
file
|
||||
ReadMode
|
||||
( \handle -> do
|
||||
contents <- hGetContents handle
|
||||
assertEqual "input test" result $ processInput1 contents
|
||||
)
|
||||
|
||||
testCases2 =
|
||||
[ ("data/input120.txt", 29),
|
||||
("data/input121.txt", 414)
|
||||
]
|
||||
|
||||
testCase2 (file, result) = do
|
||||
withFile
|
||||
file
|
||||
ReadMode
|
||||
( \handle -> do
|
||||
contents <- hGetContents handle
|
||||
assertEqual ("input test: " ++ file) result $ processInput2 contents
|
||||
)
|
||||
|
||||
tests =
|
||||
TestList $
|
||||
[TestCase (testCase1 c) | c <- testCases1]
|
||||
++ [TestCase (testCase2 c) | c <- testCases2]
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
runTestTT tests
|
||||
return ()
|
Loading…
Reference in New Issue