--- /dev/null
+# Extensionless files
+*
+!/**/
+!*.*
+
+# Haskell bits
+dist
+dist-*
+cabal-dev
+*.o
+*.hi
+*.chi
+*.chs.h
+*.dyn_o
+*.dyn_hi
+.hpc
+.hsenv
+.cabal-sandbox/
+cabal.sandbox.config
+*.prof
+*.aux
+*.hp
+*.eventlog
+cabal.project.local
+.HTF/
+
+
+# IPython / IHaskell notebook checkpoints
+.ipynb*
+
+# Sublime text
+*.sublime-workspace
+
+# Logs
+*.log
+
+# Profile exports
+*.ps
+
+# KDE
+.directory
+
--- /dev/null
+# Revision history for code
+
+## 0.1.0.0 -- YYYY-mm-dd
+
+* First version. Released on an unsuspecting world.
--- /dev/null
+module Main where
+
+main :: IO ()
+main = putStrLn "Hello, Haskell!"
--- /dev/null
+cabal-version: 3.4
+-- The cabal-version field refers to the version of the .cabal specification,
+-- and can be different from the cabal-install (the tool) version and the
+-- Cabal (the library) version you are using. As such, the Cabal (the library)
+-- version used must be equal or greater than the version stated in this field.
+-- Starting from the specification version 2.2, the cabal-version field must be
+-- the first thing in the cabal file.
+
+-- Initial package description 'code' generated by
+-- 'cabal init'. For further documentation, see:
+-- http://haskell.org/cabal/users-guide/
+--
+-- The name of the package.
+name: code
+
+-- The package version.
+-- See the Haskell package versioning policy (PVP) for standards
+-- guiding when and how versions should be incremented.
+-- https://pvp.haskell.org
+-- PVP summary: +-+------- breaking API changes
+-- | | +----- non-breaking API additions
+-- | | | +--- code changes with no API change
+version: 0.1.0.0
+
+-- A short (one-line) description of the package.
+-- synopsis:
+
+-- A longer description of the package.
+-- description:
+
+-- The license under which the package is released.
+license: MIT
+
+-- The file containing the license text.
+license-file: LICENSE
+
+-- The package author(s).
+author: Neil Smith
+
+-- An email address to which users can send suggestions, bug reports, and patches.
+maintainer: NeilNjae@users.noreply.github.com
+
+-- A copyright notice.
+-- copyright:
+category: Game
+build-type: Simple
+
+-- Extra doc files to be distributed with the package, such as a CHANGELOG or a README.
+extra-doc-files: CHANGELOG.md
+
+-- Extra source files to be distributed with the package, such as examples, or a tutorial module.
+-- extra-source-files:
+
+common warnings
+ ghc-options: -Wall
+
+executable code
+ -- Import common warning flags.
+ import: warnings
+
+ -- .hs or .lhs file containing the Main module.
+ main-is: Main.hs
+
+ -- Modules included in this executable, other than Main.
+ -- other-modules:
+
+ -- LANGUAGE extensions used by modules in this package.
+ -- other-extensions:
+
+ -- Other library packages from which modules are imported.
+ build-depends: base ^>=4.19.1.0
+
+ -- Directories containing source files.
+ hs-source-dirs: app
+
+ -- Base language which the package is written in.
+ default-language: GHC2021
--- /dev/null
+cabal-version: 3.4
+name: everybody-codes
+version: 0.1.0.0
+
+-- A short (one-line) description of the package.
+synopsis: Solutions for the Everybody Codes challenges
+
+-- A longer description of the package.
+-- description:
+
+-- A URL where users can report bugs.
+-- bug-reports:
+
+-- The license under which the package is released.
+-- license:
+author: Neil Smith
+maintainer: NeilNjae@users.noreply.github.com
+
+-- A copyright notice.
+-- copyright:
+-- category:
+extra-source-files:
+ CHANGELOG.md
+ README.md
+
+common common-extensions
+ default-extensions: AllowAmbiguousTypes
+ , ApplicativeDo
+ , BangPatterns
+ , BlockArguments
+ , DataKinds
+ , DeriveFoldable
+ , DeriveFunctor
+ , DeriveGeneric
+ , DeriveTraversable
+ -- , DuplicateRecordFields
+ , EmptyCase
+ , FlexibleContexts
+ , FlexibleInstances
+ , FunctionalDependencies
+ , GADTs
+ , GeneralizedNewtypeDeriving
+ , ImplicitParams
+ , KindSignatures
+ , LambdaCase
+ , MonadComprehensions
+ , MonoLocalBinds
+ , MultiParamTypeClasses
+ , MultiWayIf
+ , NamedFieldPuns
+ , NegativeLiterals
+ , NumDecimals
+ -- , NoFieldSelectors
+ -- , OverloadedLists
+ -- , OverloadedRecordDot
+ , OverloadedStrings
+ , PartialTypeSignatures
+ , PatternGuards
+ , PatternSynonyms
+ , PolyKinds
+ , RankNTypes
+ , RecordWildCards
+ , ScopedTypeVariables
+ , TemplateHaskell
+ -- , TransformListComp
+ , TupleSections
+ , TypeApplications
+ , TypeFamilies
+ , TypeOperators
+ , ViewPatterns
+
+common build-directives
+ build-depends: base >=4.19
+ default-language: GHC2021
+ hs-source-dirs: ., app, src
+ -- other-modules: AoC
+ ghc-options: -O2
+ -Wall
+ -threaded
+ -rtsopts "-with-rtsopts=-N"
+
+executable everbody-codes
+ main-is: Main.hs
+
+ -- Modules included in this executable, other than Main.
+ -- other-modules:
+
+ -- LANGUAGE extensions used by modules in this package.
+ -- other-extensions:
+ build-depends: base >=4.19
+ hs-source-dirs: app, src
+ default-language: GHC2021
+
+library
+ import: common-extensions
+ build-depends: base >=4.19
+ hs-source-dirs: ., app, src
+ -- exposed-modules: AoC
+
+executable quest01
+ import: common-extensions, build-directives
+ main-is: quest01/Main.hs
+ build-depends: split
--- /dev/null
+-- Writeup at https://work.njae.me.uk/2023/12/01/advent-of-code-2023-day-01/
+
+import Data.Char
+import Data.List
+import Data.List.Split
+
+main :: IO ()
+main =
+ do potions1 <- readFile "../data/algorithmia/everybody_codes_e2024_q01_p1.txt"
+ potions2 <- readFile "../data/algorithmia/everybody_codes_e2024_q01_p2.txt"
+ potions3 <- readFile "../data/algorithmia/everybody_codes_e2024_q01_p3.txt"
+ print $ part1 potions1
+ print $ part2 potions2
+ print $ part3 potions3
+
+
+part1, part2 :: String -> Int
+part1 = sum . (fmap potionsNeeded)
+
+part2 potions = sum (fmap potionsOfGroup pairs)
+ where pairs = chunksOf 2 potions
+
+part3 potions = sum (fmap potionsOfGroup groups)
+ where groups = chunksOf 3 potions
+
+-- part2 :: [String] -> Int
+-- part2 calibrations = sum $ fmap (getCalibration . replaceNums) calibrations
+
+potionsNeeded :: Char -> Int
+potionsNeeded 'B' = 1
+potionsNeeded 'C' = 3
+potionsNeeded 'D' = 5
+potionsNeeded _ = 0
+
+isMonster :: Char -> Bool
+isMonster 'x' = False
+isMonster _ = True
+
+potionsOfGroup :: String -> Int
+potionsOfGroup ms = directPotions + (monsterCount * (monsterCount - 1))
+ where monsterCount = length $ filter isMonster ms
+ directPotions = sum (fmap potionsNeeded ms)
+
+
+ -- | all isMonster ms = 2 + sum (fmap potionsNeeded ms)
+ -- | otherwise = sum (fmap potionsNeeded ms)