Day 1
This commit is contained in:
commit
955e33330f
9 changed files with 1175 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
result*
|
||||||
|
*.cabal
|
9
Main.hs
Normal file
9
Main.hs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
module Main where
|
||||||
|
|
||||||
|
import Day1
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
putStrLn "AoC 2023"
|
||||||
|
putStrLn "Day 1"
|
||||||
|
Day1.main
|
25
flake.lock
Normal file
25
flake.lock
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1703134684,
|
||||||
|
"narHash": "sha256-SQmng1EnBFLzS7WSRyPM9HgmZP2kLJcPAz+Ug/nug6o=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "d6863cbcbbb80e71cecfc03356db1cda38919523",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
37
flake.nix
Normal file
37
flake.nix
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
{
|
||||||
|
description = "A Hello World for AoC";
|
||||||
|
inputs.nixpkgs.url = "nixpkgs";
|
||||||
|
outputs = { self, nixpkgs }:
|
||||||
|
let
|
||||||
|
supportedSystems = [ "x86_64-linux" "x86_64-darwin" ];
|
||||||
|
forAllSystems = f: nixpkgs.lib.genAttrs supportedSystems (system: f system);
|
||||||
|
nixpkgsFor = forAllSystems (system: import nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
overlays = [ self.overlay ];
|
||||||
|
});
|
||||||
|
in
|
||||||
|
{
|
||||||
|
overlay = (final: prev: {
|
||||||
|
aoc23 = final.haskellPackages.callCabal2nix "aoc23" ./. {};
|
||||||
|
});
|
||||||
|
packages = forAllSystems (system: {
|
||||||
|
aoc23 = nixpkgsFor.${system}.aoc23;
|
||||||
|
});
|
||||||
|
defaultPackage = forAllSystems (system: self.packages.${system}.aoc23);
|
||||||
|
checks = self.packages;
|
||||||
|
devShell = forAllSystems (system: let haskellPackages = nixpkgsFor.${system}.haskellPackages;
|
||||||
|
in haskellPackages.shellFor {
|
||||||
|
packages = p: [self.packages.${system}.aoc23];
|
||||||
|
withHoogle = true;
|
||||||
|
buildInputs = with haskellPackages; [
|
||||||
|
haskell-language-server
|
||||||
|
ghcid
|
||||||
|
cabal-install
|
||||||
|
];
|
||||||
|
# Change the prompt to show that you are in a devShell
|
||||||
|
shellHook = ''
|
||||||
|
hpack
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
4
inputs/day1-test.input
Normal file
4
inputs/day1-test.input
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
1abc2
|
||||||
|
pqr3stu8vwx
|
||||||
|
a1b2c3d4e5f
|
||||||
|
treb7uchet
|
7
inputs/day1-test2.input
Normal file
7
inputs/day1-test2.input
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
two1nine
|
||||||
|
eightwothree
|
||||||
|
abcone2threexyz
|
||||||
|
xtwone3four
|
||||||
|
4nineeightseven2
|
||||||
|
zoneight234
|
||||||
|
7pqrstsixteen
|
1000
inputs/day1.input
Normal file
1000
inputs/day1.input
Normal file
File diff suppressed because it is too large
Load diff
23
package.yaml
Normal file
23
package.yaml
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
name: aoc23
|
||||||
|
|
||||||
|
ghc-options: -Wall -threaded
|
||||||
|
|
||||||
|
default-extensions:
|
||||||
|
- OverloadedStrings
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
- base == 4.*
|
||||||
|
- attoparsec
|
||||||
|
- bytestring
|
||||||
|
|
||||||
|
executables:
|
||||||
|
aoc23:
|
||||||
|
main: Main.hs
|
||||||
|
dependencies:
|
||||||
|
- aoc23
|
||||||
|
|
||||||
|
library:
|
||||||
|
source-dirs: src
|
||||||
|
exposed-modules:
|
||||||
|
- Day1
|
||||||
|
|
68
src/Day1.hs
Normal file
68
src/Day1.hs
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
{-# OPTIONS_GHC -Wno-unused-do-bind #-}
|
||||||
|
|
||||||
|
module Day1 where
|
||||||
|
|
||||||
|
import Data.Semigroup
|
||||||
|
import Data.Char
|
||||||
|
import Data.String
|
||||||
|
import qualified Data.ByteString as B
|
||||||
|
import qualified Data.ByteString.Char8 as Char8
|
||||||
|
import Data.Attoparsec.Lazy
|
||||||
|
import Data.Attoparsec.ByteString.Char8 (letter_ascii)
|
||||||
|
import Data.Either (fromRight)
|
||||||
|
|
||||||
|
-- import Debug.Trace
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
day1input <- lines <$> readFile "inputs/day1.input"
|
||||||
|
putStrLn "Part 1 result:"
|
||||||
|
print $ part1 day1input
|
||||||
|
putStrLn "Part 2 result:"
|
||||||
|
print $ part2 day1input
|
||||||
|
|
||||||
|
part1 :: [String] -> Sum Int
|
||||||
|
part1 = foldMap go
|
||||||
|
where
|
||||||
|
go :: String -> Sum Int
|
||||||
|
go = glueFirstLast . map (\c -> read [c]) . filter isNumber
|
||||||
|
|
||||||
|
part2 :: [String] -> Sum Int
|
||||||
|
part2 = foldMap (glueFirstLast . getNumbers)
|
||||||
|
|
||||||
|
glueFirstLast :: [Int] -> Sum Int
|
||||||
|
glueFirstLast xs = Sum $ 10 * head xs + last xs
|
||||||
|
|
||||||
|
getNumbers :: String -> [Int]
|
||||||
|
getNumbers = fromRight [] . parseOnly numberParser . fromString
|
||||||
|
|
||||||
|
numberParser :: Parser [Int]
|
||||||
|
numberParser = do
|
||||||
|
s <- concat <$> (parseN `sepBy` letter_ascii)
|
||||||
|
pure $ concatMap toInt s
|
||||||
|
where
|
||||||
|
parseN = many' . choice $ map string
|
||||||
|
["oneight","threeight","fiveight","sevenine","nineight","eightwo","eighthree","twone"
|
||||||
|
,"one","two","three","four","five","six","seven","eight","nine"
|
||||||
|
, "1","2","3","4","5","6","7","8","9"
|
||||||
|
]
|
||||||
|
toInt :: B.ByteString -> [Int]
|
||||||
|
toInt "one" = [1]
|
||||||
|
toInt "two" = [2]
|
||||||
|
toInt "three" = [3]
|
||||||
|
toInt "four" = [4]
|
||||||
|
toInt "five" = [5]
|
||||||
|
toInt "six" = [6]
|
||||||
|
toInt "seven" = [7]
|
||||||
|
toInt "eight" = [8]
|
||||||
|
toInt "nine" = [9]
|
||||||
|
toInt "oneight" = [1,8]
|
||||||
|
toInt "threeight" = [3,8]
|
||||||
|
toInt "fiveight" = [5,8]
|
||||||
|
toInt "sevenine" = [7,9]
|
||||||
|
toInt "nineight" = [9,8]
|
||||||
|
toInt "eighthree" = [8,3]
|
||||||
|
toInt "eightwo" = [8,2]
|
||||||
|
toInt "twone" = [2,1]
|
||||||
|
toInt ss = [read $ Char8.unpack ss]
|
Loading…
Reference in a new issue