summaryrefslogtreecommitdiff
path: root/2023/day03/Main2.hs
diff options
context:
space:
mode:
authorOrangerot <purple@orangerot.dev>2024-05-17 15:41:55 +0200
committerOrangerot <purple@orangerot.dev>2024-05-17 15:41:55 +0200
commitc6075f736e67e47b940abb9c1a0c54753d4b55b8 (patch)
tree69d827646e615e00f91ef54361cc1701e4f0eff7 /2023/day03/Main2.hs
parenta1895fe157e06ee4d119576163ea76390b3d402c (diff)
AoC 2023HEADmain
Diffstat (limited to '2023/day03/Main2.hs')
-rw-r--r--2023/day03/Main2.hs30
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)
+