diff --git a/day-08-haskell/day08-haskell.cabal b/day-08-haskell/day08-haskell.cabal index 3cacd12..46b2ecb 100644 --- a/day-08-haskell/day08-haskell.cabal +++ b/day-08-haskell/day08-haskell.cabal @@ -29,6 +29,7 @@ library build-depends: base >=4.7 && <5 , containers + , flow default-language: Haskell2010 executable day08-haskell-exe diff --git a/day-08-haskell/package.yaml b/day-08-haskell/package.yaml index 914d5b6..8370ca4 100644 --- a/day-08-haskell/package.yaml +++ b/day-08-haskell/package.yaml @@ -25,6 +25,7 @@ library: source-dirs: src dependencies: - containers + - flow executables: day08-haskell-exe: diff --git a/day-08-haskell/src/Common.hs b/day-08-haskell/src/Common.hs index bb93bee..f7c1d10 100644 --- a/day-08-haskell/src/Common.hs +++ b/day-08-haskell/src/Common.hs @@ -2,6 +2,7 @@ module Common where import Data.Foldable (toList) import qualified Data.Map.Strict as Map +import Flow multiMapFromList :: Ord k => [(k, v)] -> Map.Map k [v] multiMapFromList = Map.fromListWith (++) . map (\(k, v) -> (k, [v])) @@ -20,10 +21,10 @@ enumerate :: [a] -> [(Int, a)] enumerate = zip [0..] readWorld :: String -> World -readWorld input = (determineSize $ lines input, readAntennas input) +readWorld input = (lines input |> determineSize, readAntennas input) where determineSize :: [String] -> Position - determineSize ls = (maximum $ map length ls, length ls) + determineSize ls = (map length ls |> maximum, length ls) readAntennas :: String -> [Antenna] readAntennas input = enumerate (lines input) >>= readLine diff --git a/day-08-haskell/src/Task1.hs b/day-08-haskell/src/Task1.hs index 57a5a97..95d8d5f 100644 --- a/day-08-haskell/src/Task1.hs +++ b/day-08-haskell/src/Task1.hs @@ -4,10 +4,11 @@ import Common (Position, readWorld, multiMapFromList, pairPermutations) import qualified Data.Map.Strict as Map import qualified Data.Set as Set import Control.Monad (join) +import Flow task1 :: String -> Int task1 input = case readWorld input of - ((width, height), antennas) -> length $ Set.fromList $ filter isInWorld $ join $ map antinodesOfFrequency $ Map.elems $ multiMapFromList antennas + ((width, height), antennas) -> multiMapFromList antennas |> Map.elems |> map antinodesOfFrequency |> join |> filter isInWorld |> Set.fromList |> length where antinodesOfFrequency :: [Position] -> [Position] antinodesOfFrequency nodes = pairPermutations nodes >>= antinodesOfPair diff --git a/day-08-haskell/src/Task2.hs b/day-08-haskell/src/Task2.hs index 461a500..54f8154 100644 --- a/day-08-haskell/src/Task2.hs +++ b/day-08-haskell/src/Task2.hs @@ -4,10 +4,11 @@ import Common (Position, readWorld, multiMapFromList, pairPermutations) import qualified Data.Map.Strict as Map import qualified Data.Set as Set import Control.Monad (join) +import Flow task2 :: String -> Int task2 input = case readWorld input of - ((width, height), antennas) -> length $ Set.fromList $ join $ map antinodesOfFrequency $ Map.elems $ multiMapFromList antennas + ((width, height), antennas) -> multiMapFromList antennas |> Map.elems |> map antinodesOfFrequency |> join |> Set.fromList |> length where antinodesOfFrequency :: [Position] -> [Position] antinodesOfFrequency nodes = pairPermutations nodes >>= antinodesOfPair @@ -19,7 +20,7 @@ task2 input = case readWorld input of in castInWorld a (-diffX, -diffY) ++ castInWorld b (diffX, diffY) castInWorld (sx, sy) (ox, oy) = - takeWhile isInWorld $ map (\f -> (sx + ox * f, sy + oy * f)) [0..] + map (\f -> (sx + ox * f, sy + oy * f)) [0..] |> takeWhile isInWorld isInWorld :: Position -> Bool isInWorld (x, y)