27 lines
521 B
Haskell
27 lines
521 B
Haskell
import Control.Arrow
|
|
import Control.Lens
|
|
import Data.List
|
|
import Data.List.Split
|
|
|
|
main :: IO ()
|
|
main = do
|
|
input <- lines <$> readFile "input"
|
|
print $ both %~ sum $ (day3a &&& day3b) input
|
|
|
|
day3a :: [String] -> [Int]
|
|
day3a =
|
|
map $
|
|
convert .
|
|
uncurry intersect . (both %~ nub) . (splitAt =<< flip div 2 . length)
|
|
|
|
day3b :: [String] -> [Int]
|
|
day3b = map (convert . foldl1 intersect) . chunksOf 3
|
|
|
|
convert :: String -> Int
|
|
convert =
|
|
(\x ->
|
|
if x > 90
|
|
then x - 96
|
|
else x - 38) .
|
|
fromEnum . head
|