From ba485f4cd35623bff73c18dc73e6bb3cb342f707 Mon Sep 17 00:00:00 2001 From: Amneesh Singh Date: Sat, 6 Dec 2025 19:34:16 +0530 Subject: [PATCH] day 6: init Signed-off-by: Amneesh Singh --- aoc2025.cabal | 5 +++++ flake.nix | 2 +- src/Day06.hs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 src/Day06.hs diff --git a/aoc2025.cabal b/aoc2025.cabal index dc6d7fb..13ce7f7 100644 --- a/aoc2025.cabal +++ b/aoc2025.cabal @@ -55,3 +55,8 @@ executable day05 hs-source-dirs: src main-is: Day05.hs build-depends: libaoc + +executable day06 + import: common + hs-source-dirs: src + main-is: Day06.hs diff --git a/flake.nix b/flake.nix index 0d7db4b..d2d58b2 100644 --- a/flake.nix +++ b/flake.nix @@ -45,7 +45,7 @@ name = n: "day${(if n < 10 then "0" else "") + toString n}"; in with pkgs.lib; - genAttrs (map name (range 1 5)) (n: { + genAttrs (map name (range 1 6)) (n: { type = "app"; program = "${self'.packages.aoc2025}/bin/${n}"; }); diff --git a/src/Day06.hs b/src/Day06.hs new file mode 100644 index 0000000..ea77096 --- /dev/null +++ b/src/Day06.hs @@ -0,0 +1,48 @@ +import Data.Bifunctor (Bifunctor (bimap)) +import Data.List (transpose) + +data Operation = Add | Multiply deriving (Show) + +type ProblemRaw = ([String], Operation) + +type Problem = ([Int], Operation) + +-- We are not going to use Parsec this time, so let's just group up the columns manually based on the +-- operator's index then we can simply use transpose later for part2 as well + +parse :: String -> [ProblemRaw] +parse raw = + let ls = lines raw + opLine = last ls + numLines = init ls + + ops :: [(Operation, Int)] + ops = + [ (if c == '+' then Add else Multiply, i) + | (c, i) <- zip opLine [0 ..], + c /= ' ' + ] + + starts = map snd ops + slices line = + [ take (next - start - 1) (drop start line) + | (start, next) <- zip starts (drop 1 starts ++ [length line + 1]) + ] + in zip (transpose (map slices numLines)) (map fst ops) + +solve :: [Problem] -> Int +solve = sum . map solveProblem + where + solveProblem :: Problem -> Int + solveProblem (nums, Multiply) = product nums + solveProblem (nums, Add) = sum nums + +main :: IO () +main = + do + raw <- readFile "./inputs/day6.in" + let rawProblems = parse raw + problems1 = map (bimap (map read) id) rawProblems + problems2 = map (bimap (map read . transpose) id) rawProblems + putStr "Part 1: " >> print (solve $ problems1) + putStr "Part 2: " >> print (solve $ problems2)