diff --git a/5/solution.hs b/5/solution.hs index 0ee9cad..ac4d18a 100644 --- a/5/solution.hs +++ b/5/solution.hs @@ -1,9 +1,17 @@ import Data.List +import Data.List.Split import Control.Monad (join) import Control.Concurrent main :: IO () -main = readFile "5/riley.txt" >>= print . solve . parse . lines +main = do + input <- readFile "5/example.txt" + let x = parse $ lines input + print $ f x + print $ g x + where + f = length . nub . solve . filter (not . diagonal) + g = length . nub . solve parse :: [String] -> [(Point,Point)] parse = map (parseLine . words) @@ -16,7 +24,7 @@ parseLine [ s, "->", e ] = (a, b) toRange :: (Point,Point) -> [Point] toRange (a @ (xa,ya), b @ (xb,yb)) | diagonal (a,b) = makeDiagonal a b - | otherwise = [ (x,y) | x <- [ x1 .. x2 ], y <- [ y1 .. y2 ] ] + | otherwise = [ (x,y) | x <- [ x1 .. x2 ], y <- [ y1 .. y2 ] ] where x1 = min xa xb x2 = max xa xb @@ -26,16 +34,11 @@ toRange (a @ (xa,ya), b @ (xb,yb)) parseCoord :: String -> (Int,Int) parseCoord l = (head n, last n) where - n = map read $ words [ if c == ',' then ' ' else c | c <- l ] + n = map read . wordsBy (== ',') $ l -solve :: [(Point,Point)] -> (Int,Int) -solve i = (f i, g i) - where f = length . nub . overlapping . filter (not . diagonal) - g = length . nub . overlapping - -overlapping :: [(Point, Point)] -> [Point] -overlapping [_] = [] -overlapping (p:ps) = overlapping' p ps ++ overlapping ps +solve :: [(Point, Point)] -> [Point] +solve [_] = [] +solve (p:ps) = overlapping' p ps ++ solve ps overlapping' :: (Point, Point) -> [(Point, Point)] -> [Point] overlapping' _ [] = [] diff --git a/shell.nix b/shell.nix index 5c2def8..163e2a3 100644 --- a/shell.nix +++ b/shell.nix @@ -1,7 +1,8 @@ { pkgs ? import {} }: pkgs.mkShell { nativeBuildInputs = with pkgs; [ haskell-language-server - cabal-install - ghc + (ghc.withPackages (pkgs: with pkgs; [ + split + ])) ]; }