Haskell variant for day seven

This commit is contained in:
2024-12-07 14:55:33 +01:00
parent 79e5c9069e
commit 8286304531
12 changed files with 284 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
module Common (Equation) where
type Equation = (Int, [Int])

View File

@@ -0,0 +1,6 @@
module Lib
( someFunc
) where
someFunc :: IO ()
someFunc = putStrLn "someFunc"

View File

@@ -0,0 +1,20 @@
module Task1 (task1) where
import Common
task1 :: [Equation] -> Int
task1 equations = sum $ map processEquation equations
processEquation :: Equation -> Int
processEquation (result, params) =
if brute (reverse params) result
then result
else 0
where
brute :: [Int] -> Int -> Bool
brute [] _ = False
brute [param] subResult = subResult == param
brute (param:subParams) subResult
| brute subParams $ subResult - param = True
| subResult `mod` param == 0 && brute subParams (subResult `div` param) = True
| otherwise = False

View File

@@ -0,0 +1,34 @@
module Task2 (task2, unconcat, unconcatStrings) where
import Common
import Data.List (isSuffixOf)
task2 :: [Equation] -> Int
task2 equations = sum $ map processEquation equations
processEquation :: Equation -> Int
processEquation (result, params) =
if brute (reverse params) result
then result
else 0
where
brute :: [Int] -> Int -> Bool
brute [] _ = False
brute [param] subResult = subResult == param
brute (param:subParams) subResult
| brute subParams $ subResult - param = True
| subResult `mod` param == 0 && brute subParams (subResult `div` param) = True
| otherwise = case unconcat subResult param of
Nothing -> False
Just rest -> brute subParams rest
unconcat :: Int -> Int -> Maybe Int
unconcat result suffix = do
rest <- unconcatStrings (show result) (show suffix)
Just $ read rest
unconcatStrings :: String -> String -> Maybe String
unconcatStrings sResult sSuffix
| sSuffix == sResult = Nothing
| sSuffix `isSuffixOf` sResult = Just $ take ((length sResult) - (length sSuffix)) sResult
| otherwise = Nothing