diff --git a/Day4/puzzle1.hs b/Day4/puzzle1.hs index 2c8f336..8be62d7 100644 --- a/Day4/puzzle1.hs +++ b/Day4/puzzle1.hs @@ -13,8 +13,8 @@ countOccurrences word text = sum (map (countOccurrences' word) text) + sum (map diags = diagonals text countOccurrences' _ [] = 0 countOccurrences' word text@(_:rest) = if word `isPrefixOf` text - then 1 + countOccurrences' word rest - else countOccurrences' word rest + then 1 + countOccurrences' word rest + else countOccurrences' word rest main = do contents <- lines <$> readFile "day4.txt" diff --git a/Day4/puzzle2.hs b/Day4/puzzle2.hs index b770b8c..7a606ac 100644 --- a/Day4/puzzle2.hs +++ b/Day4/puzzle2.hs @@ -2,16 +2,16 @@ import Data.List (transpose, isPrefixOf, tails) diagonals :: [String] -> [String] diagonals xs = diagonals' xs ++ diagonals' ((transpose . reverse) xs) - where diagonals' xs = transpose (zipWith drop [0..] xs) - ++ transpose (zipWith drop [1..] (transpose xs)) + where diagonals' xs = transpose (zipWith drop [0..] xs) + ++ transpose (zipWith drop [1..] (transpose xs)) countOccurrences :: String -> [String] -> Int countOccurrences word text = sum (map (countOccurrences' word) diags) + sum (map (countOccurrences' word . reverse) diags) - where diags = diagonals text - countOccurrences' _ [] = 0 - countOccurrences' word text@(_:rest) = if word `isPrefixOf` text - then 1 + countOccurrences' word rest - else countOccurrences' word rest + where diags = diagonals text + countOccurrences' _ [] = 0 + countOccurrences' word text@(_:rest) = if word `isPrefixOf` text + then 1 + countOccurrences' word rest + else countOccurrences' word rest submatricesVert :: Int -> [String] -> [[String]] submatricesVert _ [] = [] diff --git a/Day5/puzzle2.hs b/Day5/puzzle2.hs index 1f1f099..a0602d6 100644 --- a/Day5/puzzle2.hs +++ b/Day5/puzzle2.hs @@ -12,9 +12,9 @@ getMiddle xs = xs !! (length xs `div` 2) sortOnRules :: [(Int, Int)] -> [Int] -> [Int] sortOnRules _ [] = [] sortOnRules rules (x:xs) = sortOnRules rules beforeArray ++ [x] ++ sortOnRules rules afterArray - where afterArray = xs \\ before - beforeArray = xs \\ afterArray - before = [ p | (p, n) <- rules, n == x ] + where afterArray = xs \\ before + beforeArray = xs \\ afterArray + before = [ p | (p, n) <- rules, n == x ] main = do contents <- map (splitOn "|") . lines <$> readFile "day5.txt" diff --git a/Day6/puzzle1.hs b/Day6/puzzle1.hs index 95e79c9..088be10 100644 --- a/Day6/puzzle1.hs +++ b/Day6/puzzle1.hs @@ -13,8 +13,8 @@ getDirection '<' = L getStartPosition:: Char -> Grid -> Position getStartPosition c grid = (x, y) - where x = fromMaybe (-1) . elemIndex True . map (isJust . elemIndex c) $ grid - y = if x == -1 then -1 else fromMaybe (-1) . elemIndex c $ grid !! x + where x = fromMaybe (-1) . elemIndex True . map (isJust . elemIndex c) $ grid + y = if x == -1 then -1 else fromMaybe (-1) . elemIndex c $ grid !! x getGridVal :: Position -> Grid -> Char getGridVal (x, y) grid = (grid !! x) !! y @@ -26,23 +26,23 @@ getNextPosition :: Position -> Direction -> Grid -> (Position, Direction) getNextPosition (x, y) U grid = let newPos = (x - 1, y) gridVal = getGridVal newPos grid in if newPos `isInside` grid && gridVal == '#' - then getNextPosition (x, y) R grid - else (newPos, U) + then getNextPosition (x, y) R grid + else (newPos, U) getNextPosition (x, y) R grid = let newPos = (x, y + 1) gridVal = getGridVal newPos grid in if newPos `isInside` grid && gridVal == '#' - then getNextPosition (x, y) D grid - else (newPos, R) + then getNextPosition (x, y) D grid + else (newPos, R) getNextPosition (x, y) D grid = let newPos = (x + 1, y) gridVal = getGridVal newPos grid in if newPos `isInside` grid && gridVal == '#' - then getNextPosition (x, y) L grid - else (newPos, D) + then getNextPosition (x, y) L grid + else (newPos, D) getNextPosition (x, y) L grid = let newPos = (x, y - 1) gridVal = getGridVal newPos grid in if newPos `isInside` grid && gridVal == '#' - then getNextPosition (x, y) U grid - else (newPos, L) + then getNextPosition (x, y) U grid + else (newPos, L) markVisited :: Position -> Char -> Grid -> Grid markVisited (x, y) c grid = let row = grid !! x @@ -53,8 +53,8 @@ visitGrid :: Position -> Direction -> Grid -> Grid visitGrid (x, y) direction grid = let newGrid = markVisited (x, y) 'X' grid (nextPosition, newDirection) = getNextPosition (x, y) direction grid in if nextPosition `isInside` newGrid - then visitGrid nextPosition newDirection newGrid - else newGrid + then visitGrid nextPosition newDirection newGrid + else newGrid main = do contents <- lines <$> readFile "day6.txt" diff --git a/Day6/puzzle2.hs b/Day6/puzzle2.hs index b93409d..7e226bb 100644 --- a/Day6/puzzle2.hs +++ b/Day6/puzzle2.hs @@ -19,8 +19,8 @@ printDirection L = '<' getStartPosition :: Char -> Grid -> Position getStartPosition c grid = (x, y) - where x = fromMaybe (-1) . elemIndex True . map (isJust . elemIndex c) $ grid - y = if x == -1 then -1 else fromMaybe (-1) . elemIndex c $ grid !! x + where x = fromMaybe (-1) . elemIndex True . map (isJust . elemIndex c) $ grid + y = if x == -1 then -1 else fromMaybe (-1) . elemIndex c $ grid !! x getGridVal :: Position -> Grid -> Char getGridVal (x, y) grid = (grid !! x) !! y @@ -32,38 +32,38 @@ getNextPosition :: Position -> Direction -> Grid -> (Position, Direction) getNextPosition (x, y) U grid = let newPos = (x - 1, y) gridVal = getGridVal newPos grid in if newPos `isInside` grid && gridVal == '#' - then getNextPosition (x, y) R grid - else (newPos, U) + then getNextPosition (x, y) R grid + else (newPos, U) getNextPosition (x, y) R grid = let newPos = (x, y + 1) gridVal = getGridVal newPos grid in if newPos `isInside` grid && gridVal == '#' - then getNextPosition (x, y) D grid - else (newPos, R) + then getNextPosition (x, y) D grid + else (newPos, R) getNextPosition (x, y) D grid = let newPos = (x + 1, y) gridVal = getGridVal newPos grid in if newPos `isInside` grid && gridVal == '#' - then getNextPosition (x, y) L grid - else (newPos, D) + then getNextPosition (x, y) L grid + else (newPos, D) getNextPosition (x, y) L grid = let newPos = (x, y - 1) gridVal = getGridVal newPos grid in if newPos `isInside` grid && gridVal == '#' - then getNextPosition (x, y) U grid - else (newPos, L) + then getNextPosition (x, y) U grid + else (newPos, L) markVisited :: Position -> Char -> Grid -> Grid markVisited (x, y) c grid = let gridVal = getGridVal (x, y) grid in if gridVal == '#' || gridVal == '^' || gridVal == '>' || gridVal == 'v' || gridVal == '<' - then grid - else let row = grid !! x - newRow = take y row ++ [c] ++ drop (y + 1) row - in take x grid ++ [newRow] ++ drop (x + 1) grid + then grid + else let row = grid !! x + newRow = take y row ++ [c] ++ drop (y + 1) row + in take x grid ++ [newRow] ++ drop (x + 1) grid visitGrid :: Position -> Direction -> Grid -> Grid visitGrid (x, y) direction grid = let newGrid = markVisited (x, y) 'X' grid (nextPosition, newDirection) = getNextPosition (x, y) direction grid in if nextPosition `isInside` newGrid - then visitGrid nextPosition newDirection newGrid - else newGrid + then visitGrid nextPosition newDirection newGrid + else newGrid checkGridLoop :: Position -> Direction -> Grid -> Bool checkGridLoop startPosition direction grid = let (nextPosition, newDirection) = getNextPosition startPosition direction grid