···
4
+
import Data.Map (Map)
5
+
import qualified Data.Map as Map
6
+
import Data.Set (Set)
7
+
import qualified Data.Set as Set
10
+
-- New beam positions and number of splits
11
+
splitBeams :: Grid -> (Set Point2, Int) -> (Set Point2, Int)
12
+
splitBeams g (beams,splits) =
13
+
foldl (\(beams',splits') (x,y) ->
14
+
if Map.lookup (x,y+1) g == Just '^' then
15
+
(Set.insert (x-1,y+1) $ Set.insert (x+1,y+1) beams', splits' + 1)
17
+
(Set.insert (x,y+1) beams', splits'))
part1 :: String -> String
4
-
part1 _ = "Day 7 part 1"
23
+
let grid = toGrid input
24
+
starts = map fst $ filter ((== 'S') . snd) (Map.toList grid)
25
+
rows = maximum $ map snd $ Map.keys grid
27
+
(\(beams', splits') _ -> splitBeams grid (beams', splits'))
28
+
(Set.fromList starts, 0)
32
+
splitTime :: Grid -> Map Point2 Int -> Map Point2 Int
34
+
Map.foldlWithKey (\beams' (x,y) times ->
35
+
if Map.lookup (x,y+1) g == Just '^' then
36
+
Map.insertWith (+) (x-1,y+1) times $
37
+
Map.insertWith (+) (x+1,y+1) times $
40
+
Map.insertWith (+) (x,y+1) times beams')
part2 :: String -> String
7
-
part2 _ = "Day 7 part 2"
46
+
let grid = toGrid input
47
+
starts = map fst $ filter ((== 'S') . snd) (Map.toList grid)
48
+
rows = maximum $ map snd $ Map.keys grid
50
+
(\beams' _ -> splitTime grid beams')
51
+
(Map.fromList [(s,1) | s <- starts])