summaryrefslogtreecommitdiff
path: root/2023/day03/Main.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/Main.hs
parenta1895fe157e06ee4d119576163ea76390b3d402c (diff)
AoC 2023HEADmain
Diffstat (limited to '2023/day03/Main.hs')
-rw-r--r--2023/day03/Main.hs28
1 files changed, 28 insertions, 0 deletions
diff --git a/2023/day03/Main.hs b/2023/day03/Main.hs
new file mode 100644
index 0000000..d9d8f4b
--- /dev/null
+++ b/2023/day03/Main.hs
@@ -0,0 +1,28 @@
+import Data.Char
+import Data.List
+
+-- findBegin :: ((Int, Int), Char) -> [((Int, Int), Char)] -> ((Int, Int), Char)
+findBegin s@((x,y), c) dict = case filter (\(p,_) -> p == (x,y-1)) dict of
+ [] -> s
+ n:xs -> findBegin n dict
+
+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 symbols = map (\(p, c) -> p) (filter (\(_,c) -> not (c == '.' || isDigit c)) charCoords)
+ let digits = filter (\(_,c) -> isDigit c) charCoords
+ let serialChars = filter (\((x,y),_) -> any (\x -> elem x symbols) (map (\(x1,y2) -> (x + x1, y + y2)) distances)) digits
+ let serialBegins = nub $ map (\x -> findBegin x digits) serialChars
+ let serialNumbers = map (\((x,y), c) -> read (takeWhile isDigit (drop y (inputLines!!x))) :: Integer) serialBegins
+ -- print charCoords
+ -- print symbols
+ print (sum serialNumbers)
+ -- convert input to [((x,y), Char)]
+
+ -- mapM_ putStrLn inputLines
+