haskell: 2023 15 a
This commit is contained in:
parent
b97721fa17
commit
2a7dbfb9c8
|
@ -28,6 +28,7 @@ library
|
||||||
Day08
|
Day08
|
||||||
Day09
|
Day09
|
||||||
Day10
|
Day10
|
||||||
|
Day15
|
||||||
|
|
||||||
other-modules:
|
other-modules:
|
||||||
Misc
|
Misc
|
||||||
|
|
|
@ -11,7 +11,8 @@ import Utils (readInput)
|
||||||
--import qualified Day07
|
--import qualified Day07
|
||||||
--import qualified Day08
|
--import qualified Day08
|
||||||
--import qualified Day09
|
--import qualified Day09
|
||||||
import qualified Day10
|
--import qualified Day10
|
||||||
|
import qualified Day15
|
||||||
|
|
||||||
|
|
||||||
run :: (Show b, Show c)
|
run :: (Show b, Show c)
|
||||||
|
@ -40,4 +41,5 @@ main = do
|
||||||
--run 07 Day07.parse Day07.solveA Day07.solveB
|
--run 07 Day07.parse Day07.solveA Day07.solveB
|
||||||
--run 08 Day08.parse Day08.solveA Day08.solveB
|
--run 08 Day08.parse Day08.solveA Day08.solveB
|
||||||
--run 09 Day09.parse Day09.solveA Day09.solveB
|
--run 09 Day09.parse Day09.solveA Day09.solveB
|
||||||
run 10 Day10.parse Day10.solveA Day10.solveB
|
--run 10 Day10.parse Day10.solveA Day10.solveB
|
||||||
|
run 15 Day15.parse Day15.solveA Day15.solveA
|
||||||
|
|
29
2023/haskell/solutions/Day15.hs
Normal file
29
2023/haskell/solutions/Day15.hs
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
module Day15 (parse, solveA) where
|
||||||
|
|
||||||
|
import Data.Text (Text)
|
||||||
|
import qualified Data.Text as T
|
||||||
|
import Data.Char (ord, isSpace)
|
||||||
|
|
||||||
|
|
||||||
|
input :: Text
|
||||||
|
input = "rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7"
|
||||||
|
|
||||||
|
|
||||||
|
parse :: Text -> Either String [Text]
|
||||||
|
parse = Right . T.splitOn "," . T.filter (not . isSpace)
|
||||||
|
|
||||||
|
hash :: Text -> Int
|
||||||
|
hash = foldl step 0 . T.unpack
|
||||||
|
where
|
||||||
|
step :: Int -> Char -> Int
|
||||||
|
step curr = (`rem` 256) . (17 *) . (curr +) . ord
|
||||||
|
|
||||||
|
solveA :: [Text] -> Int
|
||||||
|
solveA = sum . map hash
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- >>> solveA <$> parse input
|
||||||
|
-- Right 1320
|
||||||
|
|
|
@ -13,6 +13,7 @@ import qualified Day07
|
||||||
import qualified Day08
|
import qualified Day08
|
||||||
import qualified Day09
|
import qualified Day09
|
||||||
import qualified Day10
|
import qualified Day10
|
||||||
|
import qualified Day15
|
||||||
|
|
||||||
|
|
||||||
day01 :: Test
|
day01 :: Test
|
||||||
|
@ -275,6 +276,18 @@ day10 =
|
||||||
\L.L7LFJ|||||FJL7||LJ\n\
|
\L.L7LFJ|||||FJL7||LJ\n\
|
||||||
\L7JLJL-JLJLJL--JLJ.L\n"
|
\L7JLJL-JLJLJL--JLJ.L\n"
|
||||||
|
|
||||||
|
day15 :: Test
|
||||||
|
day15 =
|
||||||
|
let parsedA1 = Day15.parse inputA1
|
||||||
|
parsedA2 = Day15.parse inputA2
|
||||||
|
in TestList
|
||||||
|
[ TestCase $ assertEqual "A" (Right 52) (Day15.solveA <$> parsedA1)
|
||||||
|
, TestCase $ assertEqual "A" (Right 1320) (Day15.solveA <$> parsedA2)
|
||||||
|
]
|
||||||
|
where
|
||||||
|
inputA1 = "HASH"
|
||||||
|
inputA2 = "rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7"
|
||||||
|
|
||||||
tests :: Test
|
tests :: Test
|
||||||
tests = TestList
|
tests = TestList
|
||||||
[ TestLabel "01" day01
|
[ TestLabel "01" day01
|
||||||
|
@ -287,6 +300,7 @@ tests = TestList
|
||||||
, TestLabel "08" day08
|
, TestLabel "08" day08
|
||||||
, TestLabel "09" day09
|
, TestLabel "09" day09
|
||||||
, TestLabel "10" day10
|
, TestLabel "10" day10
|
||||||
|
, TestLabel "15" day15
|
||||||
]
|
]
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
|
|
Loading…
Reference in a new issue