day 1: rewrite

use Data.Text

Signed-off-by: Amneesh Singh <natto@weirdnatto.in>
This commit is contained in:
2022-12-09 17:26:22 +05:30
parent f927bbf69e
commit 4ad59fb820
2 changed files with 19 additions and 12 deletions

8
Lib.hs Normal file
View File

@@ -0,0 +1,8 @@
module Lib (readFile') where
import qualified Data.ByteString as B (readFile)
import Data.Text (Text)
import qualified Data.Text.Encoding as T (decodeUtf8)
readFile' :: FilePath -> IO Text
readFile' f = T.decodeUtf8 <$> B.readFile f

23
day1.hs
View File

@@ -1,22 +1,21 @@
import Data.Either (isLeft, rights)
import Data.List (sortOn)
import Data.Ord (Down (Down))
import Data.Text (Text)
import qualified Data.Text as T (lines)
import qualified Data.Text.Read as T (decimal)
import Lib (readFile')
main :: IO ()
main = do
input <- lines <$> readFile "day1.in"
input <- map T.decimal . T.lines <$> readFile' "day1.in"
putStr "Q1: "
print $ q1 input
print . maximum $ calories input
putStr "Q2: "
print $ q2 input
print . sum . take 3 . sortOn Down $ calories input
q1 :: [String] -> Int
q1 = maximum . calories
q2 :: [String] -> Int
q2 = sum . take 3 . sortOn Down . calories
calories :: [String] -> [Int]
calories :: [Either String (Int, Text)] -> [Int]
calories [] = []
calories input =
let (cur, rest) = break null input
in sum (map read cur) : calories (drop 1 rest)
let (cur, rest) = break isLeft input
in sum (map fst $ rights cur) : calories (drop 1 rest)