diff 7-Haskell/day3-maze.hs @ 102:d3e35dfc6f84

Do some "have we been here via another route" filtering This (combined with simplified maze) means we solve the maze in under 10s!
author IBBoard <dev@ibboard.co.uk>
date Sun, 14 Jul 2019 13:43:22 +0100
parents 830140560f70
children
line wrap: on
line diff
--- a/7-Haskell/day3-maze.hs	Sun Jul 14 13:42:24 2019 +0100
+++ b/7-Haskell/day3-maze.hs	Sun Jul 14 13:43:22 2019 +0100
@@ -1,5 +1,6 @@
 module Day3Maze where
     import System.IO
+    import Data.Set (empty, fromList, union, notMember)
 
     -- This is a "type" alias, because they're just naming pre-existing types with specific patterns
     -- Note: Nested lists with indexes will be inefficient compared to Vectors, but I'm working with what I know!
@@ -84,7 +85,10 @@
         in filter (\node -> (snd node) /= []) candidates
 
     step :: Maze -> [[Coords]] -> [[Coords]]
-    step maze routes = filter (\(hd:lst) -> hd `notElem` lst) (concatMap (\route -> map (: route) (nextSteps maze route)) routes)
+    -- Map out all of the next steps, but remove ones that go back on themselves (head is in its own tail) or that we've been to before
+    -- (head is in previous points, meaning we've found a shorter route)
+    step maze routes = filter (\(hd:lst) -> (hd `notElem` lst) && (hd `notMember` all_previous_points)) (concatMap (\route -> map (: route) (nextSteps maze route)) routes)
+            where all_previous_points = foldl union empty (map fromList routes)
 
     nextSteps :: Maze -> [Coords] -> [Coords]
     nextSteps maze route = map (fst . getRelativeNode maze pos) exits