From 07164de3f824e6ee83615ea56e5273d5626c03c8 Mon Sep 17 00:00:00 2001 From: Amneesh Singh Date: Sun, 8 Dec 2024 16:57:53 +0530 Subject: [PATCH] day 8 Signed-off-by: Amneesh Singh --- aoc2024.cabal | 6 ++++++ src/Day8.hs | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 src/Day8.hs diff --git a/aoc2024.cabal b/aoc2024.cabal index eadbaea..65e1de3 100644 --- a/aoc2024.cabal +++ b/aoc2024.cabal @@ -71,3 +71,9 @@ executable day7 hs-source-dirs: src main-is: Day7.hs build-depends: libaoc + +executable day8 + import: common + hs-source-dirs: src + main-is: Day8.hs + build-depends: containers diff --git a/src/Day8.hs b/src/Day8.hs new file mode 100644 index 0000000..ed15c97 --- /dev/null +++ b/src/Day8.hs @@ -0,0 +1,44 @@ +module Main where + +import qualified Data.Set as S + +type Grid = [((Int, Int), Char)] + +part1 :: Int -> Int -> Grid -> Int +part1 m n grid = + S.size . S.fromList $ + [ (x, y) + | (c1@(x1, y1), ch1) <- grid, + (c2@(x2, y2), ch2) <- grid, + ch1 == ch2, + c1 /= c2, + let x = 2 * x1 - x2, + let y = 2 * y1 - y2, + x >= 0 && y >= 0 && x < n && y < m + ] + +part2 :: Int -> Int -> Grid -> Int +part2 m n grid = + S.size . S.fromList $ + [ (x, y) + | (c1@(x1, y1), ch1) <- grid, + (c2@(x2, y2), ch2) <- grid, + ch1 == ch2, + c1 /= c2, + let xs = takeWhile (\x -> x >= 0 && x < n) [x1, 2 * x1 - x2 ..], + let ys = takeWhile (\y -> y >= 0 && y < m) [y1, 2 * y1 - y2 ..], + (x, y) <- zip xs ys + ] + +main :: IO () +main = + do + raw <- lines <$> readFile "./inputs/day8.in" + + let m = length raw + n = length $ head raw + + let grid = [((x, y), ch) | (y, row) <- zip [0 ..] raw, (x, ch) <- zip [0 ..] row, ch /= '.'] + + putStr "Part 1: " >> print (part1 m n grid) + putStr "Part 2: " >> print (part2 m n grid)