diff options
author | Orangerot <purple@orangerot.dev> | 2024-05-17 15:41:55 +0200 |
---|---|---|
committer | Orangerot <purple@orangerot.dev> | 2024-12-01 05:55:27 +0100 |
commit | 347d2f1fbce2d3927a32b3af818ab67943628568 (patch) | |
tree | fae9181a8f69a7f26f9fec10bb0941ad4e0f1edd /2023/day03/Main2.hs | |
parent | a1895fe157e06ee4d119576163ea76390b3d402c (diff) |
Diffstat (limited to '2023/day03/Main2.hs')
-rw-r--r-- | 2023/day03/Main2.hs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/2023/day03/Main2.hs b/2023/day03/Main2.hs new file mode 100644 index 0000000..d7329f6 --- /dev/null +++ b/2023/day03/Main2.hs @@ -0,0 +1,30 @@ +import Data.Char +import Data.List (nub, sort) + +findBegin s@((x,y), c) dict = case filter (\(p,_) -> p == (x,y-1)) dict of + [] -> s + n:xs -> findBegin n dict + +uniqueLists :: [[((Int, Int), Char)]] -> [[((Int, Int), Char)]] +uniqueLists = nub . map sort + +getNumber :: ((Int, Int), Char) -> [String] -> Int +getNumber ((x,y),c) dict = read (takeWhile isDigit (drop y (dict!!x))) :: Int + +main :: IO () +main = do + inputLines <- lines <$> getContents + + let distances = concat (map (\x -> (map (\y -> (x,y)) [-1..1])) [-1..1]) + + let numInputLines = zip [0..] (map (zip [0..]) inputLines) + let charCoords = concat (map (\(x, l) -> (map (\(y, c) -> ((x,y),c)) l)) numInputLines) + let gears = map (\(p, c) -> p) (filter (\(_,c) -> c == '*') charCoords) + let digits = filter (\(_,c) -> isDigit c) charCoords + let gearsChars = map (\(x,y) -> (filter (\(p,xd) -> (elem p (map (\(x1,y1) -> (x+x1,y+y1)) distances))) digits)) gears + + let gearsBegins = uniqueLists $ map (\gearChars -> (nub (map (\x -> (findBegin x digits)) gearChars))) gearsChars + let twoGears = filter (\x -> length x == 2) gearsBegins + let serialNumbers = map (\gs -> product $ map (\g -> getNumber g inputLines) gs) twoGears + print (sum serialNumbers) + |