@@ -35,3 +35,9 @@ executable day02
|
||||
hs-source-dirs: src
|
||||
main-is: Day02.hs
|
||||
build-depends: libaoc
|
||||
|
||||
executable day03
|
||||
import: common
|
||||
hs-source-dirs: src
|
||||
main-is: Day03.hs
|
||||
build-depends: libaoc
|
||||
|
||||
6
flake.lock
generated
6
flake.lock
generated
@@ -35,11 +35,11 @@
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1764587062,
|
||||
"narHash": "sha256-hdFa0TAVQAQLDF31cEW3enWmBP+b592OvHs6WVe3D8k=",
|
||||
"lastModified": 1764642553,
|
||||
"narHash": "sha256-mvbFFzVBhVK1FjyPHZGMAKpNiqkr7k++xIwy+p/NQvA=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "c1cb7d097cb250f6e1904aacd5f2ba5ffd8a49ce",
|
||||
"rev": "f720de59066162ee879adcc8c79e15c51fe6bfb4",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
||||
@@ -39,13 +39,13 @@
|
||||
};
|
||||
};
|
||||
|
||||
packages.default = self'.packages.aoc2024;
|
||||
packages.default = self'.packages.aoc2025;
|
||||
apps =
|
||||
let
|
||||
name = n: "day${(if n < 10 then "0" else "") + toString n}";
|
||||
in
|
||||
with pkgs.lib;
|
||||
genAttrs (map name (range 1 1)) (n: {
|
||||
genAttrs (map name (range 1 3)) (n: {
|
||||
type = "app";
|
||||
program = "${self'.packages.aoc2025}/bin/${n}";
|
||||
});
|
||||
|
||||
36
src/Day03.hs
Normal file
36
src/Day03.hs
Normal file
@@ -0,0 +1,36 @@
|
||||
import qualified AoC as A (extract)
|
||||
import Data.Char (digitToInt)
|
||||
import Text.Parsec (digit, many1, newline, parse, sepEndBy1)
|
||||
import Text.Parsec.String (Parser)
|
||||
|
||||
type Battery = Int
|
||||
|
||||
type Bank = [Battery]
|
||||
|
||||
parseBanks :: Parser [Bank]
|
||||
parseBanks = sepEndBy1 parseBank newline
|
||||
where
|
||||
parseBank :: Parser Bank
|
||||
parseBank = many1 parseBattery
|
||||
|
||||
parseBattery :: Parser Battery
|
||||
parseBattery = digitToInt <$> digit
|
||||
|
||||
joltages :: Int -> [Bank] -> Int
|
||||
joltages n = sum . map (joltage n)
|
||||
where
|
||||
joltage :: Int -> Bank -> Int
|
||||
joltage 1 xs = maximum xs
|
||||
joltage k xs =
|
||||
let len = length xs
|
||||
window = take (len - k + 1) xs
|
||||
(mx, (* (-1)) -> i) = maximum $ zip window [-1, -2 ..]
|
||||
in mx * 10 ^ (k - 1) + joltage (k - 1) (drop i xs)
|
||||
|
||||
main :: IO ()
|
||||
main =
|
||||
do
|
||||
raw <- readFile "./inputs/day3.in"
|
||||
let banks = A.extract $ parse parseBanks "" raw
|
||||
putStr "Part 1: " >> print (joltages 2 banks)
|
||||
putStr "Part 2: " >> print (joltages 12 banks)
|
||||
Reference in New Issue
Block a user