-{-# LANGUAGE NegativeLiterals #-}
-{-# LANGUAGE OverloadedStrings #-}
-
import Data.Text (Text)
import qualified Data.Text.IO as TIO
import qualified Text.Megaparsec.Char.Lexer as L
import qualified Control.Applicative as CA
-import Data.IntSet (IntSet)
-import qualified Data.IntSet as S
main :: IO ()
main = do
part1 :: [Int] -> Int
-part1 = sum
+part1 = sum . map fuelRequired
part2 :: [Int] -> Int
-part2 = snd . head . dropWhile unRepeated . scanl merge (S.empty, 0) . cycle
+part2 = sum . map fuelForFuel
+
+
+fuelRequired :: Int -> Int
+fuelRequired m = (m `div` 3) - 2
-merge :: (IntSet, Int) -> Int -> (IntSet, Int)
-merge (frequencies, frequency) change = (S.insert frequency frequencies, frequency + change)
+fuelForFuel :: Int -> Int
+fuelForFuel = sum . takeWhile (> 0) . drop 1 . iterate fuelRequired
-unRepeated :: (IntSet, Int) -> Bool
-unRepeated (frequencies, frequency) = frequency `S.notMember` frequencies
-- Parse the input file
type Parser = Parsec Void Text
lexeme = L.lexeme sc
integer = lexeme L.decimal
-signedInteger = L.signed sc integer
+-- signedInteger = L.signed sc integer
-changesP = many signedInteger
+moduleP = many integer
successfulParse :: Text -> [Int]
successfulParse input =
- case parse changesP "input" input of
+ case parse moduleP "input" input of
Left _err -> [] -- TIO.putStr $ T.pack $ parseErrorPretty err
Right changes -> changes
\ No newline at end of file