projects
/
advent-of-code-23.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
b3a89bb
)
Better definitions of touching
author
Neil Smith
<NeilNjae@users.noreply.github.com>
Sun, 3 Dec 2023 11:13:55 +0000
(11:13 +0000)
committer
Neil Smith
<NeilNjae@users.noreply.github.com>
Sun, 3 Dec 2023 11:15:05 +0000
(11:15 +0000)
advent03/Main.hs
patch
|
blob
|
history
diff --git
a/advent03/Main.hs
b/advent03/Main.hs
index f164bada484ca5084e075663a0977862b6617053..062b66efb64ebde2efda82abc620f3dac1b82d49 100644
(file)
--- a/
advent03/Main.hs
+++ b/
advent03/Main.hs
@@
-25,7
+25,9
@@
main =
text <- readFile dataFileName
let engine = mkEngine text
let allNums = findNumbers engine
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
-- 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 partNumValues = map (readNumber engine) partNums
part2 engine partNums = sum $ fmap product gearRatios
- where st
s = s
tars engine
- touchingStars = fmap (
adjacentNumbers partNums) st
s
+ where st
ars = findS
tars engine
+ touchingStars = fmap (
possibleGears partNums) star
s
gears = filter ((==) 2 . length) touchingStars
gearRatios = [[readNumber engine n | n <- pNs] | pNs <- gears]
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) ]
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
readNumber :: Engine -> NumPos -> Int
readNumber engine ps = read $ map (engine !) ps
-
star
s :: Engine -> [Position]
-
stars engine = filter ((==) '*'
. (engine !)) $ indices engine
+
findSymbol
s :: 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
-
adjacentNumbe
rs :: [NumPos] -> Position -> [NumPos]
-
adjacentNumbers nums star = filter (starTouchesNumber
star) nums
+
possibleGea
rs :: [NumPos] -> Position -> [NumPos]
+
possibleGears nums star = filter (flip touchPoint
star) nums