day 3: rewrite

use Data.Text

Signed-off-by: Amneesh Singh <natto@weirdnatto.in>
This commit is contained in:
2022-12-09 17:26:38 +05:30
parent f0fc7f696f
commit 42dcc56b13

18
day3.hs
View File

@@ -1,24 +1,28 @@
import Data.Char (isAsciiLower, isAsciiUpper) import Data.Char (isAsciiLower, isAsciiUpper)
import Data.List (intersect) import Data.List (intersect)
import Data.Text (Text)
import qualified Data.Text as T (foldl, lines, splitAt)
import Lib (readFile')
main :: IO () main :: IO ()
main = do main = do
input <- lines <$> readFile "day3.in" input <- map parse . T.lines <$> readFile' "day3.in"
putStr "Q1: " putStr "Q1: "
print $ q1 input print $ q1 input
putStr "Q2: " putStr "Q2: "
print $ q2 input print $ q2 input
q1 :: [String] -> Int q1 :: [[Int]] -> Int
q1 = q1 = sum . map (\x -> head . uncurry intersect $ splitAt (div (length x) 2) x)
sum
. map (\x -> val . head . uncurry intersect $ splitAt (div (length x) 2) x)
q2 :: [String] -> Int q2 :: [[Int]] -> Int
q2 [] = 0 q2 [] = 0
q2 input = q2 input =
let (cur, rest) = splitAt 3 input let (cur, rest) = splitAt 3 input
in (val . head . foldr1 intersect) cur + q2 rest in (head . foldr1 intersect) cur + q2 rest
parse :: Text -> [Int]
parse = T.foldl (\xs x -> val x : xs) []
val :: Char -> Int val :: Char -> Int
val c val c