{-# LANGUAGE LambdaCase #-} module Main where import Data.Functor import Data.List import Data.List.Extra data ℜ where None :: ℜ Num :: Int -> ℜ deriving Eq instance Show ℜ where show None = show '.' show (Num n) = show n parse :: String -> [ℜ] parse s = zip [0..] (trim s) >>= \(i,a) -> replicate (read [a]) (if even i then Num (i `div` 2) else None) sort1 :: [ℜ] -> [ℜ] sort1 s | None `notElem` s = s | otherwise = case last s of None -> sort1 $ init s n -> sort1 $ takeWhile (/= None) s ++ [n] ++ drop 1 (dropWhile (/= None) (init s)) sort2 :: [ℜ] -> [ℜ] sort2 = undefined solve :: ([ℜ] -> [ℜ]) -> [ℜ] -> Int solve f s = let fixed = (\(Num n) -> n) <$> f s in sum $ zipWith (*) fixed [0..] main :: IO () main = readFile "inputs/9.example" <&> parse >>= \i -> print (solve sort1 i) >> print (solve sort2 i)