From e7e11b78a6a0d29fb78c6632cf2bb1350aeb533e Mon Sep 17 00:00:00 2001 From: Neil Smith Date: Mon, 25 Nov 2024 11:10:40 +0000 Subject: [PATCH 1/1] quest 1 --- .gitignore | 42 +++++++++++++++++ CHANGELOG.md | 5 ++ app/Main.hs | 4 ++ code.cabal.generated | 77 +++++++++++++++++++++++++++++++ everybody-codes.cabal | 103 ++++++++++++++++++++++++++++++++++++++++++ quest01/Main.hs | 46 +++++++++++++++++++ 6 files changed, 277 insertions(+) create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 app/Main.hs create mode 100644 code.cabal.generated create mode 100644 everybody-codes.cabal create mode 100644 quest01/Main.hs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1a0ee39 --- /dev/null +++ b/.gitignore @@ -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 index 0000000..62714ab --- /dev/null +++ b/CHANGELOG.md @@ -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 index 0000000..65ae4a0 --- /dev/null +++ b/app/Main.hs @@ -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 index 0000000..4fc27a3 --- /dev/null +++ b/code.cabal.generated @@ -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 index 0000000..1631921 --- /dev/null +++ b/everybody-codes.cabal @@ -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 index 0000000..02c881e --- /dev/null +++ b/quest01/Main.hs @@ -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) -- 2.34.1