diff --git a/Day10/puzzle1.hs b/Day10/puzzle1.hs new file mode 100644 index 0000000..a965a2c --- /dev/null +++ b/Day10/puzzle1.hs @@ -0,0 +1,30 @@ +import Data.List (sort) +import Data.Char (digitToInt) +import Data.List.Split (chunksOf) +import Data.Graph (graphFromEdges, path, vertices) + +type Coords = (Int, Int) +type V = (String, Int) + +getValue :: [[V]] -> (Int, Int) -> V +getValue grid (i, j) = grid !! i !! j + +getEdges :: [[V]] -> Coords -> [Int] +getEdges grid (i, j) = let value = fst $ grid !! i !! j + adjI = filter (\x -> fst x >= 0 && fst x < length grid && snd x >= 0 && snd x < length (head grid)) [ (i, j + 1), (i + 1, j), (i, j - 1), (i - 1, j) ] + in [ snd x | x <- map (getValue grid) adjI, digitToInt (head value) == digitToInt (head (fst x)) - 1 ] + +listVertices :: [String] -> [[V]] +listVertices grid = let l = length $ head grid + in chunksOf l $ zip (map (:[]) (concat grid)) [0..] + +main = do + contents <- lines <$> readFile "day10.txt" + let grid = listVertices contents + edgeCoords = sort [ (x, y) | x <- [0..length grid -1], y <- [0..length (head grid) - 1] ] + edgeList = [ (x, y, z) | ((x, y), z) <- zip (concat grid) (map (getEdges grid) edgeCoords) ] + (graph, nodeFromVertex, _) = graphFromEdges edgeList + startList = [ x | (_, x, _) <- filter (\(x, _, _) -> x == "0") $ map nodeFromVertex $ vertices graph ] + endList = [ x | (_, x, _) <- filter (\(x, _, _) -> x == "9") $ map nodeFromVertex $ vertices graph ] + paths = filter id $ [ path graph x y | x <- startList, y <- endList ] + print $ length paths