diff --git a/day4/CHANGELOG.md b/day4/CHANGELOG.md new file mode 100644 index 0000000..4c17aef --- /dev/null +++ b/day4/CHANGELOG.md @@ -0,0 +1,5 @@ +# Revision history for day3 + +## 0.1.0.0 -- YYYY-mm-dd + +* First version. Released on an unsuspecting world. diff --git a/day4/LICENSE b/day4/LICENSE new file mode 100644 index 0000000..87cbd05 --- /dev/null +++ b/day4/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2026 radumaco + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/day4/app/Main.hs b/day4/app/Main.hs new file mode 100644 index 0000000..097cce0 --- /dev/null +++ b/day4/app/Main.hs @@ -0,0 +1,56 @@ +module Main (main) where + +import System.Environment +import qualified Data.Map as M + +main :: IO () +main = do + args <- getArgs + input <- readFile $ head args + let papers = lines input + let env = let maxY = length papers - 1 + maxX = length (papers !! 0) - 1 in + Env { + maxY = maxY, + maxX = maxX, + items = M.fromList $ zip (generateIndexes (maxY, maxX)) $ concat papers + } + let initialPapers = length $ filter paperFilter $ M.toList $ items env + print $ length $ filter (isAccessible env) $ generateIndexes (maxY env, maxX env) + let finalEnv = removeAll env + let finalPapers = length $ filter paperFilter $ M.toList $ items finalEnv + print $ initialPapers - finalPapers + +data Env = Env + { maxY :: Int + , maxX :: Int + , items :: M.Map (Int, Int) Char + } deriving (Show, Eq) + +paperFilter :: ((Int,Int),Char) -> Bool +paperFilter (_,'@') = True +paperFilter (_,_) = False + +generateIndexes :: (Int, Int) -> [(Int, Int)] +generateIndexes (maxY, maxX) = [(y, x) | y <- [0.. maxY], x <- [0.. maxX]] + +isPaper :: Env -> (Int, Int) -> Bool +isPaper env (y, x) + | y >= 0 && y <= maxY env && x >= 0 && x <= maxX env = (items env) M.! (y, x) == '@' + | otherwise = False + +isAccessible :: Env -> (Int, Int) -> Bool +isAccessible env (y, x) + | isPaper env (y, x) = let papers = filter (isPaper env) [(y-1, x-1), (y, x-1), (y+1,x-1), (y-1,x), (y+1,x), (y-1,x+1), (y,x+1), (y+1,x+1)] in + length papers < 4 + | otherwise = False + +removePapers :: Env -> [(Int, Int)] -> Env +removePapers env [] = env +removePapers env (x:xs) = removePapers env{items = (M.insert x '.' (items env))} xs + +removeAll :: Env -> Env +removeAll env = let accessible = filter (isAccessible env) $ generateIndexes (maxY env, maxX env) in + if length accessible > 0 + then removeAll (removePapers env accessible) + else env diff --git a/day4/app/input1.txt b/day4/app/input1.txt new file mode 100644 index 0000000..5429aeb --- /dev/null +++ b/day4/app/input1.txt @@ -0,0 +1,140 @@ +@@@..@@.@@.@.@@@.@@@...@@@@@@.@@@@@@.@@@@.@..@@@.@@.@@@..@@@@.@@..@@@@@..@@@.@@@.@.@...@@@..@.@@@.@.@..@@@.@@.@.@.@@..@@@@@...@.@@@.@@@@.@@. +@@.@.@@@@@@@@.@@@.@@@@.@@@@@.@@@@@@@@..@..@@@@...@@@@@.@.@.@@@@.@@@@@@@@@.@..@.@.@@.@@@.@.@.@@@@@@@@@@@@.@@.@@.@.@@@.@@@..@.@@@@@.@..@.@@@.@ +@@@@@@@@.@.@@@..@@@.@@.@@@@.@@..@.@.@@@@@@@@@@@@..@..@.@@@@@@.@.@@@@@@@@@.@.@@@@@.@@.@...@.@@@@.@@@@@@@.@@@@@@@@@..@.@.@@@@..@.@@@.@..@.@.@@ +@...@@@@.@@.@..@...@.@@@@@@@.@.@.@...@@@@@.@.@@@.....@.@@.@.@@.@.@@@.@.@.@@@@@@@..@@..@.@@@@.@@@@.@@...@@@@@...@@.@@@@@@@@..@.@.@@.@@@@@@@@. +@@.@....@@.@@@.@....@@@@@@@@@@.@..@@@@.@@@@.....@..@@.@@@@@@@@@.@.@.@@@@@.@.@.@..@..@@@.@@.@@@@@@.@@.@@@.@.@..@.@.@@@.@.@.@@@@@.@@.@.@@@.... +@.@.@@@@@@@@@@@@@....@.@.@@.@@.@@@@..@.@@@@@@@@@@@.@@@@@@@@@@@@@.@.@@@@..@.@@@@..@@@@..@@@@...@@@@@@.@.@@.@@@@..@.@@.@.@.@...@@....@@@@@@@@@ +..@@@@.@@@.@.@@@@@@@@@@@.@@@@@@.@.@@@@@@@..@.@@@@@@@.@@@@@.@@@@@.@.@@@@@.@.@@@@@@@@.@@@@@@.@@..@@@.@@..@..@@.@.@.@@@.@@..@@@@@@.@..@.@@@.@.. +@.@...@@@.@@...@.@@@.@@..@@@@@@..@@@@..@@.@@.@@@@@...@.@@@@.@@.@@@@@.@.@....@.@@.@@.@@@@@.@..@@@@@@@..@@.@.@@@@.@@.@@.@@@@@@@..@@@@.@@@..@@. +@@.@.@@@@@.@@@@.@.@@@@@@@.@.@@@@@@@@.@.@@@@@@@...@.@.@@@.@@@@@@@.@.@@@@..@@@.@...@@@@@.@@@..@@@@.@@@@@@.@@@.@..@.@@.@@@@@.@...@@@@....@@@.@. +@@@.@@@.@@..@@.@@@@@@.@@.@.@@@@@..@@@..@@@@@@@@@@@..@@@@.@@@...@@@@@@.@@.@.@.@.@@@..@.@@@.@@@.@@.......@.@@@..@@@@.@@@@@..@.@@@.@@@@@@.@@@@@ +@...@@.@@@@@@..@@@@@@@@@@@...@.@.@.@@@@@@.@.@@@@..@..@@@..@@@@@@.@@..@...@.@@@@@@@@@@@@..@.@@.@.@@.@@@..@..@..@.@.@@@@@@@@@@.@@@.@@@.@@@@@@@ +@.@@..@@.@@@.@@@@@@@@@....@@.@.@@@@.@@..@@.@@.@@@.@@@@.@@@@@..@.@.@@@..@.@@@.@@@@@.@@@..@@..@.@@@@@@..@.@@@.@@@..@@.@.@.@@..@@@@@@@.@@@@.@.@ +@@..@.@@@.@@@...@@@@@@@@@..@@@@@@@.@@.@@.@.@@@@@...@@..@@@@.@.@@.@@@@.@.@@@.@.@.@@.@@@@.@..@.@@@@..@.@@@.@@@..@@@@.@@@@.@@@@@@@@...@@@@@@@@@ +.@@@@...@@@@@.@.@.@@@@.@.@@.@@@@@@@@@@@@@@@@@.@@@.@@@@@@.@@@.@@.@@@@@@@@.@.@@.@@@@.@@@@@@@.@@@.@@@@@@@@@@..@@@.@.@.@@.@@@@@@@@@@.@@...@@@@.@ +@@@@@@.@@@@@..@...@@@.@@.@@.@...@.@@..@.@@.@@@.@@@@@@.@.@@...@@@..@.@.@@@@@..@@@.@@.@.@@@@.@.@@@..@..@..@@.@@.@@@.@..@.@@..@@.@..@@@@.@@@.@. +@@@@@@@@..@@@@@@@.@@@.@@@@@@@..@@@@..@@@@@@@@@@@@..@.@@.@@@..@@@@@@.@.@@@@@.@@@...@...@@@@@.@@@..@.@@@.@@@@@@.@.@@.@.@@@..@.@.@..@.@@@...@.@ +@@@@..@@...@@..@@@@@...@@.@@@@@.@@@@@.@@@@@.@@.@@@.@.@.@.@@@@.@@@@@@..@@@.@@..@@..@@.@.@.@.@@...@.@@@@@@...@..@@...@@@.@.@@@..@.@@@.@..@@.@@ +@...@.@@@..@@@.@..@@.@@.@.@@@@@@@@@@@@.@.....@.@..@@.@.....@...@@@..@....@@@@@.@@@@..@.@@@.@..@@@@@@@..@.@@.@@@.@@.@@@@@@.@..@@..@@@@@@@@@@@ +...@.@@.@.@@.@@@@@.@@@@@@..@@@@..@.@.@@@.@@.@@@@.@@@..@.@@@@.@@.@.@@.@@.@.@@@@@@..@@.@@@@@@@.@@.@@@.@.@@...@.@@.@@...@.@@@@.@@@@@@...@@.@@@@ +@@..@@@...@.@@.......@@...@@@.@.@@.@.@@@@@.@@.@@@@@..@@@.@@@@@@@@.@@@@@@@....@.@@.@@@@.@@@.@@@@@@@@@@@@@@@.@.@@@..@..@@@@.@@.@..@@@.@@@.@.@. +..@..@@@.@.@@.@..@@@@@@..@.@@...@@.@@.@.@@.@@@@@@@..@@..@..@@@@@..@.@..@@..@@@@@@@@.@@@.@@@@@@@@.@@@@@@@.@@@@.@.@@@@@.@.@@@@@..@@@@.@.@@@@@@ +.@@@@@@@@@.@.@.@..@@@.@@.@@@.@@@@@@@...@@@.@@@@@.@.@@@@@@..@@.@..@.@@@@.@@@@@@.@@....@@.@..@..@@@@@@..@@@.@@@..@@.@.@@@@.@@...@@.@@@.@@@@.@@ +@@@.@.@@@@..@....@@.@.....@@@.@.@@.@@@@@.@.@.@@.@@@.@@@..@@@@@@..@@@@..@.@.@@@.@@@@@@@@@.@@@@@.@@@@@..@@@@@@@@@@..@.@.@.@@@@@@@.@@.@@.@.@.@@ +@@@@@@.@@@@.@@@@@@@@@...@@@@..@@@@@.@@@.@@..@@@.@@@.@@.@@@@..@.@@@@@@.@@.@@..@.@..@...@@..@@@.@...@@.@@.@@@.@.@.@@@@@@@@....@@.@.@@@@@@@@@.@ +@.@@@...@.@@@@.@..@....@@@@.@@@@.@@@@..@@@...@.@.@@@@@..@@..@..@.@@..@.@@@@@.@.@@...@@@@.@@@@@@@@@@@@@.@@@@.@.@@@@.@@@@.@@..@@@..@@@@.@@@.@. +....@@@.@@@@@@.@@.@.@@....@@.@...@..@@@@@.@@@.@@.@@@@..@@@@@.@@@.@@@.@.@.@..@@@@.@@@@@@.@...@..@.@@@@..@.@@@@.@@.@.@@..@....@.@@@@...@@@...@ +.@@@@@@..@...@@@@.@@@.@.@@@..@.@@@@.@@@.@@@..@....@@@@@@.@@......@.@@...@@@@@@.@..@@@@@.@@@@.@..@@@.@@.@.@@@@.@@.@@@@@@@@.@...@@@@@@@.@@...@ +..@@@@@.@@@@@@@@@.@@@@@...@.@@@@.@@@@@.....@@@@..@@@@.@@@@@@@@@.@.@....@@..@@@@@@..@@..@@@.@@@@.@@@..@..@@.@.@.@.@....@@@@.@@@.@@.@.@..@@..@ +@@@@@@@@@@..@@@.@....@.@@.@@..@@@.@@.@@@@@.@..@@@..@@@.@@....@@@@@.@@..@@.@.@.@@@.@..@@@@..@@@@@.@@@@@@@@@@@@.@@.@@.@@@@.@@@.@@@@@@..@....@@ +@@@@@@..@.@@@@@@@@..@@.@.@.@@@@.@@@.@@@@@@.@@@@@@@@@@@.@@@@@.@.@@.@@@@..@.@@@.@@..@..@@.@.@@....@....@.@@.@@@@@@@@.@.@.@.@.@@@...@.@@..@@@.@ +.@@@@@@.@.@..@@@@@.@@@@@@@@@.@..@.@.@@@.@.@@@@....@@@@@@@..@.@..@@@.@@..@@.@.@@@@@@@@.@@@@.@.@@@...@.@@@@@@@@.@.@@@.@.@@@.@.@@@..@@@@@.@@@.@ +@.@@.@.@@..@.@@@...@@@@@.@@@@@@@@@@@@.@@@@@@@.@@.@.@@@@@@.@@@...@@..@@.@@@@@@.@..@@@@@.....@@.@@@.@@..@@@.@.@..@@@.@@@@@@@@.@.@...@.@.@@@@@@ +@.@@@@...@..@@.@.@@.@.@@....@@@@@@@@@@@@@..@.@@@@.@@@@@@@.@@@@@.@...@@.@@@..@@@@@@@.@..@@@@@.@@....@@@@@@@@@.@@.@@@@@..@.@@.@@@@..@....@@@@. +@@@@.@@@.@.@..@@@@@@.@@.....@@...@@@@@@...@.@@..@@@@..@.@@.@@.@.@@..@@.@@@@@@@.@@@.@@@.....@..@.@.@@@@.@.@@.@@@.@...@@@@@@@@@@@.@@.@@.@@@@@@ +@.@@@@@...@@@@@@...@@@.@@@.@..@@@@...@@@@@.@@@@@.@..@...@.@@@.@.@@@.@@@@..@@@..@@@@.@...@.@@@.@@@..@@@..@@.@@@@..@@@@@@@.@.@@@@....@..@..@@@ +@@@.@.@@@@@.@.@...@@@.@@.@.....@@.@@.@@@@@..@@@.@@@.....@@@@@@@@@@@@..@@@@@@..@@.@@@@@.@@@@..@.@@@.@@@@@@...@@.@@@@.@@..@..@.@.@@.@@@@.@.@@. +@@@.@.@@@@.@..@@..@.@.@@@.@.@@@@.@.@...@@.....@@@@@@@.@.@.@.@@.@@@@@@@@@@.@@.@@.@@@@@@@@@@@.@@@.@@.@@@@@@@@.@@@@@@.@.@@@@.@.@..@@@.@@@..@..@ +@@.@.@.@@@@.@@@.@@@@@@@@..@@@@@.@@@@@@@..@@@.....@@@.@@.@.@.@..@.@@.@@@@.@.@@@.@@..@@.@.@@.@@.@..@@@.@@@@....@.@@@@@.@@@@@@@@@@.@.@..@@@@@@. +...@@@.@@@@.@@@@@@..@@@@..@.@..@.@.@..@.@.@@@.@@@@..@@@.@.@@@@.@.@@.@@@@@.@@@@@.@.@.@.@@@@@@.@@@.@@.@@@..@@@@@@@@...@.@@@@@.@.@@@@@..@@@@..@ +.@..@...@.@@..@@.@.@@.@.@..@.@@@@.@.@@@.@@@@..@..@.@.@.@@@.@.@.@.@.@@@@@@.@.@@.@@@.@@@@@@@....@@@@@.@@@@@..@@@@.@@@.@@@.@.@...@@..@.@@@@@..@ +@@@@.@@...@.@@@@..@@@@@.@@@..@.@.@@@..@@@@@@.@@@@@.@@@@.@..@@@@..@@@@@@@@@@.@@@.@.@@@.@@.@.@@@@@.@.@...@@.@...@@@.@@...@@@@@.@@@@@@.@.@.@.@@ +.@.@@@.@@@@@@@.@@@.@@@@@.@@@.@@.@....@@@..@@@@@.@@..@.@@@@@@@...@@@@@.@....@.@..@@.@@@@...@.@.@..@.@@@@@@.@.@@@.@..@.@@...@@@@.@.@..@@..@@@@ +@@.@@.@@@@@@.@.@@@.@@@@@@@..@@@@@@@.@@.@@..@@@.@@@@@@@@@@@..@@@@.@@@@@.@@@@@.@@.@...@@@@@.@@@@.@@@@@...@@@@@...@@@@.@@@@.@@@@@@@@@@@.@@@@@@@ +.@.@@.@.@@@.@@...@.....@@@@.@@@.@@.@@@@@@.@.@.@..@@@@@..@.@@@@..@@.@@@@@@.@@@.@.@.@@@.@.@@@@@.@@@@@.@@@@.@@..@@@.@.@.@@@@..@.@..@@@@..@.@@@. +.@@@@@@@@...@@.@@.@@@.@....@@@@@@@@@@..@@@@@.@@.@@@@@@@@.@@.@@@....@@@@@.@@@.@..@.@@@..@..@@@@@.@.@.@@@@.@@@.@@@@.@@@@@@@@@@@.@.@...@@.@.@@@ +@@@@.@@@@@@@.@..@@..@@@@.@.@.@.@...@@@@@.@@@@..@.@..@@@.@@@@.@@...@@@..@...@.@@.@@.@@@@.@.@@.@@@@@..@@@@..@@..@@.@..@@@@.@.@@@.@@@.@@@@@.@@@ +@..@@@@@.@@@..@@@@.@.@@@@.@.@..@@@@@@@@.@..@.@@.@@@.@@.@@.@@@.@@@@@@.@@..@@@@@@..@@.@..@@@@.@.@.@@@@@@...@@.@.@.@@@@@.@@@..@@.@.@.@@@..@@.@@ +@@@@..@@@.@@@@@.@..@.@..@@@.....@@@@.@@.@..@.@@..@.@@@@@..@@@@@.@.@@..@@.@@@@.@@.@....@.@@@.@@@@.@@@@.@@@@.@@@@.@.@@@@@.@@@@@.@@@@@@@@.@.@@. +.@@@@@@@@.@@@....@@@@.@@@@@@@@@@@@@@.@@.@.@@@.@@@@@@@@@..@..@@@@@@@@@@@.@.@.@@@@@.@@@@...@@@@...@@@@@@@@@@.@.@@@@@@@@@..@@@@@..@.@@@@@@@@.@@ +@@@@.@.@@.@...@.@@@@.@@@@@@..@@.@..@.@@@.@@@@@.@@.@.@@@.@.@@..@@.@@@@@@@.@.@..@@@.@@.@@@@@@.....@@.@.@@@.@.....@@..@@@@@@@@@@.@@@@.@@.@..@@. +@@.@..@@.@@..@@.@@@@.@@..@..@@.....@..@@@@@@@@@@@.@..@@@@@.....@.@@@@@@.@@@@@@..@@@.@@@.@@@.@.@@.@.@.@@@.@@..@..@@@..@@.@.@@@@@.@@.@@...@... +.@.@@@.@@@@.@.@@.@.@@@.@..@@@@@@@...@@@..@@@..@.@@@@@...@.@.@@@@@.@@@.@@@@...@@@@@@.@@..@@@@@.@.@.@@.@.@@@@@@.@@@@.@.@@@@@@..@@...@@.@@..@.@ +@@@@.@@@..@.@@@@@@@@@@@...@@@.@..@..@...@.@@.@@@@@@@@.@@@.@@@@@@@@@.@@@@@@@@@@.@@@.@@@@...@.@.@@.@@@.@@.@@@@..@.@@@@@@.@@@.@.@@.@@.@@@@@@..@ +@@@@..@@@..@...@.....@....@@@@..@.@@@@.@@.@@.@@@@.@..@@.@.@@@@@@@..@..@@@@..@@@@@@@@@@@@@@@@@.@@@@@.@.@@@@@.@@@..@@@@@@@@...@@..@@@@.@@.@.@@ +.@..@@.@.@@@@...@..@@@@.@@@@@.@@@@@@....@@@.@@.@..@.@.@.@..@@@@@..@@.@@@@.@.@@@@@@@...@@@@@@@..@@@@@..@.@@@..@@...@@@@.@@@..@...@.@@@@@@@.@. +@.@@@@.@.@.@.@@@@@@.@@@..@@.@.@@@.@@..@.@@@@..@@@@@@..@@.@..@.@@@@.@@@@.@....@@..@@.@@.@.@.@@...@@@@...@@.@@@.@@.@@@@@@.@@.@@.@@@@@@@.@@@@.. +@.@@@@@.@@@@@@@@@@@@@@@@@@@...@.@@@@.@@@@@@.@.@@@@@..@@@@...@@@@@@.@@.@..@.@@.@@.@@@@@.@@@@@.@@@.@@@.@@@..@.@@@@...@@@@@.@@.@@@@.@@@@@@@@@.@ +@..@@.@@.@..@...@@@@..@@@@@@.@...@...@.@@@@@@.@.@.@@..@.@.@@.@@@@@@.@.@.@..@@@@@..@.@@@@@@.@@@.@@@@@@@@@@.@.@@@@..@..@.@.@@@.@@@@@..@@@@@.@. +.@@@@@@.@@@.@@....@...@@.@.@@@@@@.@@@@@@@......@@@@@.@@@...@@.@@.@@@...@..@@@@....@.@@@..@@@@@@.@@@@@@.@@@@@@@.@@.....@@@@@...@@.@@@@@.@@@@@ +@@@@@@.@@.@.@@@@.@@@@@@@....@@@@.@@@@.@@@.@@@..@@@..@.@@@@..@@.@@.@@@.@.@...@..@.@..@..@@..@..@@.@@@@@@.@....@@.@@.@.@.@@@@@....@..@@@..@@.@ +.@.@..@@.@@@..@@@@@@@..@..@.@@@@.@....@@@@@@..@@@@@.@@@.@@@@@@.@@@@@.@..@@@.@@@@@@@.@.@@.@@@@@@@@@..@.@@.@.@@@.@..@@@@@.@.@@.@@@..@@@@@@.@.. +@@@@......@.@@@.@.@@.@..@.@.@@@@@.@@@@@@.@@@@@.@@..@@@@@.@@@@@.....@@.@@@@@@.@..@@@...@@@.@.@..@@@@.@@@@@.@@..@@@@@.@@@@@@.@@.@...@@@.@..@@. +@@@@@..@@@.@@@@@.@@@@@@..@@@@...@@@@@@....@.@..@.@.@..@.@@@.@.@.@.@@@@.@@..@@.@.@.@.@@@@@@@@..@@.@@@@.@@@.....@@@@@..@@@@@@@.@.@@@@.@.@...@@ +@.@@@..@@@..@@.@@@@@@@@...@@@@.@@@..@@@.@@@@..@@..@.@@..@@@@@..@@.@.@....@@@@.@.@@@.@.@.@@.@@@@.@.@.@@@@@..@@@@@@@@..@@.@...@@..@@.@@.@..@.. +...@@.@@.@.@@@@@.@@@..@.....@@..@@.@@.@@.@@.@...@.@....@@.@@@.....@@@@@.@@@@@@@.@@@@@.@.@@@...@@@@.@@.@.@.@@..@@..@@..@..@@..@.@.@.@@@@@..@. +@@.@@@@@.@.@@@@..@@@@@@@@@..@@@@@.@@.@@..@.@@.@@..@.@@...@@@@@@.@@...@@@@@@@.@@@@..@.@@.@@..@@.@..@@@.@@@.@..@@@.@.@@@@.@@@@..@.@@...@@@@@@. +@@@@...@@..@@..@@@@@@..@...@@@@..@@@@.@@@@@@.@.@@@@@..@@@@@@..@@@..@@.@@@@@@@@@.@...@@@@.@@@...@@@@@..@@@..@.@..@..@@.@@.@..@@@...@...@@@@@. +.@.@@..@@.@@.@@...@@.@..@@@.@@@@@@.@.@@.@@@@..@.@@@.@..@@@@@.@@@@.@..@@.@..@..@@@.@..@@@@@@..@.@@@@@@@@@.@.@@.@@@@.@@@.@@.@@..@@.@@.@@@@@.@@ +.@@.@@@@...@@@@..@.@@@@@.@..@.@.@.@.@@@@@....@.@..@@@@@@@@@@..@@@@@@@.....@@.@@@.@.@@@@@@...@..@@.@@@..@@..@@@@...@.@@@...@@@@@..@..@@@@@@@. +@..@.@@@@@@@@....@@@@@@....@@@.@@@.@@@@@@.@@@@@.@..@@@@@...@@@@.@.@@@@..@@@@@@@.@@.@@@@@.@@@@.@@.@@@@@@@@@@@@@@.@@@@..@@.@@.@.@@.@..@@@.@@@@ +...@@.@@.@@@@@@@..@@...@@@@.@@@@@...@.@@@@@@@...@@.@@....@@@..@.@@@..@@..@.@.@@@@...@@@@@@@.@@@..@@@..@@@@.@..@.@..@@.@....@@@.@@@@..@..@.@@ +@...@.@@.@@@@@@@@@@@@@@@@@@.@@@.@..@@..@@.@@.....@.@@.@@..@@@.@.@@@.@.@@..@@@.@..@@.@@@@@@.@@@@@@.@@@@@.@.@@@@.@@..@@.@@.@@@.@..@@@@..@@.@@@ +@@.@.@@@@@@@@...@.@@@@@..@@.@....@@@@@..@.@@@.@.@@@.@@.@@@@.@@@@.@..@@@.@@@@@.@@.@@@@@@..@........@.@.@@..@.@@..@@@@.@@..@@@@@.@@@@.@.@@.... +@@@@.@...@@.@.@@..@..@@.@..@@..@@@.@@@.@@@@@@@..@@@@@@@@@@.@@@@.@@.....@@@@@.@...@@@@.@@@@.@@.@@@@.@..@@@@.@.@@@.@@@.@@@@@@@.@.@...@...@.@.@ +.@...@@@.@@@@.@@..@@...@@@@@@@.@@.@@.@@@@@@@.@@@.@@.@@@@..@...@@.@@..@..@.@@@@@...@@@@@@@@@@.@@.@@.@@@......@.@@@@@@.@.@@@@@@@@@.@@@.@.@.@.@ +@@@@@.@.@@@@@..@@.@@@@.@@@.@@@@@...@.@@.@@..@.@@.@.@@@@@..@.@@@.@@..@@@.@@..@...@.@@@@@@@@....@@@@@@@.@@..@@@.@@@@@@@..@.@.@@.@@@@@@@@@..@@@ +@@@@@@@@@@@@.@@@@.@@@@@.@@.@@@@.@.@@@@@@.@.@@@@...@@@@..@@.@.@.@@.@...@..@..@@.@.@..@@@@@.@@@@@@@@.@.@@@@@..@..@.@@.@.@@.@@.@.@@.@@.@..@.@@. +@.@@..@@@@@.@@@@..@.@.@.@@@@.@@.@@@.@@@@@@.@@@@.@.@@.@@@@@..@.@.@.@@.@.@...@@..@.@@.@@@.@.@..@@@@@.@@@@@@@@@.@@@@.@.@@.@@@..@@@@@..@.@@@@.@@ +..@@@@@..@..@..@@@@@@.....@.@@@@@@@@...@@....@.@@@..@..@.@@@@@@@@@.@.@@.@@@.@@@@.@@..@@.@@..@.@...@@.@@.@@.@@.@@@.@@@@.@.@@@@.@...@@@@.@@@@@ +.@@@..@..@.@@@..@.@@@..@.@.@.@@@@@@@@@..@@@.@..@@..@.@@@@.@@.@@@....@@.@@@@.@@.@@@.@@.@@@@@@@.@.@@@.@..@@@@@.@.@@.@@..@.@.@.@.@.@.@.@@.@@.@@ +@@@@@@...@.@@.@.@..@@@..@.@.@.@@..@@.@@.@.@@@@..@@.@@.@.@.@@....@@@@@.....@@.@@@.@@.@@@@@@@@@@@@@@@@@..@@.@..@@@.@@..@@.@@@@@@.@.@@@@@@@@.@. +@@.@@..@@@.@@.@@..@.@@@@...@@@.@@..@@@@@@.@@@@@.@@.@@.@@@.@@..@..@.@@.@@@..@@@@@@@..@...@..@@..@@@@@..@@..@@.@.@@.@@@@...@.@@@@.@@.@@@.@.@.. +@@@@@@@@.@.@.@@@.@.@...@.@@@@@@@..@@@.@.@@.@@@..@@@...@.@@@@@@@@@.@..@@@.@.@@@@@@.@.@.@.@...@@@@.@@@@@@.@@.@@@@.@@@@@@.@@.@@@.@@@.@@@@@...@. +.@@@@@.@@.@@.@.@.@@@..@..@.@@@@@@...@@..@@.@..@@@@@@@@..@.@.@@..@.@.@....@@@@@.@.@@@@..@.@@@@@@@....@.@.@.@..@@.@..@@@@.@....@@@@.@.@..@@.@@ +@.@@@@@@@@.@@@...@@.@.@.@@.@@@.@..@@..@..@@@.....@@...@@@@@@@@@.@@@..@@.@.@@@..@@@..@..@@@..@@@@@@@@..@@.@@@@.@@...@@.@.@.@@@@@@.@@@.@@@@.@@ +.@@..@.@@@@@@.@@@..@@@.@..@@@@@@@@..@@@..@.@@@.@.@.@@@@@@@@.@@@@.@.@@.@..@.@@@@...@..@@@@@@@..@@.@@.@@@.@@@@@@..@@@.@@.@@.@.@@.@.@@@@@@.@@@@ +@.@.......@..@@......@.@.@@@.@@.@@@.@@@.@.@@@.@.@.@.@..@.@.@@@..@@@.@@@@@...@.@.@@@..@.@.@@.@.@.@@.@.....@@@@.@@@@@.@@.@.@@@@....@..@@@.@@@@ +@@.@@@@@@..@@@.@@@@@...@@.@@.@.@@@@@.@@.@@..@@@.@@@@@@...@@.@@@@.....@@@@..@@.@.@.@.@@..@..@@@.@@@@@.@@.@.....@@@@.@@..@...@@.@@..@.@@@@@.@. +.@@@@@@@@@.@..@..@@.@@@.....@.@@@@@@@@@..@@@.@@.@..@@@@.@@...@.@.@@@@@@....@.@@.@.@@@.@.@@@.@.@.@.@@@.@@@@@@@@@@@.@@.@@@@@@@@@@.@@@@..@@@.@@ +...@..@@@.@@@@@@@...@@@..@..@..@.@..@@...@.@@@@..@@.@@@..@.@@.@.@.@.@...@.@@.@..@@.@@@......@@@.@.@@@@.@..@@..@..@@.@.@..@...@@@.@@@@.@@.@@@ +@.@@..@@@@@@@.@@@@@.@.@@@.@@@@@@@@@@.@@@@@@@.@....@@..@@.@@@@@@@@@..@@.@.@.@@@.@@@.@@.@.@...@@.@@.@@@.@@@.@.@.@@@.@.@@@@@.@@.@.@@@@.@@@@@.@@ +.@@.@@@@.@@..@@@@@@@@@@@@.@....@@@....@@.@..@.@.@@@@.@.@@..@.@@@@.@.@@@.@.@@...@@@.@.@@.@..@.@.@.@@@.@@@@@.@@.@@@@@.@@..@@.@@@@@@.@@@@@.@.@@ +@.@@@.@@.@@@.@@@@@..@@@.@@@@@.@@...@.@..@@@@@@..@...@.@@.@@@@..@@@.@.@@.@@@.@@.@@@@.@@.@@.@@....@@@@@@@@@@@..@@.@.....@.@@@@..@@@@@@@..@@@.@ +...@@@@@.@..@@.@@..@..@@@@.@....@@@@.@..@.@@@.@@..@@@.@.@.@...@@@@@.@.@@@@....@.@.@@.@@@@@.@@@.@.@@@.@@@@@@@.@..@@@.@@@@@@@..@@@@@.@@@.@@@@@ +.@@.@@@@@.@@@@@@.@@..@@.@@@@.@@@@@@@.@@@.@@@.@@@......@@.@@@@@@@@@@@@@@@@@@@@.....@@.@...@@..@@.@.@.@@@@@@@@.@@@@@..@..@.@@@@@.@.@@..@@.@.@. +.@..@.@.@@@.@.@.@.@.@@@@.@@@...@.@.@.@@@.@@.@.@@..@.@@@...@@@@@@@@@@@.@@..@@@@@@@@@@.@@@@@@.@@@@..@@.@.@@@@.@@@......@.@...@@@@@..@@.@@@@@.. +@..@@@@@.@@@@@@...@@@..@..@@@@@@.@.@@..@@@@.@..@@@@@.@@@..@@@@@@@@@@@@@@.@.@.@@.@@...@@@@@@@@@.@..@@..@@@@.@@@@@.@@.@@@@@@@@.@@@.....@...@@@ +@.@@..@@..@@.@@..@@@@@.@.@@.@@..@@@.@.@@@.@.@.@..@@.@...@@@.@@@@@.@...@..@@..@.@@.@@@@@@@@@@...@@@@..@@@@@@@@@.@.@..@@@@.@...@@@.@..@@.@@@.@ +.@@@@.@@.@@.@@@.@@@@@@.@.@.@@@.@@.@@@@..@@@@.@.@.@@.@@@@@.....@@.@.@.@.@@@@@.@@@@@@.@@@@.@@@.@@@@@.@..@..@@@.@.@@@@@@@..@@.@...@..@@@@@@...@ +@@@@@.@@@@@@.@@@@@..@.@@...@@@@@@@@@@@@...@..@@.@..@@.@@..@...@@.@@@@@@@@@@@.@@..@..@@@@@@@@@.@.@@@@.@.@.@....@..@@@@...@@.@.@@.@@.@@.@@@.@@ +@@.@@@@.@@@@.@@.@@.@@@@@@@..@@@.@@@.@@..@@@@@@@..@@@...@@@@.@@.@@@..@@@.@@..@@@.@@@@.@@@@@@@@@@.@.@@@@@@@@@..@@@@.@@@.@@@@.@@@@@@..@.@@@@@.@ +@.@@@@.@.@.@@..@@@..@.@....@@@@@.@.@@.@..@@@@@@@@@..@.@@@..@@.@@@@@@@@@..@@....@@@@@.@@.@.@@@...@.@@@.@@.@@.@@@.@@.@..@.@.@@.@@@@@@@.@@@@.@@ +@@...@@@..@@@@.@.@@@..@@@@.@@.@..@.@@..@@@.@@@@@@@@@@@@@@@@@@@@@@.@@@@..@.@@.@.@@@@.@@@..@@.@@@..@@@.@@.@.@@@.@@@.@...@@@.@@.@@.@@...@@...@@ +@.@@@.@@@@@@@@@.@@@....@..@......@@@.@@.@..@@@.@@@@@@.@@..@@@@@@@@@..@@@..@@..@@@.@.@.@@@@@.@@@.@@@@@@@.@@.@@@@.@..@@.@@..@@.@@@@@@.@..@.@.@ +@@..@...@@@@@@@..@@.@.@@.@@@@@..@@..@@..@@.@..@..@@@@..@.@@.@@@@..@..@@.@@@@.@@@@@.@@.@.@@.@@...@@@@@@@@@...@@@@.@@..@@@@@@@@.@.@@.@@.@..@@@ +.@@@.@.@.@.@@@@@@...@@...@@.@.@@.@@@@@.@.@@@@@@@..@@.@@..@.@@.@.@.@.@...@@@@@..@.@@@@.@@@@.@@@@@@@...@.@...@.@@@@@.@.@.@.@@..@.@..@@@@.@@@@. +.@@@.@.@@@@@@@.@@@.@.@.@...@.@@..@@@.@@@@@....@@@@...@@@.@.@@.@@@@..@@@@@@.@.@@.@.@....@@@@..@@@@@@@.@@@@@@.....@@.@@@@@@.....@.@.@@@@@.@@@. +@@.@...@@@@@@..@.@@@@@..@@..@@.@@@.@@@@.@@@@.@@@@@@@@@@@@.@.@.@@.@@@@@..@@.@.@.@@@...@@@@@....@@.@.@@.@..@@@.@@@@.@@@@@@@@.@@@@...@.@@@@.@.@ +@@@@@...@@...@.@@@.@@.@@@@@@@@@@@@@.@..@@@...@.@@@@@@.@.@..@@@..@@@@..@.@@@.@@@@@...@@...@@..@@..@@.@.@..@@...@@@.@@@..@@@..@@@.@.@@@.@@@@.@ +..@.@@@..@@@.@@@..@@.@@.@@@@@...@@.@@..@@@.@@@@.@@...@@.@@@@@@@@@@@@@@.@@..@@..@@@@@@..@.@..@@@@@@@....@@...@@@@@@@@@@.@@@.@@@@@@@..@.@....@ +@@@@..@@@@@@@@@@@@@@@@@@@...@.@@@@@@@@@.@.@@@@.@.@@@....@@@@@.@@...@...@@@@...@@@@.@.@@.@@.@@..@@@.@..@..@..@@@@@@..@.@@@..@@.@@..@@.@@...@. +.@@..@@.@@.@@@@..@@@.....@@@@@@@@.@@.@@.@..@@.@@@....@..@@@.@@@.@.@@@@@@@@@.@..@@@@.@.@.@@@@@..@@.@..@@.@@..@.@.@@@.@.@@@@@@@@@@@@@@.@@..@@@ +.@@@@.@..@@.@@@.@@@@@.@@@...@@@.@@@..@.@.@@@@..@.@@@.@..@.@......@.@@@.@@@.@@@@..@.@.@.@.@@@...@@@@.@.@@.@@..@@@@@.@@@@..@....@@.@@@@.@@...@ +@@@@@....@@@@.@.@.@@@@@@@@@@@@@.@@..@@..@@@@@@...@@.@@@.@@@@.@@...@@.@..@@.@@.@.@@@.@@@.@@@@.@.@@.@@@@@@.@@@@.@.@.@@@@...@@@@.@@.@@@.@@...@. +@.@@.@.@@@...@@@....@@.@.@@@@.@@@....@.@..@.@@@@.@@....@@@....@@@@@@@@@...@@@@@@@@@@.@@.@@@@@@@@.@@@....@..@.@@@.@@@@@..@..@.@....@@...@..@@ +.@.@@..@@@.@.@@@@@.@@.@..@.@@..@..@@@@@@@.@@@..@@@@..@@@@@@.@@.@...@..@@@@@@@@@@@......@.@...@@.@.@.@@@.@@@@...@.@@.@@.....@@.@.@@.@.@...@@. +@@@@@.@@.@@@.@@@@...@@@..@@@.@@@@.@@@@@@@.@@@.@@@.@.@@.@@.@@@.@@@..@.@.@@..@@@...@.@@.@@@.@@@@.@@@.@@..@@@....@..@@@@@.@@.@.@..@@@@@@@@@@@@@ +@@@@.@.@@@.@@@....@.@....@.@..@@@@@@@@..@@@..@@.@.@..@.@@@@@.@@@..@.@.@@@.@.@.@..@@..@@@@@.@@@@@@@..@@@@@...@.@@@@.@.@..@.@@@@..@.@@..@@.@@. +@.@@@@@@@@@...@.@@@....@....@.........@@@@@@.@@..@@@....@@@@@@..@@.@@@@@.@@..@@@@.@.@.@@.@..@@@.@.@..@@@@@.@@@@@.@@@@.@.@@@@@..@@@@.@@@@@.@@ +@..@@...@@..@@@@@.@@@@..@@.@.@.@@.@@@.@@@.@@@@.@@@@.@@@@.@@.@..@@@@@@.@@.@.@@@@..@@@@@@@@.@.@..@@.@@@@.@@@..@@@...@@.@@@..@@.@..@@@@@.@.@@.@ +.@@.@.@@.@@..@.@@.@@.....@@.@@...@@.@..@@@.@@@..@@@@..@@..@@..@..@@@@@@@@...@.@.@..@.@...@@@@@.@@@@..@@@@@@.@..@@@@@@@.@@@@.@@@@@@@.@@@@.@@. +...@@@@@.@@@@@@@.@@@..@@@...@.@@@@@@.@@.@@@.@@@@.@@@@@@.@@.@.@..@@.@@.@..@.@@@@@.@..@.@@@@@@@@..@@@@@@.@..@@@@@..@@@@@@@.@@..@@@.@@@@.@@@@.@ +....@.@@@....@.@@@@...@@...@@.@@@..@@..@.@@@@@..@.@..@@@@.@@@.....@@@.@.@@.@@..@.@@.@..@.@@@..@@@@@.@@@.@@.@@@.@@..@@..@.@@.@.@@@@@@@@.@@@@. +@@@.@.@@.@@@@.@@@@@@@.@..@@.@..@@@.@.@@.@@@.@@@@.@.@@.@.@@@@.@@@@...@@..@.@@@@@..@.@@@@@@@.@...@@@@@@..@.@@@@@@.@@.@...@.@@.@@@@@@@.@@.@@@.@ +@..@.@.@@@@@@@.@.@@.@@@...@..@.@.@@.@@@@.@@@.@@.@.@.@@@@@@@@@@..@@.@@@.@@.@.@@..@@@@.@@@@@..@.@.@..@@@@@.@...@@@@@@....@.@@@@@.@..@...@@@.@. +@@@@..@..@.@@.@.@.@@@@@@.@@@.@..@.@@@@@@@.@@@@.@@@@@@..@.@.@...@@@...@@@.....@.@@.@.@@@.@@@@.@@.@@..@@@....@@.@.@.@...@.@@@@..@@@@@.@@@@.@@@ +...@.@@@@@@.@@@@.@.@@.@.@.@@@@.@.@@@.@.@@@@@@@@@@.@..@.@@@..@@..@@@.@.@@@@@.@@.@@@@@@@@@@.@@@.@@@@.@@.@@.@..@@@..@@.@.@.@.@@@.@@@@@...@@@.@@ +.@@.@.@@@..@@.@@@@@.@@@@@.@..@@.@@@..@.@@..@@@@@....@.@@.@.@@@@@@@.@..@@@@@.@@.@@@@.@@.@.@@.@@@@@@.@@....@.@.@.@.@@.@@@.@@@@@@@@@@.@..@.@..@ +.@.@@@@@.@@.@@@@@.@@@.@@@@.@@@@.@@@.@@@.@.@@.@@@@@.@@@@@..@@..@@..@@@@@.@.@@@.@@@.@@..@.@@@.@.@@@@@@..@@@.@@@@@.@@@.@..@@@@@...@.@@....@@@.. +....@..@..@@@.@.@..@@..@@.@.@@@@.@@@....@@.@@.....@.@@@.@@.@@@.@@@.@..@@@@@@@.@@.@@@@@@..@.@@.@@@@.@.@@@@.@@@@..@@..@@@..@.@..@@.@@@@.@@@@@. +@@...@@@@@@@.@@....@@.@.@.@@..@...@@@@@@...@@.@@@..@@.@@@..@@@@.@..@@@......@@@@.@@.@@@.@@.@.@@@@..@@@@.@@@.@@...@.@@.@@@@@.@@@@@@...@@..@@@ +@@@@.@@@@.@.@@.@@.@@@@@..@.@@@.@@@@.@..@@.@..@.@@@@.@...@@.@..@.@@.@@@@@@.@.@@@@@@@.@@@@@.@@.@.@@@.@..@@@@@@@@@@...@@.@@@@@@@@@@@..@..@@@.@@ +..@@@@.@@@.@@.@@@@@@@@@@@.@@@@@@@@.@@@@@@.@@..@@@@..@@@..@@@@...@@@.@@@@@@@@@.@@@.@@@..@@@@@@.@@@@@@@@@@@.@@@@.@.@@@..@@@@.@@@@@@@@@@@@@@@.@ +@@@@@@@@...@.@@.@@.@@..@@.@@@..@@@..@@@.@.@.@@.@@@.@@........@@.@@@@@..@@@@@.@.@.@@@@.@.@@..@@@@@@@@@@@..@@@@@..@@@...@@@@@..@..@.@@@.@@..@. +@.@.@...@@@@..@@@.@@@@@.@..@.@@.@.@@.@.@@.@@@@@@@@@@.@@@@.@@@@.@@@...@.@@.@@@@@@@@@@...@@...@.@@@....@..@@@.@@@@@..@.@.@@@@@.@@@@...@..@@@.@ +.@.@@....@@..@@@.@@@@@...@@@@@@@@.@.@@..@@@.@@..@@@@@@.@@@@@@..@@@@..@@@@@.@@@..@@@@@.@@.@.@@@@@..@@@@..@.@..@.@@@@..@@@@@@@@.@...@.@@@.@@@@ +.@@..@@@@@.@@@.@@@@..@@@....@@@@...@.@@@@.@.@.@@@@.@....@@@@@@.@.@.@@@@.@@@..@@@@@..@@@.@@.@.@.@@...@@..@.@..@@@@@@@@.@..@..@@@@@@..@@@.@.@@ +@@@..@@@.@@@@.@@...@.@@@@..@@@@@@@@@@@.@@@.@@.@@@@.@@@.@@.@@.@.....@@@@.@@..@.@@@.@.@@@..@@@.@@@@@.@@.@@@.@.@@@@@@@@@...@@..@.@@@@@.@.@.@.@. +.@....@@@@..@.@@@@@@@.@@@...@@...@@@@@@@.@.@@.@@...@@@.@@@.@.@..@..@@@@@..@@@@@@@@@.@....@@@@...@@@..@.@....@.@@@@@.@@@..@@@@..@@@..@@@.@@@. +@@..@@..@@@@.@@..@..@@@.@@.@.@@@@@@@@@@@@@@.@@@@@@@.@@.@@@@@@.@@.@.@@.@@@..@@.@.@@@@@@@..@@...@@..@.@@.@@@@@@@@.@@.@@@@.@@@..@@@@@@....@@@.@ diff --git a/day4/app/test-input1.txt b/day4/app/test-input1.txt new file mode 100644 index 0000000..8209399 --- /dev/null +++ b/day4/app/test-input1.txt @@ -0,0 +1,10 @@ +..@@.@@@@. +@@@.@.@.@@ +@@@@@.@.@@ +@.@@@@..@. +@@.@@@@.@@ +.@@@@@@@.@ +.@.@.@.@@@ +@.@@@.@@@@ +.@@@@@@@@. +@.@.@@@.@. diff --git a/day4/day4.cabal b/day4/day4.cabal new file mode 100644 index 0000000..0ef702b --- /dev/null +++ b/day4/day4.cabal @@ -0,0 +1,77 @@ +cabal-version: 3.14 +-- The cabal-version field refers to the version of the .cabal specification, +-- and can be different from the cabal-install (the tool) version and the +-- Cabal (the library) version you are using. As such, the Cabal (the library) +-- version used must be equal or greater than the version stated in this field. +-- Starting from the specification version 2.2, the cabal-version field must be +-- the first thing in the cabal file. + +-- Initial package description 'day4' generated by +-- 'cabal init'. For further documentation, see: +-- http://haskell.org/cabal/users-guide/ +-- +-- The name of the package. +name: day4 + +-- The package version. +-- See the Haskell package versioning policy (PVP) for standards +-- guiding when and how versions should be incremented. +-- https://pvp.haskell.org +-- PVP summary: +-+------- breaking API changes +-- | | +----- non-breaking API additions +-- | | | +--- code changes with no API change +version: 0.1.0.0 + +-- A short (one-line) description of the package. +-- synopsis: + +-- A longer description of the package. +-- description: + +-- The license under which the package is released. +license: MIT + +-- The file containing the license text. +license-file: LICENSE + +-- The package author(s). +author: radumaco + +-- An email address to which users can send suggestions, bug reports, and patches. +maintainer: rmacocian@yahoo.com + +-- A copyright notice. +-- copyright: +build-type: Simple + +-- Extra doc files to be distributed with the package, such as a CHANGELOG or a README. +extra-doc-files: CHANGELOG.md + +-- Extra source files to be distributed with the package, such as examples, or a tutorial module. +-- extra-source-files: + +common warnings + ghc-options: -Wall + +executable day4 + -- Import common warning flags. + import: warnings + + -- .hs or .lhs file containing the Main module. + main-is: Main.hs + + -- Modules included in this executable, other than Main. + -- other-modules: + + -- LANGUAGE extensions used by modules in this package. + -- other-extensions: + + -- Other library packages from which modules are imported. + build-depends: base ^>=4.22.0.0, + containers >= 0.8 + + -- Directories containing source files. + hs-source-dirs: app + + -- Base language which the package is written in. + default-language: GHC2024