Compare commits
No commits in common. "88cbe81d089c6c85ebaf387009937b4dba2e1e8b" and "04636aacc56a7671aac689f7da228788e42e29c6" have entirely different histories.
88cbe81d08
...
04636aacc5
66 changed files with 1473 additions and 21 deletions
2
.hspec
Normal file
2
.hspec
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
--rerun
|
||||||
|
--rerun-all-on-success
|
||||||
0
README.org
Normal file
0
README.org
Normal file
56
aoc.cabal
56
aoc.cabal
|
|
@ -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
1000
data/Y2023/D01/riddle
Normal file
File diff suppressed because it is too large
Load diff
0
data/Y2023/D02/riddle
Normal file
0
data/Y2023/D02/riddle
Normal file
0
data/Y2023/D03/riddle
Normal file
0
data/Y2023/D03/riddle
Normal file
0
data/Y2023/D04/riddle
Normal file
0
data/Y2023/D04/riddle
Normal file
0
data/Y2023/D05/riddle
Normal file
0
data/Y2023/D05/riddle
Normal file
0
data/Y2023/D06/riddle
Normal file
0
data/Y2023/D06/riddle
Normal file
0
data/Y2023/D07/riddle
Normal file
0
data/Y2023/D07/riddle
Normal file
0
data/Y2023/D08/riddle
Normal file
0
data/Y2023/D08/riddle
Normal file
0
data/Y2023/D09/riddle
Normal file
0
data/Y2023/D09/riddle
Normal file
0
data/Y2023/D10/riddle
Normal file
0
data/Y2023/D10/riddle
Normal file
0
data/Y2023/D11/riddle
Normal file
0
data/Y2023/D11/riddle
Normal file
0
data/Y2023/D12/riddle
Normal file
0
data/Y2023/D12/riddle
Normal file
0
data/Y2023/D13/riddle
Normal file
0
data/Y2023/D13/riddle
Normal file
0
data/Y2023/D14/riddle
Normal file
0
data/Y2023/D14/riddle
Normal file
0
data/Y2023/D15/riddle
Normal file
0
data/Y2023/D15/riddle
Normal file
0
data/Y2023/D16/riddle
Normal file
0
data/Y2023/D16/riddle
Normal file
0
data/Y2023/D17/riddle
Normal file
0
data/Y2023/D17/riddle
Normal file
0
data/Y2023/D18/riddle
Normal file
0
data/Y2023/D18/riddle
Normal file
0
data/Y2023/D19/riddle
Normal file
0
data/Y2023/D19/riddle
Normal file
0
data/Y2023/D20/riddle
Normal file
0
data/Y2023/D20/riddle
Normal file
0
data/Y2023/D21/riddle
Normal file
0
data/Y2023/D21/riddle
Normal file
0
data/Y2023/D22/riddle
Normal file
0
data/Y2023/D22/riddle
Normal file
0
data/Y2023/D23/riddle
Normal file
0
data/Y2023/D23/riddle
Normal file
0
data/Y2023/D24/riddle
Normal file
0
data/Y2023/D24/riddle
Normal file
0
data/Y2023/D25/riddle
Normal file
0
data/Y2023/D25/riddle
Normal file
39
gen.sh
Executable file
39
gen.sh
Executable 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
|
||||||
|
|
@ -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 can’t specialize a polymorphic function. No big deal and requires fixing underlying libraries to solve.
|
- -Wno-missed-specialisations # When GHC can’t 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 # Don’t use Safe Haskell warnings
|
- -Wno-unsafe # Don’t 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
|
||||||
|
|
||||||
|
|
|
||||||
25
src/AoC.hs
25
src/AoC.hs
|
|
@ -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
29
src/AoC/Day.hs
Normal 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
20
src/AoC/Riddle.hs
Normal 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"]
|
||||||
|
|
@ -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
57
src/AoC/Y2023.hs
Normal 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
24
src/AoC/Y2023/D01.hs
Normal 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
6
src/AoC/Y2023/D02.hs
Normal 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
6
src/AoC/Y2023/D03.hs
Normal 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
6
src/AoC/Y2023/D04.hs
Normal 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
6
src/AoC/Y2023/D05.hs
Normal 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
6
src/AoC/Y2023/D06.hs
Normal 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
6
src/AoC/Y2023/D07.hs
Normal 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
6
src/AoC/Y2023/D08.hs
Normal 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
6
src/AoC/Y2023/D09.hs
Normal 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
6
src/AoC/Y2023/D10.hs
Normal 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
6
src/AoC/Y2023/D11.hs
Normal 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
6
src/AoC/Y2023/D12.hs
Normal 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
6
src/AoC/Y2023/D13.hs
Normal 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
6
src/AoC/Y2023/D14.hs
Normal 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
6
src/AoC/Y2023/D15.hs
Normal 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
6
src/AoC/Y2023/D16.hs
Normal 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
6
src/AoC/Y2023/D17.hs
Normal 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
6
src/AoC/Y2023/D18.hs
Normal 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
6
src/AoC/Y2023/D19.hs
Normal 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
6
src/AoC/Y2023/D20.hs
Normal 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
6
src/AoC/Y2023/D21.hs
Normal 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
6
src/AoC/Y2023/D22.hs
Normal 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
6
src/AoC/Y2023/D23.hs
Normal 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
6
src/AoC/Y2023/D24.hs
Normal 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
6
src/AoC/Y2023/D25.hs
Normal 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
6
src/AoC/Year.hs
Normal 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
6
template/D00.hs
Normal 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
57
template/Y0000.hs
Normal 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
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
10
test/spec/AoCSpec/Y2023Spec.hs
Normal file
10
test/spec/AoCSpec/Y2023Spec.hs
Normal 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
6
test/spec/SpecHook.hs
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
module SpecHook (hook) where
|
||||||
|
|
||||||
|
import Test.Hspec
|
||||||
|
|
||||||
|
hook :: Spec -> Spec
|
||||||
|
hook = parallel
|
||||||
Loading…
Add table
Add a link
Reference in a new issue