From d32a56e50ba34e6f31927259a0febdfac58d5aa0 Mon Sep 17 00:00:00 2001 From: Amneesh Singh Date: Wed, 3 Dec 2025 17:22:59 +0530 Subject: [PATCH] day 3: init Signed-off-by: Amneesh Singh --- aoc2025.cabal | 6 ++++++ flake.lock | 6 +++--- flake.nix | 4 ++-- src/Day03.hs | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 src/Day03.hs diff --git a/aoc2025.cabal b/aoc2025.cabal index 5094e88..eb3f36d 100644 --- a/aoc2025.cabal +++ b/aoc2025.cabal @@ -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 diff --git a/flake.lock b/flake.lock index 7bb550b..fe49d6b 100644 --- a/flake.lock +++ b/flake.lock @@ -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": { diff --git a/flake.nix b/flake.nix index febc0f3..cbdc53a 100644 --- a/flake.nix +++ b/flake.nix @@ -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}"; }); diff --git a/src/Day03.hs b/src/Day03.hs new file mode 100644 index 0000000..abae873 --- /dev/null +++ b/src/Day03.hs @@ -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)