Compare commits

..

No commits in common. "b37d5f2dd44784a6b19a9759a2018204ea21d1c4" and "bf184dd8d3ce7af39b0a6850686f0a4ca81a7cb2" have entirely different histories.

7 changed files with 11 additions and 98 deletions

View file

@ -9,12 +9,10 @@ license = "MIT"
sourcedir = "src" sourcedir = "src"
langversion >= 0.6.0 langversion >= 0.6.0
depends = contrib
executable = advent-of-code-2024 executable = advent-of-code-2024
main = Main main = Main
modules = Main, Utils, AllDays, modules = Main, Utils, AllDays,
Data.Problem, Data.Problem,
Day1.Part1, Day1.Part2, Day1.Part1, Day1.Part2,
Day2.Part1, Day2.Part2, Day2.Part1, Day2.Part2
Day3.Part1, Day3.Part2

View file

@ -4,5 +4,3 @@ import public Day1.Part1
import public Day1.Part2 import public Day1.Part2
import public Day2.Part1 import public Day2.Part1
import public Day2.Part2 import public Day2.Part2
import public Day3.Part1
import public Day3.Part2

View file

@ -73,31 +73,16 @@ allProblems (Pr day' part') = do
--- REFLECTION --- REFLECTION
solutionName : Problem -> Name
solutionName (Pr day part) =
NS (MkNS ["Part" ++ show (partNat part),
"Day" ++ show day]) `{solution}
public export public export
fetchSolution : Problem -> Elab (String -> String) fetchSolution : Problem -> Elab (String -> String)
fetchSolution pr = do fetchSolution (Pr day part) = do
let name = solutionName pr let name =
NS (MkNS ["Part" ++ show (partNat part),
"Day" ++ show day]) `{solution}
check `(\s => show (~(IVar EmptyFC name) s)) check `(\s => show (~(IVar EmptyFC name) s))
<|> fail "\{show name} does not exist as a valid solution" <|> fail "\{show name} does not exist as a valid solution"
public export public export
fetchAllSols : (latest : Problem) -> Elab (SortedMap Problem (String -> String)) fetchAllSols : (latest : Problem) -> Elab (SortedMap Problem (String -> String))
fetchAllSols pr = fetchAllSols pr =
let prs = allProblems pr fromList <$> traverse (\p => (p,) <$> fetchSolution p) (allProblems pr)
list = foldr (\pr,tt => `(Prelude.(::)
(Builtin.MkPair
(Data.Problem.Pr
(Prelude.fromInteger
~(IPrimVal EmptyFC $ BI $ natToInteger pr.day))
~(case pr.part of
Part1 => `(Data.Problem.Part1)
Part2 => `(Data.Problem.Part2)))
(\s => show (~(IVar EmptyFC $ solutionName pr) s)))
~(tt))) `(Prelude.Nil) prs
ttimp = `(Data.SortedMap.fromList ~(list))
in check ttimp

View file

@ -1,26 +0,0 @@
module Day3.Part1
import Data.Either
import Data.Maybe
import Data.String
import Data.String.Parser
import Utils
--- PARSING
export
mul : Parser Integer
mul = do
skip $ string "mul("
x <- integer
skip $ string ","
y <- integer
skip $ string ")"
pure $ x * y
--- SOLUTION
export
solution : String -> Integer
solution = fromMaybe 0 . map (sum . fst) . eitherToMaybe .
parse (many $ scan mul)

View file

@ -1,26 +0,0 @@
module Day3.Part2
import Data.Either
import Data.Maybe
import Data.String
import Data.String.Parser
import Utils
import Day3.Part1
--- PARSING
export
mulsDo : Parser (List Integer)
mulsDo = map join $ many $ do
s <- scan $ string "do()" <|> string "don't()"
if s == "do()"
then many $ scanWhile (requireFailure (string "do()" <|> string "don't()")) mul
else pure []
--- SOLUTION
export
solution : String -> Integer
solution = fromMaybe 0 . map (sum . fst) . eitherToMaybe .
parse mulsDo . ("do()" ++)

View file

@ -1,6 +1,10 @@
module Main module Main
import Data.List1
import Data.Maybe
import Data.String
import Data.SortedMap import Data.SortedMap
import Data.SortedMap.Dependent
import Data.Problem import Data.Problem
import Utils import Utils
@ -14,7 +18,7 @@ import AllDays
||| The latest problem that has been solved. ||| The latest problem that has been solved.
-- NOTE: UPDATE AFTER EACH SOLUTION -- NOTE: UPDATE AFTER EACH SOLUTION
latest : Problem latest : Problem
latest = Pr 3 Part2 latest = Pr 2 Part2
solMap : SortedMap Problem (String -> String) solMap : SortedMap Problem (String -> String)

View file

@ -2,29 +2,9 @@ module Utils
import Data.Maybe import Data.Maybe
import Data.String import Data.String
import Data.String.Parser
%default total %default total
export export
parseNat : String -> Maybe Nat parseNat : String -> Maybe Nat
parseNat = map cast . filter (> 0) . parseInteger parseNat = map cast . filter (> 0) . parseInteger
export
lookahead : Functor m => ParseT m a -> ParseT m a
lookahead p = P $ \s => map (\case
OK r _ => OK r s
Fail i err => Fail i err)
(p.runParser s)
export covering
until : Monad m => ParseT m a -> ParseT m ()
until p = skip $ many (requireFailure p *> skip (satisfy (const True)))
export covering
scan : Monad m => ParseT m a -> ParseT m a
scan p = until p *> p
export covering
scanWhile : Monad m => ParseT m a -> ParseT m b -> ParseT m b
scanWhile w p = many (lookahead w *> requireFailure p *> skip (satisfy (const True))) *> p