This commit is contained in:
daniele 2024-12-05 15:33:14 +01:00
parent ed2e74ba45
commit e4c38318e9
Signed by: fuxino
GPG Key ID: 981A2B2A3BBF5514
5 changed files with 47 additions and 7 deletions

View File

@ -2,9 +2,9 @@ import Data.List (sort)
isSafe :: [Int] -> Bool
isSafe xs = (isAscending xs || isDescending xs) && maximum distances <= 3 && minimum distances >= 1
where isAscending xs = xs == sort xs
where isAscending xs = xs == sort xs
isDescending xs = xs == reverse (sort xs)
distances = map abs $ zipWith (-) xs (tail xs)
distances = map abs $ zipWith (-) xs (tail xs)
main = do
contents <- lines <$> readFile "day2.txt"

View File

@ -9,12 +9,12 @@ countSubstrings :: String -> [String] -> Int
countSubstrings word text = sum (map (countSubstrings' word) text) + sum (map (countSubstrings' word . reverse) text)
+ sum (map (countSubstrings' word) cols) + sum (map (countSubstrings' word . reverse) cols)
+ sum (map (countSubstrings' word) diags) + sum (map (countSubstrings' word . reverse) diags)
where cols = transpose text
where cols = transpose text
diags = diagonals text
countSubstrings' _ [] = 0
countSubstrings' word text@(_:rest) = if word `isPrefixOf` text
then 1 + countSubstrings' word rest
else countSubstrings' word rest
then 1 + countSubstrings' word rest
else countSubstrings' word rest
main = do
contents <- lines <$> readFile "day4.txt"

View File

@ -10,8 +10,8 @@ countSubstrings word text = sum (map (countSubstrings' word) diags) + sum (map (
where diags = diagonals text
countSubstrings' _ [] = 0
countSubstrings' word text@(_:rest) = if word `isPrefixOf` text
then 1 + countSubstrings' word rest
else countSubstrings' word rest
then 1 + countSubstrings' word rest
else countSubstrings' word rest
submatricesVert :: Int -> [String] -> [[String]]
submatricesVert _ [] = []

16
Day5/puzzle1.hs Normal file
View File

@ -0,0 +1,16 @@
import Data.List.Split (splitOn)
isSorted :: [(String, String)] -> [String] -> Bool
isSorted rules [x] = True
isSorted rules (x:xs) = let after = [ p | (p, n) <- rules, n == x ]
in not (any (`elem` after) xs) && isSorted rules xs
getMiddle :: [String] -> String
getMiddle xs = xs !! (length xs `div` 2)
main = do
contents <- map (splitOn "|") . lines <$> readFile "day5.txt"
let rules = [ (x, y) | [x, y] <- takeWhile (/= [""]) contents ]
updates = concatMap (map (splitOn ",")) . tail $ dropWhile (/= [""]) contents
sorted = filter (isSorted rules) updates
print . sum $ map (read . getMiddle) sorted

24
Day5/puzzle2.hs Normal file
View File

@ -0,0 +1,24 @@
import Data.List ((\\))
import Data.List.Split (splitOn)
isSorted :: [(Int, Int)] -> [Int] -> Bool
isSorted rules [x] = True
isSorted rules (x:xs) = let after = [ p | (p, n) <- rules, n == x ]
in not (any (`elem` after) xs) && isSorted rules xs
getMiddle :: [Int] -> Int
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 ]
main = do
contents <- map (splitOn "|") . lines <$> readFile "day5.txt"
let rules = [ (read x, read y) | [x, y] <- takeWhile (/= [""]) contents ]
unsorted = filter (not . isSorted rules) . map (map read) $ concatMap (map (splitOn ",")) . tail $ dropWhile (/= [""]) contents
fixUnsorted = map (sortOnRules rules) unsorted
print . sum $ map getMiddle fixUnsorted