quest 1 main
authorNeil Smith <NeilNjae@users.noreply.github.com>
Mon, 25 Nov 2024 11:10:40 +0000 (11:10 +0000)
committerNeil Smith <NeilNjae@users.noreply.github.com>
Mon, 25 Nov 2024 11:10:40 +0000 (11:10 +0000)
.gitignore [new file with mode: 0644]
CHANGELOG.md [new file with mode: 0644]
app/Main.hs [new file with mode: 0644]
code.cabal.generated [new file with mode: 0644]
everybody-codes.cabal [new file with mode: 0644]
quest01/Main.hs [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..1a0ee39
--- /dev/null
@@ -0,0 +1,42 @@
+# 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
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644 (file)
index 0000000..62714ab
--- /dev/null
@@ -0,0 +1,5 @@
+# Revision history for code
+
+## 0.1.0.0 -- YYYY-mm-dd
+
+* First version. Released on an unsuspecting world.
diff --git a/app/Main.hs b/app/Main.hs
new file mode 100644 (file)
index 0000000..65ae4a0
--- /dev/null
@@ -0,0 +1,4 @@
+module Main where
+
+main :: IO ()
+main = putStrLn "Hello, Haskell!"
diff --git a/code.cabal.generated b/code.cabal.generated
new file mode 100644 (file)
index 0000000..4fc27a3
--- /dev/null
@@ -0,0 +1,77 @@
+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
diff --git a/everybody-codes.cabal b/everybody-codes.cabal
new file mode 100644 (file)
index 0000000..1631921
--- /dev/null
@@ -0,0 +1,103 @@
+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
diff --git a/quest01/Main.hs b/quest01/Main.hs
new file mode 100644 (file)
index 0000000..02c881e
--- /dev/null
@@ -0,0 +1,46 @@
+-- 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)