diff --git a/day3/main.hs b/day3/main.hs index e05950f..29c35da 100755 --- a/day3/main.hs +++ b/day3/main.hs @@ -43,11 +43,12 @@ line a b = Position 0 0 : [ Position (x*a) (x*b) | x <- [1..] ] -- SquareSortEmpty or SquareSortTree data SquareSort = SquareSortTree | SquareSortEmpty + deriving Eq instance Show SquareSort where show SquareSortTree = "#" - show SquareSortEmpty = "." + show SquareSortEmpty = "_" char2ss :: Char -> Maybe SquareSort char2ss '#' = Just SquareSortTree @@ -61,7 +62,7 @@ newtype Grid = Grid [[SquareSort]] instance Show (Grid) where - show (Grid x) = intersperse '\n' $ map show x + show (Grid x) = concat $ intersperse "\n" $ map show x parseInput :: [String] -> Maybe Grid parseInput x = Grid <$> sequence ( (map str2sss) x ) @@ -72,10 +73,48 @@ getSquareSortAtPosition (Grid grid) (Position x y) = where n = length (grid !! 0) +solveDay3Part1 :: Grid -> (Int,Int) -> Int +solveDay3Part1 grid@(Grid lx) (x',y')= + length $ filter (== SquareSortTree) $ map (getSquareSortAtPosition grid) px + where + px = take n $ line x' y' + n = (length lx) `div` y' + +-- Determine the number of trees you would encounter if, for each of the +-- following slopes, you start at the top-left corner and traverse the map all +-- the way to the bottom: +-- +-- - Right 1, down 1. +-- - Right 3, down 1. (This is the slope you already checked.) +-- - Right 5, down 1. +-- - Right 7, down 1. +-- - Right 1, down 2. +-- +-- What do you get if you multiply together the number of trees encountered on +-- each of the listed slopes? + +solveDay3Part2 :: Grid -> Int +solveDay3Part2 grid = + foldl (*) 1 [ solveDay3Part1 grid (1,1) + , solveDay3Part1 grid (3,1) + , solveDay3Part1 grid (5,1) + , solveDay3Part1 grid (7,1) + , solveDay3Part1 grid (1,2) + ] + main :: IO () main = do putStrLn "Day 3 - Part 1" + inputData <- readFile "day3/input" print $ take 5 $ line 3 1 + print $ take 5 $ line 7 1 let (Just parsedTestData) = parseInput testData print parsedTestData - print $ getSquareSortAtPosition parsedTestData (Position 3 0) + print $ getSquareSortAtPosition parsedTestData (Position 10 10) + let (Just parsedInputData) = parseInput (lines inputData) + putStrLn "Part 1:" + print $ solveDay3Part1 parsedTestData (3,1) + print $ solveDay3Part1 parsedInputData (3,1) + putStrLn "Part 2:" + print $ solveDay3Part2 parsedTestData -- This gives the right answer, but + print $ solveDay3Part2 parsedInputData -- This gives the wrong answer :s