2025-12-02 01:37:59 +00:00
|
|
|
module Main (main) where
|
|
|
|
|
|
2025-12-08 12:48:49 +00:00
|
|
|
import Pre
|
|
|
|
|
|
2026-01-05 18:31:34 +00:00
|
|
|
import Data.Finite
|
2026-01-04 02:14:35 +00:00
|
|
|
import Data.Functor.Contravariant
|
2025-12-02 09:11:42 +00:00
|
|
|
import Data.Text.IO qualified as T
|
2025-12-02 15:22:21 +00:00
|
|
|
import Puzzles.Day1 qualified as Day1
|
2025-12-13 11:19:54 +00:00
|
|
|
import Puzzles.Day10 qualified as Day10
|
2025-12-02 15:22:21 +00:00
|
|
|
import Puzzles.Day2 qualified as Day2
|
2025-12-03 11:18:04 +00:00
|
|
|
import Puzzles.Day3 qualified as Day3
|
2025-12-04 10:00:15 +00:00
|
|
|
import Puzzles.Day4 qualified as Day4
|
2025-12-05 12:56:40 +00:00
|
|
|
import Puzzles.Day5 qualified as Day5
|
2025-12-08 13:09:28 +00:00
|
|
|
import Puzzles.Day6 qualified as Day6
|
2025-12-08 13:32:15 +00:00
|
|
|
import Puzzles.Day7 qualified as Day7
|
2025-12-08 13:40:55 +00:00
|
|
|
import Puzzles.Day8 qualified as Day8
|
2025-12-09 10:27:50 +00:00
|
|
|
import Puzzles.Day9 qualified as Day9
|
2026-01-05 14:37:25 +00:00
|
|
|
import Text.Pretty.Simple (pPrintForceColor)
|
2025-12-02 00:32:49 +00:00
|
|
|
|
|
|
|
|
main :: IO ()
|
2025-12-02 08:23:53 +00:00
|
|
|
main =
|
2026-01-05 14:37:25 +00:00
|
|
|
(pPrintForceColor =<<) $ runTests () $ TestTree "tests" pure $ flip map enumerate \isRealData@(bool "examples" "real" -> t) ->
|
2026-01-05 15:04:47 +00:00
|
|
|
TestTree (mkTestName t) pure $ flip
|
2026-01-05 14:37:25 +00:00
|
|
|
map
|
2025-12-30 17:23:45 +00:00
|
|
|
[ Day1.puzzle
|
|
|
|
|
, Day2.puzzle
|
|
|
|
|
, Day3.puzzle
|
|
|
|
|
, Day4.puzzle
|
|
|
|
|
, Day5.puzzle
|
|
|
|
|
, Day6.puzzle
|
|
|
|
|
, Day7.puzzle
|
|
|
|
|
, Day8.puzzle
|
|
|
|
|
, Day9.puzzle
|
|
|
|
|
, Day10.puzzle
|
|
|
|
|
]
|
2026-01-05 15:04:47 +00:00
|
|
|
\Puzzle{number = show -> pt, parser, parts, extraTests} ->
|
2026-01-05 15:04:58 +00:00
|
|
|
TestTree
|
|
|
|
|
(mkTestName pt)
|
|
|
|
|
( \() -> do
|
|
|
|
|
let fp = "../inputs/" <> t <> "/" <> pt
|
|
|
|
|
input <-
|
|
|
|
|
either (fail . ("parse failure: " <>) . errorBundlePretty) pure
|
|
|
|
|
. runParser (parser isRealData <* eof) fp
|
|
|
|
|
=<< T.readFile fp
|
|
|
|
|
let (rs, os) =
|
2026-01-06 17:39:18 +00:00
|
|
|
(lookupHList (fst . getCompose) &&& foldHListF (withConstrained HConsC . snd . getCompose) HNilC) $
|
2026-01-06 17:14:03 +00:00
|
|
|
mapHListF (\(Compose (Fanout (f, Op o))) -> Compose $ (o &&& id) $ f input) parts
|
2026-01-05 15:04:58 +00:00
|
|
|
in pure (input, rs, os)
|
|
|
|
|
)
|
2026-01-05 18:31:34 +00:00
|
|
|
$ ( finites <&> \(n@(show . succ @Int . fromIntegral -> nt)) ->
|
2026-01-05 15:31:16 +00:00
|
|
|
TestTree
|
|
|
|
|
(mkTestName nt)
|
2026-01-05 18:31:34 +00:00
|
|
|
(\(_, rs, _) -> golden ("../outputs/" <> t <> "/" <> pt <> "/" <> nt) $ rs n <> "\n")
|
2026-01-05 15:31:16 +00:00
|
|
|
[]
|
2026-01-05 15:04:58 +00:00
|
|
|
)
|
2026-01-05 15:24:35 +00:00
|
|
|
<> let ts = extraTests isRealData ("../outputs/" <> t <> "/" <> pt <> "/extra/")
|
|
|
|
|
in if null ts
|
|
|
|
|
then []
|
|
|
|
|
else [TestTree "extra" (\(input, _, os) -> pure (input, os)) ts]
|