Better definitions of touching
authorNeil Smith <NeilNjae@users.noreply.github.com>
Sun, 3 Dec 2023 11:13:55 +0000 (11:13 +0000)
committerNeil Smith <NeilNjae@users.noreply.github.com>
Sun, 3 Dec 2023 11:15:05 +0000 (11:15 +0000)
advent03/Main.hs

index f164bada484ca5084e075663a0977862b6617053..062b66efb64ebde2efda82abc620f3dac1b82d49 100644 (file)
@@ -25,7 +25,9 @@ main =
       text <- readFile dataFileName
       let engine = mkEngine text
       let allNums = findNumbers engine
-      let partNums = filter (numTouchingSymbols engine) allNums
+      let symbols = findSymbols engine
+      let partNums = filter (touchRegion symbols) allNums
+      -- print partNums
       -- print engine
       -- print $ findNumbers engine
       print $ part1 engine partNums
@@ -37,8 +39,8 @@ part1 engine partNums = sum partNumValues
   where partNumValues = map (readNumber engine) partNums
 
 part2 engine partNums = sum $ fmap product gearRatios
-  where sts = stars engine
-        touchingStars = fmap (adjacentNumbers partNums) sts
+  where stars = findStars engine
+        touchingStars = fmap (possibleGears partNums) stars
         gears = filter ((==) 2 . length) touchingStars
         gearRatios = [[readNumber engine n | n <- pNs] | pNs <- gears]
 
@@ -82,22 +84,22 @@ neighbours :: Position -> [Position]
 neighbours p = [p ^+^ V2 dr dc | dr <- [-1..1], dc <- [-1..1]
                                , (dr, dc) /= (0, 0) ]
 
-touchingSymbol :: Engine -> Position -> Bool
-touchingSymbol engine p = any (isEngineSymbol . (engine !)) nbrs
-  where nbrs = filter (inRange (bounds engine)) $ neighbours p
 
-numTouchingSymbols :: Engine -> NumPos -> Bool
-numTouchingSymbols engine ps = any (touchingSymbol engine) ps
+touchPoint :: [Position] -> Position -> Bool
+touchPoint region point = not $ null $ intersect region $ neighbours point
+
+touchRegion :: [Position] -> [Position] -> Bool
+touchRegion region1 region2 = any (touchPoint region2) region1
+
 
 readNumber :: Engine -> NumPos -> Int
 readNumber engine ps = read $ map (engine !) ps
 
-stars :: Engine -> [Position]
-stars engine = filter ((==) '*' . (engine !)) $ indices engine
+findSymbols :: Engine -> [Position]
+findSymbols engine = filter (isEngineSymbol . (engine !)) $ indices engine
 
-starTouchesNumber :: Position -> NumPos -> Bool
-starTouchesNumber star ps = not $ null $ intersect ps halo
-  where halo = neighbours star
+findStars :: Engine -> [Position]
+findStars engine = filter ((==) '*' . (engine !)) $ indices engine
 
-adjacentNumbers :: [NumPos] -> Position -> [NumPos]
-adjacentNumbers nums star = filter (starTouchesNumber star) nums
+possibleGears :: [NumPos] -> Position -> [NumPos]
+possibleGears nums star = filter (flip touchPoint star) nums