Compare commits

...

No commits in common. "88cbe81d089c6c85ebaf387009937b4dba2e1e8b" and "04636aacc56a7671aac689f7da228788e42e29c6" have entirely different histories.

66 changed files with 1473 additions and 21 deletions

2
.hspec Normal file
View file

@ -0,0 +1,2 @@
--rerun
--rerun-all-on-success

0
README.org Normal file
View file

View file

@ -14,11 +14,41 @@ license: MIT
build-type: Simple build-type: Simple
extra-source-files: extra-source-files:
README.org README.org
data-dir: data
library library
exposed-modules: exposed-modules:
AoC AoC
AoC.Internal AoC.Day
AoC.Riddle
AoC.Util
AoC.Y2023
AoC.Y2023.D01
AoC.Y2023.D02
AoC.Y2023.D03
AoC.Y2023.D04
AoC.Y2023.D05
AoC.Y2023.D06
AoC.Y2023.D07
AoC.Y2023.D08
AoC.Y2023.D09
AoC.Y2023.D10
AoC.Y2023.D11
AoC.Y2023.D12
AoC.Y2023.D13
AoC.Y2023.D14
AoC.Y2023.D15
AoC.Y2023.D16
AoC.Y2023.D17
AoC.Y2023.D18
AoC.Y2023.D19
AoC.Y2023.D20
AoC.Y2023.D21
AoC.Y2023.D22
AoC.Y2023.D23
AoC.Y2023.D24
AoC.Y2023.D25
AoC.Year
other-modules: other-modules:
Paths_aoc Paths_aoc
autogen-modules: autogen-modules:
@ -29,7 +59,8 @@ library
BlockArguments BlockArguments
OverloadedStrings OverloadedStrings
ImportQualifiedPost ImportQualifiedPost
ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -fdefer-typed-holes -Wno-unused-packages DerivingStrategies
ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-missing-kind-signatures -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -fdefer-typed-holes -Wno-unused-packages
build-depends: build-depends:
base base
, containers , containers
@ -38,7 +69,7 @@ library
, text , text
mixins: mixins:
base hiding (Prelude) base hiding (Prelude)
, relude (Relude as Prelude) , relude (Relude as Prelude, Relude, Relude.Unsafe, Relude.Extra.Enum)
default-language: GHC2021 default-language: GHC2021
executable aoc executable aoc
@ -53,7 +84,8 @@ executable aoc
BlockArguments BlockArguments
OverloadedStrings OverloadedStrings
ImportQualifiedPost ImportQualifiedPost
ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -fdefer-typed-holes -Wno-unused-packages DerivingStrategies
ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-missing-kind-signatures -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -fdefer-typed-holes -Wno-unused-packages
build-depends: build-depends:
aoc aoc
, base , base
@ -63,7 +95,7 @@ executable aoc
, text , text
mixins: mixins:
base hiding (Prelude) base hiding (Prelude)
, relude (Relude as Prelude) , relude (Relude as Prelude, Relude, Relude.Unsafe, Relude.Extra.Enum)
default-language: GHC2021 default-language: GHC2021
test-suite doctest test-suite doctest
@ -79,7 +111,8 @@ test-suite doctest
BlockArguments BlockArguments
OverloadedStrings OverloadedStrings
ImportQualifiedPost ImportQualifiedPost
ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -fdefer-typed-holes -Wno-unused-packages DerivingStrategies
ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-missing-kind-signatures -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -fdefer-typed-holes -Wno-unused-packages
build-tool-depends: build-tool-depends:
doctest:doctest doctest:doctest
build-depends: build-depends:
@ -91,14 +124,16 @@ test-suite doctest
, text , text
mixins: mixins:
base hiding (Prelude) base hiding (Prelude)
, relude (Relude as Prelude) , relude (Relude as Prelude, Relude, Relude.Unsafe, Relude.Extra.Enum)
default-language: Haskell2010 default-language: Haskell2010
test-suite spec test-suite spec
type: exitcode-stdio-1.0 type: exitcode-stdio-1.0
main-is: Spec.hs main-is: Spec.hs
other-modules: other-modules:
AoCSpec.InternalSpec AoCSpec.UtilSpec
AoCSpec.Y2023Spec
SpecHook
Paths_aoc Paths_aoc
autogen-modules: autogen-modules:
Paths_aoc Paths_aoc
@ -108,7 +143,8 @@ test-suite spec
BlockArguments BlockArguments
OverloadedStrings OverloadedStrings
ImportQualifiedPost ImportQualifiedPost
ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -fdefer-typed-holes -Wno-unused-packages DerivingStrategies
ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-missing-kind-signatures -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -fdefer-typed-holes -Wno-unused-packages
cpp-options: -DTEST cpp-options: -DTEST
build-tool-depends: build-tool-depends:
hspec-discover:hspec-discover hspec-discover:hspec-discover
@ -124,5 +160,5 @@ test-suite spec
, text , text
mixins: mixins:
base hiding (Prelude) base hiding (Prelude)
, relude (Relude as Prelude) , relude (Relude as Prelude, Relude, Relude.Unsafe, Relude.Extra.Enum)
default-language: GHC2021 default-language: GHC2021

1000
data/Y2023/D01/riddle Normal file

File diff suppressed because it is too large Load diff

0
data/Y2023/D02/riddle Normal file
View file

0
data/Y2023/D03/riddle Normal file
View file

0
data/Y2023/D04/riddle Normal file
View file

0
data/Y2023/D05/riddle Normal file
View file

0
data/Y2023/D06/riddle Normal file
View file

0
data/Y2023/D07/riddle Normal file
View file

0
data/Y2023/D08/riddle Normal file
View file

0
data/Y2023/D09/riddle Normal file
View file

0
data/Y2023/D10/riddle Normal file
View file

0
data/Y2023/D11/riddle Normal file
View file

0
data/Y2023/D12/riddle Normal file
View file

0
data/Y2023/D13/riddle Normal file
View file

0
data/Y2023/D14/riddle Normal file
View file

0
data/Y2023/D15/riddle Normal file
View file

0
data/Y2023/D16/riddle Normal file
View file

0
data/Y2023/D17/riddle Normal file
View file

0
data/Y2023/D18/riddle Normal file
View file

0
data/Y2023/D19/riddle Normal file
View file

0
data/Y2023/D20/riddle Normal file
View file

0
data/Y2023/D21/riddle Normal file
View file

0
data/Y2023/D22/riddle Normal file
View file

0
data/Y2023/D23/riddle Normal file
View file

0
data/Y2023/D24/riddle Normal file
View file

0
data/Y2023/D25/riddle Normal file
View file

39
gen.sh Executable file
View file

@ -0,0 +1,39 @@
#!/usr/bin/env bash
Y="$1"; shift
if [ -z "$Y" ]; then
Y="$(date +%Y)"
fi
fday="$1"; shift
tday="$1"; shift
if [ -z "$fday" ]; then
fday=1
tday=25
fi
if [ -z "$tday" ]; then
tday="${fday}"
fi
days=($(seq $fday $tday))
if ! grep -q "Y${Y}" src/AoC/Year.hs; then
sed -i -e "s/\(\(\s\+\)= Y0000\)/\1\n\2| Y${Y}/" src/AoC/Year.hs
fi
mkdir -p "src/AoC/Y${Y}"
if ! test -f "src/AoC/Y${Y}.hs"; then
sed -e "s/Y0000/Y${Y}/g" template/Y0000.hs > "src/AoC/Y${Y}.hs"
fi
for d in "${days[@]}"; do
d=$(printf "%02d" "$d")
mkdir -p "data/Y${Y}/D${d}"
touch "data/Y${Y}/D${d}/riddle"
touch "data/Y${Y}/D${d}/result"
if ! test -f "src/AoC/Y${Y}/D${d}.hs"; then
sed -e "s/Y0000/Y${Y}/g" -e "s/D00/D${d}/g" template/D00.hs > "src/AoC/Y${Y}/D${d}.hs"
fi
done

View file

@ -9,13 +9,15 @@ description: "Advent-Of-Code"
extra-source-files: extra-source-files:
- README.org - README.org
data-dir: data
dependencies: dependencies:
- name: base - name: base
mixin: mixin:
- hiding (Prelude) - hiding (Prelude)
- name: relude - name: relude
mixin: mixin:
- (Relude as Prelude) - (Relude as Prelude, Relude, Relude.Unsafe, Relude.Extra.Enum)
- containers - containers
- text - text
- megaparsec - megaparsec
@ -24,6 +26,7 @@ ghc-options:
- -Weverything - -Weverything
- -Wno-implicit-prelude - -Wno-implicit-prelude
- -Wno-missing-import-lists # Requires explicit imports of _every_ function (e.g. $); too strict - -Wno-missing-import-lists # Requires explicit imports of _every_ function (e.g. $); too strict
- -Wno-missing-kind-signatures
- -Wno-missed-specialisations # When GHC cant specialize a polymorphic function. No big deal and requires fixing underlying libraries to solve. - -Wno-missed-specialisations # When GHC cant specialize a polymorphic function. No big deal and requires fixing underlying libraries to solve.
- -Wno-all-missed-specialisations # See missed-specialisations - -Wno-all-missed-specialisations # See missed-specialisations
- -Wno-unsafe # Dont use Safe Haskell warnings - -Wno-unsafe # Dont use Safe Haskell warnings
@ -40,9 +43,11 @@ default-extensions:
- BlockArguments - BlockArguments
- OverloadedStrings - OverloadedStrings
- ImportQualifiedPost - ImportQualifiedPost
- DerivingStrategies
library: library:
source-dirs: src source-dirs: src
generated-other-modules: Paths_aoc
verbatim: verbatim:
default-language: GHC2021 default-language: GHC2021

View file

@ -1,21 +1,32 @@
{-# LANGUAGE OverloadedStrings #-}
module AoC ( module AoC (
defaultMain, defaultMain,
runAoC,
module AoC.Day,
module AoC.Year,
) where ) where
import AoC.Day
import AoC.Riddle
import AoC.Year
import Control.Exception qualified as Exception import Control.Exception qualified as Exception
import System.IO (hPutStrLn) import System.IO (hPutStrLn)
import System.IO.Error qualified as IOError import System.IO.Error qualified as IOError
runAoC :: [String] -> IO () import AoC.Y2023 qualified as Y2023
runAoC _args = putStrLn "Hello"
runAoC :: (MonadIO m) => Year -> Day -> m (Either Text Solution)
runAoC y d = do
riddle <- loadRiddle y d
solve y d riddle
solve :: (MonadIO m) => Year -> Day -> Riddle -> m (Either Text Solution)
solve Y2023 = Y2023.solve
solve y = \_ _ -> pure $ Left $ show y <> ": not implementedi"
handleError :: IOError.IOError -> IO () handleError :: IOError.IOError -> IO ()
handleError e = do handleError e = do
hPutStrLn stderr $ "I ran into an issue: " <> show e hPutStrLn stderr $ "I ran into an issue: " <> show e
defaultMain :: IO () defaultMain :: IO ()
defaultMain = do defaultMain = Exception.catch (runAoC Y2023 D01 >>= print) handleError
args <- getArgs
Exception.catch (runAoC args) handleError

29
src/AoC/Day.hs Normal file
View file

@ -0,0 +1,29 @@
module AoC.Day (Day (..)) where
data Day
= D01
| D02
| D03
| D04
| D05
| D06
| D07
| D08
| D09
| D10
| D11
| D12
| D13
| D14
| D15
| D16
| D17
| D18
| D19
| D20
| D21
| D22
| D23
| D24
| D25
deriving stock (Read, Show, Eq, Ord, Enum)

20
src/AoC/Riddle.hs Normal file
View file

@ -0,0 +1,20 @@
module AoC.Riddle (
Riddle (..),
Error (..),
Solution (..),
loadRiddle,
) where
import AoC.Util (readFileUtf8)
import AoC.Day
import AoC.Year
type Riddle = Text
type Error = Text
type Solution = [Integer]
loadRiddle :: (MonadIO m) => Year -> Day -> m Riddle
loadRiddle y d = readFileUtf8 inputFile
where
inputFile = intercalate "/" ["data", show y, show d, "riddle"]

View file

@ -1,5 +1,5 @@
-- | Internal module in order to facilitate testability. -- | Internal module in order to facilitate testability.
module AoC.Internal (solveRiddle, readFileUtf8) where module AoC.Util (solveRiddle, readFileUtf8) where
readFileUtf8 :: (MonadIO m) => FilePath -> m Text readFileUtf8 :: (MonadIO m) => FilePath -> m Text
readFileUtf8 = fmap (decodeUtf8With lenientDecode) . readFileBS readFileUtf8 = fmap (decodeUtf8With lenientDecode) . readFileBS

57
src/AoC/Y2023.hs Normal file
View file

@ -0,0 +1,57 @@
module AoC.Y2023 (solve) where
import AoC.Day
import AoC.Riddle
import AoC.Y2023.D01 qualified as D01
import AoC.Y2023.D02 qualified as D02
import AoC.Y2023.D03 qualified as D03
import AoC.Y2023.D04 qualified as D04
import AoC.Y2023.D05 qualified as D05
import AoC.Y2023.D06 qualified as D06
import AoC.Y2023.D07 qualified as D07
import AoC.Y2023.D08 qualified as D08
import AoC.Y2023.D09 qualified as D09
import AoC.Y2023.D10 qualified as D10
import AoC.Y2023.D11 qualified as D11
import AoC.Y2023.D12 qualified as D12
import AoC.Y2023.D13 qualified as D13
import AoC.Y2023.D14 qualified as D14
import AoC.Y2023.D15 qualified as D15
import AoC.Y2023.D16 qualified as D16
import AoC.Y2023.D17 qualified as D17
import AoC.Y2023.D18 qualified as D18
import AoC.Y2023.D19 qualified as D19
import AoC.Y2023.D20 qualified as D20
import AoC.Y2023.D21 qualified as D21
import AoC.Y2023.D22 qualified as D22
import AoC.Y2023.D23 qualified as D23
import AoC.Y2023.D24 qualified as D24
import AoC.Y2023.D25 qualified as D25
solve :: (MonadIO m) => Day -> Text -> m (Either Error Solution)
solve D01 = D01.solve
solve D02 = D02.solve
solve D03 = D03.solve
solve D04 = D04.solve
solve D05 = D05.solve
solve D06 = D06.solve
solve D07 = D07.solve
solve D08 = D08.solve
solve D09 = D09.solve
solve D10 = D10.solve
solve D11 = D11.solve
solve D12 = D12.solve
solve D13 = D13.solve
solve D14 = D14.solve
solve D15 = D15.solve
solve D16 = D16.solve
solve D17 = D17.solve
solve D18 = D18.solve
solve D19 = D19.solve
solve D20 = D20.solve
solve D21 = D21.solve
solve D22 = D22.solve
solve D23 = D23.solve
solve D24 = D24.solve
solve D25 = D25.solve

24
src/AoC/Y2023/D01.hs Normal file
View file

@ -0,0 +1,24 @@
module AoC.Y2023.D01 (solve) where
import AoC.Riddle
import Data.Char (digitToInt, isDigit)
import Relude.Unsafe (fromJust)
digits :: String -> [Int]
digits = fmap digitToInt . filter isDigit
digits' :: String -> NonEmpty Int
digits' = fromJust . nonEmpty . digits
calibrationValue :: String -> Int
calibrationValue s = firstDigit * 10 + lastDigit
where
ds = digits' s
firstDigit = head ds
lastDigit = last ds
solvePart1 :: Text -> Integer
solvePart1 = fromIntegral . sum . fmap (calibrationValue . toString) . lines
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve input = pure $ Right [solvePart1 input]

6
src/AoC/Y2023/D02.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D02 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D03.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D03 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D04.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D04 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D05.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D05 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D06.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D06 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D07.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D07 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D08.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D08 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D09.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D09 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D10.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D10 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D11.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D11 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D12.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D12 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D13.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D13 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D14.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D14 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D15.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D15 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D16.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D16 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D17.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D17 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D18.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D18 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D19.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D19 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D20.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D20 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D21.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D21 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D22.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D22 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D23.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D23 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D24.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D24 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Y2023/D25.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y2023.D25 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

6
src/AoC/Year.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Year (Year (..)) where
data Year
= Y0000
| Y2023
deriving stock (Read, Show, Eq, Ord, Enum)

6
template/D00.hs Normal file
View file

@ -0,0 +1,6 @@
module AoC.Y0000.D00 (solve) where
import AoC.Riddle
solve :: (MonadIO m) => Text -> m (Either Text Solution)
solve _ = pure $ Left "not yet implemented"

57
template/Y0000.hs Normal file
View file

@ -0,0 +1,57 @@
module AoC.Y0000 (solve) where
import AoC.Day
import AoC.Riddle
import AoC.Y0000.D01 qualified as D01
import AoC.Y0000.D02 qualified as D02
import AoC.Y0000.D03 qualified as D03
import AoC.Y0000.D04 qualified as D04
import AoC.Y0000.D05 qualified as D05
import AoC.Y0000.D06 qualified as D06
import AoC.Y0000.D07 qualified as D07
import AoC.Y0000.D08 qualified as D08
import AoC.Y0000.D09 qualified as D09
import AoC.Y0000.D10 qualified as D10
import AoC.Y0000.D11 qualified as D11
import AoC.Y0000.D12 qualified as D12
import AoC.Y0000.D13 qualified as D13
import AoC.Y0000.D14 qualified as D14
import AoC.Y0000.D15 qualified as D15
import AoC.Y0000.D16 qualified as D16
import AoC.Y0000.D17 qualified as D17
import AoC.Y0000.D18 qualified as D18
import AoC.Y0000.D19 qualified as D19
import AoC.Y0000.D20 qualified as D20
import AoC.Y0000.D21 qualified as D21
import AoC.Y0000.D22 qualified as D22
import AoC.Y0000.D23 qualified as D23
import AoC.Y0000.D24 qualified as D24
import AoC.Y0000.D25 qualified as D25
solve :: (MonadIO m) => Day -> Text -> m (Either Error Solution)
solve D01 = D01.solve
solve D02 = D02.solve
solve D03 = D03.solve
solve D04 = D04.solve
solve D05 = D05.solve
solve D06 = D06.solve
solve D07 = D07.solve
solve D08 = D08.solve
solve D09 = D09.solve
solve D10 = D10.solve
solve D11 = D11.solve
solve D12 = D12.solve
solve D13 = D13.solve
solve D14 = D14.solve
solve D15 = D15.solve
solve D16 = D16.solve
solve D17 = D17.solve
solve D18 = D18.solve
solve D19 = D19.solve
solve D20 = D20.solve
solve D21 = D21.solve
solve D22 = D22.solve
solve D23 = D23.solve
solve D24 = D24.solve
solve D25 = D25.solve

View file

@ -1,6 +1,6 @@
module AoCSpec.InternalSpec (spec) where module AoCSpec.UtilSpec (spec) where
import AoC.Internal import AoC.Util
import Test.Hspec import Test.Hspec

View file

@ -0,0 +1,10 @@
module AoCSpec.Y2023Spec (spec) where
import AoC
import Test.Hspec
spec :: Spec
spec = do
describe "Day 1" do
it "calculates correctly" do
runAoC Y2023 D01 `shouldReturn` Right [54331]

6
test/spec/SpecHook.hs Normal file
View file

@ -0,0 +1,6 @@
module SpecHook (hook) where
import Test.Hspec
hook :: Spec -> Spec
hook = parallel