Compare commits

...

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

66 changed files with 21 additions and 1473 deletions

2
.hspec
View file

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

View file

View file

@ -14,41 +14,11 @@ license: MIT
build-type: Simple
extra-source-files:
README.org
data-dir: data
library
exposed-modules:
AoC
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
AoC.Internal
other-modules:
Paths_aoc
autogen-modules:
@ -59,8 +29,7 @@ library
BlockArguments
OverloadedStrings
ImportQualifiedPost
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
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
build-depends:
base
, containers
@ -69,7 +38,7 @@ library
, text
mixins:
base hiding (Prelude)
, relude (Relude as Prelude, Relude, Relude.Unsafe, Relude.Extra.Enum)
, relude (Relude as Prelude)
default-language: GHC2021
executable aoc
@ -84,8 +53,7 @@ executable aoc
BlockArguments
OverloadedStrings
ImportQualifiedPost
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
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
build-depends:
aoc
, base
@ -95,7 +63,7 @@ executable aoc
, text
mixins:
base hiding (Prelude)
, relude (Relude as Prelude, Relude, Relude.Unsafe, Relude.Extra.Enum)
, relude (Relude as Prelude)
default-language: GHC2021
test-suite doctest
@ -111,8 +79,7 @@ test-suite doctest
BlockArguments
OverloadedStrings
ImportQualifiedPost
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
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
build-tool-depends:
doctest:doctest
build-depends:
@ -124,16 +91,14 @@ test-suite doctest
, text
mixins:
base hiding (Prelude)
, relude (Relude as Prelude, Relude, Relude.Unsafe, Relude.Extra.Enum)
, relude (Relude as Prelude)
default-language: Haskell2010
test-suite spec
type: exitcode-stdio-1.0
main-is: Spec.hs
other-modules:
AoCSpec.UtilSpec
AoCSpec.Y2023Spec
SpecHook
AoCSpec.InternalSpec
Paths_aoc
autogen-modules:
Paths_aoc
@ -143,8 +108,7 @@ test-suite spec
BlockArguments
OverloadedStrings
ImportQualifiedPost
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
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
cpp-options: -DTEST
build-tool-depends:
hspec-discover:hspec-discover
@ -160,5 +124,5 @@ test-suite spec
, text
mixins:
base hiding (Prelude)
, relude (Relude as Prelude, Relude, Relude.Unsafe, Relude.Extra.Enum)
, relude (Relude as Prelude)
default-language: GHC2021

File diff suppressed because it is too large Load diff

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

View file

39
gen.sh
View file

@ -1,39 +0,0 @@
#!/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,15 +9,13 @@ description: "Advent-Of-Code"
extra-source-files:
- README.org
data-dir: data
dependencies:
- name: base
mixin:
- hiding (Prelude)
- name: relude
mixin:
- (Relude as Prelude, Relude, Relude.Unsafe, Relude.Extra.Enum)
- (Relude as Prelude)
- containers
- text
- megaparsec
@ -26,7 +24,6 @@ ghc-options:
- -Weverything
- -Wno-implicit-prelude
- -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-all-missed-specialisations # See missed-specialisations
- -Wno-unsafe # Dont use Safe Haskell warnings
@ -43,11 +40,9 @@ default-extensions:
- BlockArguments
- OverloadedStrings
- ImportQualifiedPost
- DerivingStrategies
library:
source-dirs: src
generated-other-modules: Paths_aoc
verbatim:
default-language: GHC2021

View file

@ -1,32 +1,21 @@
{-# LANGUAGE OverloadedStrings #-}
module AoC (
defaultMain,
runAoC,
module AoC.Day,
module AoC.Year,
) where
import AoC.Day
import AoC.Riddle
import AoC.Year
import Control.Exception qualified as Exception
import System.IO (hPutStrLn)
import System.IO.Error qualified as IOError
import AoC.Y2023 qualified as Y2023
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"
runAoC :: [String] -> IO ()
runAoC _args = putStrLn "Hello"
handleError :: IOError.IOError -> IO ()
handleError e = do
hPutStrLn stderr $ "I ran into an issue: " <> show e
defaultMain :: IO ()
defaultMain = Exception.catch (runAoC Y2023 D01 >>= print) handleError
defaultMain = do
args <- getArgs
Exception.catch (runAoC args) handleError

View file

@ -1,29 +0,0 @@
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)

View file

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

View file

@ -1,20 +0,0 @@
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,57 +0,0 @@
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

View file

@ -1,24 +0,0 @@
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]

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,57 +0,0 @@
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.UtilSpec (spec) where
module AoCSpec.InternalSpec (spec) where
import AoC.Util
import AoC.Internal
import Test.Hspec

View file

@ -1,10 +0,0 @@
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]

View file

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