aboutsummaryrefslogtreecommitdiff
path: root/2024
diff options
context:
space:
mode:
authorJulien Dessaux2024-12-23 01:11:57 +0100
committerJulien Dessaux2024-12-23 01:11:57 +0100
commitdba0d99aa761824ad7de37544831d82d52f60d8a (patch)
tree9b11721a6212681a6837b869ec837dd51d157293 /2024
parent2024-17 in haskell (diff)
downloadadvent-of-code-dba0d99aa761824ad7de37544831d82d52f60d8a.tar.gz
advent-of-code-dba0d99aa761824ad7de37544831d82d52f60d8a.tar.bz2
advent-of-code-dba0d99aa761824ad7de37544831d82d52f60d8a.zip
2024-18 in haskellHEADmaster
Diffstat (limited to '')
-rw-r--r--2024/18-RAM_Run/example25
-rw-r--r--2024/18-RAM_Run/first.hs75
-rw-r--r--2024/18-RAM_Run/input3450
-rw-r--r--2024/18-RAM_Run/second.hs84
4 files changed, 3634 insertions, 0 deletions
diff --git a/2024/18-RAM_Run/example b/2024/18-RAM_Run/example
new file mode 100644
index 0000000..79c8583
--- /dev/null
+++ b/2024/18-RAM_Run/example
@@ -0,0 +1,25 @@
+5,4
+4,2
+4,5
+3,0
+2,1
+6,3
+2,4
+1,5
+0,6
+3,3
+2,6
+5,1
+1,2
+5,5
+2,5
+6,5
+1,4
+0,4
+6,4
+1,1
+6,1
+1,0
+0,5
+1,6
+2,0
diff --git a/2024/18-RAM_Run/first.hs b/2024/18-RAM_Run/first.hs
new file mode 100644
index 0000000..8b26d97
--- /dev/null
+++ b/2024/18-RAM_Run/first.hs
@@ -0,0 +1,75 @@
+-- requires cabal install --lib megaparsec parser-combinators heap vector
+module Main (main) where
+
+import Control.Monad (void, when)
+import Data.Functor
+import qualified Data.Heap as H
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Vector as V
+import Data.Void (Void)
+import Text.Megaparsec
+import Text.Megaparsec.Char
+
+exampleExpectedOutput = 22
+
+type Coord = (Int, Int)
+type Input = [Coord]
+
+type Parser = Parsec Void String
+
+parseNumber :: Parser Int
+parseNumber = read <$> some digitChar
+
+parseCoord :: Parser Coord
+parseCoord = (,) <$> parseNumber <* char ','
+ <*> parseNumber <* eol
+
+parseInput' :: Parser Input
+parseInput' = some parseCoord <* eof
+
+parseInput :: String -> IO Input
+parseInput filename = do
+ input <- readFile filename
+ case runParser parseInput' filename input of
+ Left bundle -> error $ errorBundlePretty bundle
+ Right input' -> return input'
+
+type Cost = Int
+data Position = Position Coord Cost deriving Show
+instance Ord Position where
+ compare (Position _ c1) (Position _ c2) = c1 `compare` c2
+instance Eq Position where
+ (Position p1 _ ) == (Position p2 _ ) = p1 == p2
+type Visited = M.Map Coord Cost
+type Maze = M.Map Coord ()
+
+type Candidates = H.MinHeap Position
+
+compute :: Int -> Int -> Input -> Int
+compute size cutoff input = walk (M.singleton (0, 0) 0) $ H.singleton (Position (0, 0) 0)
+ where
+ walk :: Visited -> Candidates -> Int
+ walk v h | x == size && y == size = c
+ | otherwise = walk v' $ H.union h' $ H.fromList n
+ where
+ ([pos@(Position p@(x, y) c)], h') = H.splitAt 1 h
+ n = nexts v pos
+ v' = L.foldl' (\acc (Position a b) -> M.insert a b acc) v n
+ nexts :: Visited -> Position -> [Position]
+ nexts v (Position p c) = L.filter (valid v) . map (\p' -> Position p' (c+1)) $ candidates p
+ valid :: Visited -> Position -> Bool
+ valid v (Position p@(x, y) c) = x >= 0 && x <= size && y >= 0 && y <= size && not (M.member p maze) && case M.lookup p v of
+ Just c' -> c < c'
+ Nothing -> True
+ candidates :: Coord -> [Coord]
+ candidates (x, y) = [ (x-1, y), (x+1, y), (x, y-1), (x, y+1) ]
+ maze = M.fromList $ zip (take cutoff input) (L.repeat ())
+
+main :: IO ()
+main = do
+ example <- parseInput "example"
+ let exampleOutput = compute 6 12 example
+ when (exampleOutput /= exampleExpectedOutput) (error $ "example failed: got " ++ show exampleOutput ++ " instead of " ++ show exampleExpectedOutput)
+ input <- parseInput "input"
+ print $ compute 70 1024 input
diff --git a/2024/18-RAM_Run/input b/2024/18-RAM_Run/input
new file mode 100644
index 0000000..15c28a2
--- /dev/null
+++ b/2024/18-RAM_Run/input
@@ -0,0 +1,3450 @@
+63,28
+1,10
+33,30
+52,51
+12,11
+32,31
+51,27
+19,17
+4,29
+35,25
+4,45
+49,19
+61,53
+69,65
+27,19
+61,43
+65,42
+7,47
+4,17
+22,17
+11,13
+1,47
+28,27
+39,30
+59,61
+11,36
+55,50
+5,24
+31,13
+50,17
+29,11
+35,27
+25,23
+20,13
+67,41
+4,7
+44,25
+7,21
+66,33
+57,29
+31,29
+59,26
+34,13
+29,27
+65,59
+9,13
+9,41
+15,21
+10,17
+13,11
+63,49
+53,13
+53,22
+21,29
+12,9
+28,17
+19,15
+53,54
+11,9
+32,35
+25,41
+60,57
+19,51
+61,60
+15,19
+25,12
+7,9
+23,23
+2,7
+13,50
+3,50
+54,17
+57,43
+9,9
+13,49
+24,21
+11,23
+59,42
+65,61
+51,15
+59,48
+59,63
+53,26
+19,47
+59,34
+69,43
+33,13
+65,41
+21,30
+63,55
+27,33
+1,9
+66,27
+31,41
+59,22
+60,69
+24,23
+0,3
+63,30
+59,47
+15,41
+15,28
+63,38
+24,43
+56,43
+16,35
+17,43
+29,25
+55,45
+15,33
+53,12
+51,56
+15,10
+5,18
+60,49
+11,22
+34,17
+69,39
+63,29
+29,16
+19,41
+58,23
+1,13
+23,34
+19,43
+14,37
+18,23
+38,13
+61,67
+17,13
+69,62
+5,20
+69,33
+11,12
+7,51
+57,16
+33,12
+59,53
+55,24
+29,31
+51,55
+27,25
+51,24
+67,46
+3,40
+70,29
+26,31
+37,14
+26,35
+7,18
+51,51
+8,51
+55,59
+21,16
+57,51
+57,65
+69,67
+20,37
+17,31
+19,37
+29,37
+57,14
+8,41
+68,39
+57,68
+19,39
+53,49
+13,23
+53,15
+18,11
+52,47
+17,20
+7,15
+5,25
+61,48
+67,52
+59,33
+25,33
+29,36
+13,51
+7,45
+55,49
+14,33
+36,25
+27,31
+67,53
+49,13
+4,15
+3,7
+23,41
+9,48
+27,38
+15,25
+21,35
+15,45
+54,45
+17,47
+23,27
+31,15
+19,21
+61,50
+30,13
+31,43
+61,56
+5,42
+69,32
+49,49
+3,10
+39,25
+65,60
+67,28
+8,19
+1,48
+16,31
+44,57
+1,44
+69,61
+21,39
+69,31
+14,25
+21,45
+7,46
+52,15
+17,17
+59,57
+57,28
+63,51
+27,11
+54,53
+10,9
+11,41
+57,53
+61,54
+29,20
+61,65
+35,29
+67,62
+67,45
+33,29
+63,57
+22,27
+39,27
+51,21
+34,29
+57,21
+19,26
+23,25
+63,40
+57,20
+22,11
+41,28
+55,21
+3,43
+48,17
+27,35
+69,41
+21,36
+57,27
+24,29
+56,49
+57,39
+13,9
+64,27
+3,4
+44,39
+17,37
+60,31
+63,46
+23,33
+51,49
+49,21
+69,45
+21,19
+21,27
+23,38
+0,47
+53,19
+12,51
+13,40
+11,15
+12,23
+24,15
+6,5
+6,47
+52,25
+23,29
+63,35
+69,57
+67,56
+67,60
+7,55
+5,53
+15,35
+61,44
+7,10
+31,30
+33,43
+13,53
+30,23
+11,6
+61,58
+37,28
+49,26
+35,15
+5,14
+69,66
+51,63
+56,17
+31,14
+58,19
+29,29
+57,11
+62,35
+11,26
+31,18
+28,29
+63,66
+51,13
+15,15
+31,17
+70,63
+7,23
+59,46
+31,49
+58,49
+3,46
+57,47
+51,12
+25,37
+22,41
+25,47
+49,18
+29,15
+49,48
+25,27
+25,26
+3,11
+27,20
+2,53
+3,1
+39,31
+61,66
+64,53
+31,19
+14,17
+23,31
+57,17
+27,39
+1,43
+5,11
+61,41
+27,27
+29,32
+9,11
+15,30
+65,27
+24,49
+67,37
+33,39
+21,37
+53,58
+59,24
+68,45
+24,13
+24,31
+55,53
+21,15
+66,57
+13,27
+57,22
+55,62
+19,18
+9,14
+67,63
+13,34
+57,13
+23,17
+65,31
+35,13
+13,25
+25,45
+67,31
+61,45
+67,39
+67,33
+33,21
+21,13
+57,61
+5,41
+12,43
+29,33
+12,39
+12,47
+15,20
+59,52
+58,55
+1,5
+18,43
+24,25
+61,59
+57,19
+65,65
+17,33
+6,9
+30,33
+19,11
+9,43
+19,23
+69,55
+65,63
+60,63
+64,63
+22,43
+24,39
+15,31
+49,14
+57,57
+55,33
+63,64
+2,49
+59,29
+27,29
+2,51
+65,33
+25,18
+35,16
+63,65
+8,21
+13,21
+7,13
+14,15
+55,56
+5,55
+11,25
+7,53
+8,49
+11,39
+57,26
+39,29
+17,40
+6,43
+69,53
+28,25
+65,36
+5,21
+65,34
+37,43
+25,29
+36,31
+27,43
+51,16
+61,31
+17,45
+67,35
+3,3
+30,25
+21,11
+57,45
+19,12
+23,15
+1,7
+63,48
+17,32
+30,29
+4,53
+21,43
+61,37
+25,39
+23,13
+54,35
+15,37
+63,45
+62,27
+68,31
+8,45
+13,15
+31,26
+50,21
+2,43
+55,13
+53,43
+5,13
+16,23
+9,15
+35,21
+5,5
+63,41
+58,59
+12,19
+61,40
+57,15
+53,57
+1,14
+43,47
+1,1
+9,45
+53,47
+33,27
+17,14
+27,21
+5,12
+33,15
+33,31
+15,44
+59,25
+31,27
+11,11
+20,29
+3,13
+51,19
+48,15
+25,21
+62,33
+15,54
+11,17
+61,61
+63,56
+9,22
+8,43
+58,51
+21,18
+11,20
+27,41
+69,69
+21,10
+65,26
+32,17
+18,29
+18,17
+38,25
+59,51
+25,8
+19,16
+31,35
+53,25
+53,18
+30,39
+20,21
+13,35
+49,47
+6,21
+66,41
+41,69
+31,31
+53,53
+55,18
+55,37
+3,45
+57,25
+21,26
+13,17
+64,47
+65,51
+15,11
+54,27
+3,9
+22,23
+52,55
+9,53
+27,30
+51,47
+69,52
+5,51
+19,33
+12,41
+11,28
+11,21
+12,29
+67,36
+5,15
+61,27
+31,16
+13,39
+55,14
+61,49
+8,7
+60,35
+29,38
+50,49
+18,35
+25,34
+1,2
+5,2
+5,45
+3,56
+67,65
+57,54
+7,11
+8,9
+68,33
+9,21
+18,41
+12,15
+27,23
+63,68
+5,0
+25,25
+4,9
+38,27
+46,15
+67,67
+16,11
+17,35
+29,39
+68,29
+25,20
+53,61
+59,27
+2,17
+43,28
+23,19
+29,34
+7,6
+63,32
+55,17
+32,21
+70,55
+13,47
+11,19
+25,15
+5,43
+55,51
+55,15
+19,27
+3,2
+33,17
+50,47
+59,40
+65,49
+15,29
+47,20
+62,37
+1,3
+56,53
+27,24
+21,23
+69,58
+57,23
+67,43
+56,47
+69,48
+1,6
+58,43
+59,38
+29,41
+23,49
+64,35
+63,54
+12,53
+66,31
+63,52
+57,69
+59,68
+67,64
+16,37
+19,35
+22,33
+69,59
+21,41
+27,18
+56,57
+29,21
+65,38
+60,45
+47,22
+13,16
+30,19
+13,45
+67,68
+63,70
+55,47
+13,37
+62,43
+23,37
+17,26
+2,45
+25,42
+19,13
+69,29
+51,20
+63,33
+19,31
+60,53
+37,13
+19,24
+10,43
+23,43
+18,21
+1,19
+3,53
+61,42
+59,35
+69,37
+3,6
+31,42
+51,14
+17,21
+52,45
+21,17
+65,45
+61,35
+61,55
+17,27
+21,21
+19,32
+52,29
+61,51
+21,25
+11,38
+17,29
+61,47
+69,27
+70,43
+65,37
+66,67
+57,41
+15,39
+52,21
+26,11
+11,14
+17,23
+7,41
+68,59
+13,29
+13,41
+13,26
+17,41
+33,14
+21,31
+59,39
+55,28
+17,39
+69,49
+15,40
+23,40
+55,61
+21,24
+5,47
+57,55
+10,45
+0,17
+56,33
+20,43
+55,23
+27,15
+1,49
+63,43
+67,29
+59,56
+28,15
+4,19
+66,39
+64,59
+13,30
+24,37
+68,43
+11,37
+15,13
+63,31
+3,17
+14,29
+61,30
+15,51
+3,41
+26,39
+29,22
+14,9
+23,44
+21,22
+16,43
+49,17
+29,43
+54,33
+27,13
+37,25
+19,45
+57,49
+31,21
+61,63
+5,48
+13,13
+36,29
+22,13
+14,13
+5,1
+9,19
+15,46
+15,27
+9,4
+23,20
+1,15
+17,19
+68,37
+16,17
+68,41
+23,39
+65,30
+5,52
+16,21
+68,51
+67,61
+57,62
+13,24
+60,29
+13,43
+4,43
+67,48
+15,23
+13,5
+63,59
+54,47
+7,17
+65,55
+59,32
+22,35
+14,21
+53,17
+25,28
+20,39
+40,27
+59,45
+33,44
+16,27
+28,41
+1,12
+3,47
+59,41
+48,49
+25,32
+65,50
+47,17
+17,25
+49,23
+40,25
+65,57
+49,28
+64,43
+63,37
+17,8
+3,5
+60,37
+3,12
+63,47
+65,69
+11,35
+33,25
+41,49
+53,23
+41,13
+64,39
+3,57
+6,15
+15,38
+11,29
+3,15
+66,53
+61,29
+33,28
+59,55
+26,41
+55,25
+27,28
+20,41
+53,52
+1,11
+21,32
+67,47
+10,41
+65,53
+28,11
+58,29
+59,65
+53,21
+29,19
+16,13
+51,23
+55,55
+55,22
+9,3
+69,47
+57,12
+11,27
+51,17
+15,9
+57,44
+11,50
+17,15
+55,19
+31,46
+49,12
+19,28
+47,49
+2,15
+63,69
+70,37
+29,35
+47,19
+7,43
+13,19
+21,33
+15,42
+55,20
+56,25
+29,45
+18,37
+27,37
+59,43
+69,68
+27,22
+6,51
+35,17
+29,46
+9,29
+28,33
+11,18
+37,29
+39,13
+5,17
+60,27
+17,2
+65,54
+12,35
+41,25
+5,27
+8,33
+66,49
+27,14
+22,29
+51,50
+62,51
+19,25
+28,43
+63,58
+10,25
+1,17
+35,31
+4,49
+19,56
+15,18
+57,34
+53,65
+64,67
+57,60
+55,27
+67,44
+61,33
+34,25
+46,19
+16,33
+7,19
+35,26
+9,12
+65,47
+23,35
+14,43
+15,12
+65,39
+47,51
+54,15
+17,9
+66,65
+29,40
+66,69
+59,49
+67,51
+37,27
+22,19
+26,23
+32,25
+55,67
+53,51
+1,45
+25,35
+65,35
+5,8
+15,17
+18,45
+53,55
+5,9
+27,12
+3,49
+27,36
+19,34
+21,14
+4,3
+11,49
+9,5
+9,23
+67,49
+69,50
+51,33
+7,16
+25,19
+27,17
+11,45
+5,23
+19,30
+68,65
+17,11
+51,45
+14,23
+65,44
+2,41
+49,15
+67,55
+68,55
+12,45
+9,24
+41,26
+59,31
+62,61
+54,49
+61,39
+11,43
+9,16
+69,63
+18,39
+57,33
+23,21
+57,46
+65,62
+14,47
+9,51
+65,29
+12,5
+16,63
+1,40
+7,3
+40,21
+45,29
+60,11
+46,49
+46,29
+31,66
+37,64
+41,19
+9,61
+7,31
+49,9
+45,41
+45,64
+40,47
+45,23
+34,47
+25,69
+57,58
+22,57
+59,3
+67,69
+39,1
+31,37
+52,35
+47,13
+53,41
+33,23
+5,35
+43,61
+5,34
+44,31
+50,5
+41,45
+45,56
+4,61
+63,25
+35,60
+3,65
+25,6
+5,29
+43,53
+47,54
+41,41
+49,29
+53,33
+3,35
+39,64
+15,5
+52,67
+67,7
+11,51
+35,55
+47,36
+5,58
+1,37
+36,7
+55,69
+39,57
+45,13
+43,48
+2,29
+8,37
+29,60
+31,63
+1,59
+46,47
+61,7
+70,3
+19,68
+15,65
+2,19
+11,61
+33,37
+59,8
+13,31
+60,5
+35,5
+55,3
+69,1
+7,29
+61,8
+7,66
+57,8
+49,54
+51,43
+10,69
+54,57
+48,41
+45,69
+4,27
+27,63
+50,65
+11,33
+49,68
+17,54
+62,7
+6,35
+59,13
+57,1
+1,27
+22,7
+8,27
+3,23
+29,59
+23,61
+28,65
+26,47
+38,67
+51,2
+41,50
+10,27
+22,51
+1,41
+3,31
+38,21
+2,69
+23,57
+41,37
+31,1
+47,55
+59,16
+67,21
+44,49
+45,43
+15,63
+8,59
+27,62
+21,47
+17,68
+55,40
+41,55
+62,21
+35,61
+46,23
+51,67
+43,25
+32,63
+9,25
+47,61
+28,61
+39,49
+43,22
+55,63
+9,37
+29,49
+43,29
+56,5
+9,49
+38,7
+40,63
+49,35
+39,12
+40,49
+31,54
+36,45
+43,17
+15,64
+30,61
+34,9
+3,55
+62,15
+61,19
+43,66
+48,19
+25,58
+17,3
+53,3
+47,39
+40,45
+4,63
+21,65
+35,35
+17,65
+33,19
+41,2
+1,25
+13,67
+51,39
+2,37
+35,37
+43,36
+3,64
+20,45
+51,3
+37,48
+5,30
+67,3
+11,66
+52,19
+7,69
+35,67
+25,1
+59,18
+21,59
+36,11
+17,63
+35,33
+49,56
+17,53
+37,5
+43,64
+49,7
+24,67
+21,7
+34,39
+1,31
+28,7
+54,37
+43,65
+39,36
+15,66
+46,27
+64,13
+51,44
+19,61
+19,48
+37,59
+45,30
+62,3
+55,38
+8,55
+29,53
+35,7
+51,9
+41,39
+6,13
+25,16
+65,43
+44,17
+5,61
+39,55
+29,3
+45,51
+33,66
+47,11
+43,26
+43,51
+51,69
+24,1
+39,67
+49,59
+54,41
+62,25
+13,57
+31,56
+51,37
+28,45
+41,36
+42,41
+68,19
+3,19
+19,65
+9,64
+49,69
+57,66
+18,9
+29,63
+43,9
+64,3
+53,69
+30,47
+47,2
+38,33
+19,7
+57,3
+44,33
+32,43
+37,9
+35,59
+65,21
+35,3
+31,57
+11,65
+45,47
+33,46
+9,65
+47,33
+63,8
+47,9
+37,33
+30,51
+21,55
+47,53
+11,55
+44,59
+69,5
+39,5
+48,9
+50,59
+50,53
+5,49
+3,63
+48,53
+46,13
+65,19
+47,7
+37,35
+33,35
+8,57
+9,35
+11,62
+37,66
+51,5
+23,7
+45,40
+54,31
+5,57
+4,35
+34,7
+69,21
+68,17
+65,23
+21,46
+47,56
+45,10
+17,51
+35,63
+38,43
+30,9
+51,35
+23,1
+61,64
+44,41
+32,39
+34,59
+3,25
+49,46
+5,70
+19,62
+29,57
+17,59
+19,49
+59,1
+31,25
+36,51
+36,19
+67,1
+45,2
+27,51
+35,65
+20,7
+69,26
+28,57
+7,35
+17,70
+49,5
+38,19
+21,9
+48,25
+17,48
+59,4
+43,24
+27,45
+24,55
+49,61
+29,47
+39,62
+63,27
+37,49
+15,67
+49,36
+40,5
+43,16
+49,62
+44,35
+39,61
+23,47
+37,19
+59,23
+51,38
+51,57
+42,57
+43,55
+13,61
+36,65
+17,61
+61,57
+33,20
+5,32
+41,35
+15,58
+34,67
+49,37
+35,49
+1,26
+29,23
+26,45
+41,3
+7,2
+18,5
+33,33
+37,45
+39,40
+65,6
+12,63
+34,53
+45,25
+25,67
+26,65
+34,5
+46,65
+60,61
+8,53
+35,48
+36,15
+41,54
+33,56
+53,42
+11,58
+1,20
+55,31
+1,65
+65,3
+64,19
+57,2
+51,29
+43,37
+47,12
+22,67
+19,67
+50,35
+46,17
+2,33
+67,59
+51,7
+63,10
+14,7
+21,63
+49,33
+57,10
+35,11
+68,3
+30,49
+23,55
+52,27
+33,1
+59,21
+49,30
+40,13
+23,65
+47,6
+43,5
+39,18
+51,31
+25,59
+33,67
+43,12
+51,11
+41,43
+46,39
+45,8
+65,13
+33,7
+13,56
+27,5
+47,62
+39,4
+27,48
+49,57
+29,17
+47,35
+11,67
+54,5
+39,17
+17,56
+47,31
+41,14
+29,13
+39,10
+5,64
+7,40
+42,69
+48,39
+9,1
+41,11
+43,57
+7,61
+33,53
+31,7
+55,10
+31,60
+57,59
+45,1
+26,1
+55,11
+67,15
+52,3
+45,61
+37,11
+37,40
+13,55
+47,60
+65,11
+41,21
+53,5
+45,15
+1,53
+46,59
+31,33
+43,15
+35,57
+35,43
+37,50
+7,62
+49,10
+65,15
+41,62
+23,63
+4,57
+21,51
+2,67
+39,35
+35,41
+45,63
+49,63
+37,51
+45,57
+47,25
+21,53
+63,39
+43,8
+42,33
+1,21
+9,63
+13,69
+55,41
+35,68
+63,15
+31,58
+14,53
+5,33
+1,32
+65,25
+39,34
+7,67
+11,54
+42,19
+37,39
+19,59
+63,53
+25,53
+15,57
+41,17
+55,9
+54,7
+67,14
+23,56
+12,67
+29,55
+11,5
+7,7
+25,55
+59,37
+32,9
+38,37
+45,9
+53,36
+68,5
+48,1
+0,31
+37,37
+52,39
+4,39
+49,58
+63,7
+48,23
+38,23
+63,21
+53,35
+16,67
+5,63
+43,41
+47,27
+58,11
+22,63
+11,56
+57,35
+63,3
+36,69
+3,69
+42,3
+31,47
+37,57
+68,25
+10,65
+63,67
+56,59
+19,57
+59,14
+31,5
+18,53
+35,39
+65,1
+67,11
+9,60
+13,68
+5,68
+49,51
+26,69
+14,57
+65,7
+27,69
+21,49
+14,3
+19,29
+1,62
+69,25
+25,11
+42,55
+20,59
+61,2
+5,7
+43,35
+9,7
+67,27
+50,61
+1,57
+31,67
+19,1
+41,20
+49,55
+25,43
+24,9
+19,19
+41,1
+10,53
+9,38
+9,30
+4,23
+53,11
+24,45
+33,59
+43,11
+1,63
+1,69
+3,51
+5,65
+51,65
+6,25
+31,65
+28,9
+62,1
+40,59
+13,3
+53,39
+63,1
+39,60
+7,1
+41,59
+69,10
+29,7
+31,3
+6,29
+1,29
+57,7
+45,59
+54,11
+43,49
+45,38
+49,1
+11,3
+44,61
+39,3
+15,43
+31,51
+45,67
+37,38
+41,61
+67,13
+63,9
+47,29
+21,3
+23,5
+25,50
+21,2
+45,26
+0,59
+29,65
+59,67
+19,54
+61,16
+40,37
+30,63
+37,58
+69,11
+37,67
+29,61
+33,57
+69,3
+52,63
+32,11
+50,41
+16,7
+40,17
+31,69
+41,9
+63,61
+45,35
+29,4
+47,37
+23,67
+54,61
+26,55
+54,1
+39,47
+61,25
+33,52
+47,15
+49,53
+65,12
+43,39
+2,35
+7,59
+61,69
+31,9
+43,3
+35,45
+43,13
+25,63
+31,52
+1,23
+68,7
+45,11
+13,60
+31,36
+36,1
+69,16
+64,17
+59,62
+62,13
+17,67
+29,44
+60,67
+41,53
+59,19
+9,55
+43,46
+39,54
+51,59
+27,55
+31,53
+56,1
+31,45
+64,7
+69,17
+68,21
+69,13
+49,27
+61,18
+54,69
+57,67
+43,31
+1,64
+15,3
+50,31
+65,17
+36,43
+41,15
+40,9
+37,46
+10,51
+41,66
+21,50
+13,65
+17,46
+27,53
+23,45
+15,59
+34,43
+23,59
+30,5
+39,43
+19,63
+37,62
+5,31
+64,23
+35,40
+54,67
+44,5
+27,66
+53,30
+50,33
+23,69
+29,56
+50,7
+33,9
+39,32
+45,45
+43,19
+29,67
+19,66
+11,47
+15,47
+25,62
+39,42
+23,11
+69,35
+19,9
+68,35
+44,13
+45,27
+7,32
+39,11
+1,51
+35,23
+40,43
+55,65
+14,61
+31,2
+28,49
+46,53
+57,31
+9,67
+47,45
+23,60
+39,53
+55,1
+56,7
+33,22
+7,65
+69,24
+39,39
+26,63
+25,17
+33,45
+42,11
+28,67
+59,2
+38,69
+8,13
+21,67
+25,9
+61,24
+44,43
+47,4
+17,62
+53,29
+37,21
+43,23
+61,20
+10,61
+17,7
+45,33
+21,57
+25,3
+55,70
+28,69
+41,51
+37,23
+30,7
+43,59
+47,63
+53,9
+10,33
+50,27
+57,0
+16,5
+67,9
+27,67
+44,1
+45,19
+24,63
+11,59
+39,41
+9,39
+19,60
+41,31
+47,70
+41,67
+49,52
+25,65
+37,31
+15,52
+45,0
+21,0
+47,41
+48,65
+35,51
+21,68
+39,19
+42,31
+9,59
+41,27
+51,61
+37,8
+55,5
+63,19
+33,49
+55,29
+18,7
+5,38
+45,49
+40,57
+49,41
+3,67
+43,1
+39,7
+12,69
+29,54
+49,67
+51,64
+7,33
+9,33
+67,23
+43,52
+16,61
+14,69
+68,13
+35,2
+29,51
+69,7
+15,69
+51,41
+10,57
+26,59
+5,54
+57,30
+19,69
+21,5
+42,7
+18,1
+41,47
+33,18
+21,6
+21,54
+59,7
+49,11
+61,6
+39,15
+35,20
+13,1
+41,5
+39,9
+67,17
+5,67
+47,59
+57,38
+27,6
+6,57
+4,69
+23,54
+67,24
+13,63
+56,37
+33,41
+9,0
+55,4
+46,67
+5,19
+45,17
+23,3
+35,47
+7,49
+17,1
+25,61
+48,67
+37,18
+2,23
+13,33
+18,49
+55,35
+59,15
+53,2
+27,47
+16,49
+57,9
+47,42
+7,37
+21,48
+53,63
+49,39
+38,59
+35,1
+39,45
+36,35
+7,24
+47,44
+19,3
+38,11
+61,17
+50,69
+61,11
+25,5
+65,14
+8,63
+23,46
+63,63
+9,34
+39,6
+69,18
+64,11
+43,45
+37,3
+43,21
+8,67
+17,52
+43,54
+41,44
+37,7
+23,9
+49,2
+11,69
+35,19
+11,7
+51,40
+9,2
+27,3
+11,53
+25,49
+67,19
+37,61
+47,28
+61,5
+40,69
+69,23
+12,61
+54,43
+7,5
+39,16
+41,0
+42,47
+1,39
+33,38
+45,53
+1,66
+26,57
+3,21
+27,7
+33,5
+36,53
+57,63
+41,65
+37,63
+20,9
+35,42
+45,66
+11,63
+58,65
+34,23
+47,32
+6,61
+9,31
+59,5
+31,61
+7,39
+46,69
+32,41
+6,55
+23,48
+32,53
+45,62
+38,1
+34,3
+35,9
+35,70
+40,7
+20,3
+7,57
+17,5
+58,41
+65,9
+54,65
+40,67
+36,33
+6,39
+7,63
+1,55
+52,9
+70,13
+39,52
+43,63
+37,47
+11,4
+62,23
+56,67
+34,49
+23,52
+28,53
+29,69
+3,59
+40,23
+66,3
+19,64
+3,37
+49,65
+13,2
+16,57
+35,10
+57,5
+11,48
+13,6
+21,52
+11,57
+47,5
+51,25
+38,31
+25,52
+18,65
+51,53
+18,59
+43,43
+45,46
+63,17
+3,39
+47,57
+44,21
+65,20
+1,24
+53,27
+23,2
+21,66
+34,63
+52,61
+48,31
+47,21
+39,37
+9,47
+57,64
+45,5
+61,23
+39,51
+19,55
+39,56
+55,39
+69,19
+35,58
+53,45
+15,53
+2,57
+3,26
+7,27
+55,57
+21,58
+63,18
+59,9
+68,1
+49,45
+29,64
+33,65
+45,50
+33,58
+41,57
+39,59
+40,51
+59,69
+52,33
+66,23
+37,17
+61,15
+30,67
+67,5
+23,53
+43,33
+11,2
+67,57
+31,68
+37,15
+45,3
+45,55
+39,21
+37,69
+31,39
+66,9
+5,3
+65,67
+55,7
+24,59
+33,11
+36,23
+33,61
+59,17
+34,33
+15,0
+11,31
+32,61
+15,4
+2,61
+63,4
+45,31
+51,42
+26,53
+55,43
+25,57
+1,33
+65,5
+19,53
+31,11
+15,55
+40,31
+67,2
+36,5
+39,65
+65,16
+21,64
+61,12
+10,7
+52,5
+24,65
+49,4
+49,38
+25,13
+17,57
+17,49
+22,5
+37,65
+8,29
+25,51
+45,21
+31,4
+47,34
+35,53
+39,63
+7,25
+26,9
+6,27
+50,9
+0,37
+13,7
+25,7
+47,23
+21,61
+21,1
+53,1
+3,27
+31,55
+44,53
+47,3
+1,54
+43,27
+43,7
+36,55
+69,9
+26,3
+67,25
+60,15
+47,69
+69,8
+15,50
+38,55
+47,1
+1,28
+38,51
+50,23
+37,53
+46,35
+9,17
+29,70
+32,7
+51,8
+23,4
+13,64
+33,47
+49,43
+33,50
+43,20
+23,51
+17,55
+33,63
+15,7
+59,59
+43,10
+25,68
+11,1
+53,31
+41,33
+63,13
+29,0
+16,59
+63,23
+35,69
+42,59
+1,67
+43,67
+41,38
+33,3
+53,10
+45,65
+37,22
+57,37
+29,9
+6,67
+51,68
+42,17
+52,59
+43,34
+37,55
+3,30
+35,36
+8,69
+42,43
+41,29
+41,63
+30,11
+47,65
+43,68
+69,51
+53,7
+38,47
+46,9
+29,5
+39,69
+37,41
+5,39
+66,5
+67,10
+32,5
+33,51
+25,4
+47,67
+67,12
+27,1
+35,62
+27,61
+27,49
+35,64
+22,61
+59,11
+11,32
+43,14
+63,11
+61,9
+61,13
+39,2
+25,31
+33,55
+47,46
+6,37
+34,35
+1,35
+49,3
+3,22
+47,43
+37,4
+41,40
+67,8
+1,61
+28,3
+2,59
+45,37
+27,50
+31,59
+17,69
+16,1
+36,37
+15,49
+56,31
+19,5
+9,36
+61,1
+19,4
+27,2
+32,1
+5,59
+3,33
+49,25
+3,36
+67,58
+7,4
+6,65
+34,55
+42,63
+46,7
+46,51
+61,3
+53,67
+53,59
+53,37
+29,1
+43,69
+27,57
+37,1
+46,43
+0,57
+27,59
+66,19
+61,21
+39,23
+43,6
+21,69
+28,51
+3,29
+51,1
+13,59
+41,7
+48,63
+41,23
+45,7
+47,47
+63,5
+9,69
+9,27
+9,57
+27,65
+33,69
+70,21
+15,1
+32,33
+5,69
+5,60
+65,0
+69,15
+19,50
+31,23
+53,64
+27,9
+65,22
+45,4
+58,5
+5,37
+3,61
+45,39
+58,7
+32,69
+9,46
+15,61
+23,70
+39,33
+49,44
+53,32
+47,58
+65,46
+49,31
+16,36
+60,39
+34,44
+30,27
+33,34
+2,21
+18,61
+52,41
+52,37
+18,55
+59,44
+0,44
+47,18
+59,36
+9,58
+43,62
+32,22
+54,54
+48,61
+6,49
+18,52
+49,24
+10,40
+0,30
+21,62
+22,21
+34,56
+42,48
+4,44
+10,46
+9,26
+36,42
+26,37
+60,6
+10,23
+26,52
+9,68
+38,41
+68,57
+34,50
+8,46
+55,8
+30,37
+68,24
+12,58
+17,12
+58,44
+6,30
+50,46
+30,56
+8,62
+44,30
+44,65
+42,5
+26,2
+30,43
+22,10
+1,42
+54,63
+51,52
+44,52
+40,56
+22,20
+60,55
+16,48
+52,48
+38,22
+68,11
+12,7
+9,40
+17,4
+63,0
+6,59
+36,63
+61,52
+49,64
+68,52
+56,34
+28,48
+12,55
+20,15
+26,22
+32,46
+56,51
+20,56
+6,69
+12,6
+33,62
+20,55
+8,24
+25,38
+10,42
+68,61
+20,57
+18,60
+11,40
+57,32
+19,0
+56,40
+6,58
+66,40
+52,60
+40,52
+10,47
+2,66
+70,67
+18,19
+27,16
+58,8
+44,55
+36,26
+15,60
+9,66
+11,30
+13,38
+70,56
+54,60
+55,42
+30,69
+3,8
+48,2
+5,16
+0,16
+44,47
+12,68
+22,48
+57,50
+12,34
+57,40
+36,39
+4,47
+4,50
+18,36
+34,60
+11,44
+16,28
+52,20
+38,45
+6,31
+17,28
+18,48
+62,8
+60,21
+32,50
+16,18
+47,8
+4,67
+64,70
+70,65
+20,20
+18,46
+14,48
+16,0
+12,31
+20,36
+0,34
+68,36
+46,61
+34,65
+24,16
+48,8
+12,62
+20,69
+40,0
+64,46
+32,62
+41,48
+62,45
+15,2
+31,20
+56,6
+18,47
+41,56
+35,52
+24,3
+59,50
+50,57
+58,56
+64,37
+1,56
+14,28
+20,30
+25,64
+60,16
+6,50
+55,52
+24,8
+35,38
+4,38
+6,16
+53,0
+53,40
+41,22
+49,34
+48,44
+20,31
+3,66
+0,64
+18,13
+3,54
+25,2
+2,50
+58,37
+62,9
+70,57
+24,17
+30,55
+4,65
+28,62
+54,8
+5,28
+36,66
+1,18
+2,34
+50,55
+53,60
+24,20
+52,68
+46,56
+6,41
+14,58
+37,70
+13,0
+38,68
+34,57
+20,65
+40,6
+32,37
+31,22
+51,54
+13,36
+58,30
+24,7
+32,52
+0,2
+34,61
+29,52
+54,42
+60,68
+25,36
+42,66
+56,54
+8,31
+30,3
+22,50
+8,17
+10,31
+31,40
+48,62
+0,14
+50,44
+24,51
+31,70
+28,60
+16,25
+33,36
+54,58
+6,70
+43,50
+23,58
+53,56
+46,46
+54,70
+8,16
+22,52
+56,46
+41,70
+3,70
+64,12
+24,6
+54,34
+8,18
+39,44
+14,26
+44,62
+66,1
+34,62
+55,66
+68,56
+48,47
+20,14
+58,9
+4,34
+8,26
+34,36
+8,42
+2,52
+16,30
+6,48
+18,66
+6,18
+55,68
+58,54
+14,56
+56,65
+29,26
+70,12
+48,54
+40,3
+0,45
+14,63
+0,42
+48,56
+2,36
+8,14
+55,36
+35,56
+8,61
+44,64
+52,38
+52,43
+26,14
+68,53
+32,40
+26,16
+16,56
+22,62
+6,46
+58,62
+18,4
+48,66
+38,18
+62,64
+64,1
+52,56
+68,23
+10,19
+42,2
+46,66
+12,10
+7,54
+14,32
+44,66
+10,36
+63,50
+48,70
+57,6
+2,54
+30,50
+10,55
+42,49
+17,0
+2,24
+21,8
+15,62
+12,40
+62,56
+38,44
+51,46
+50,34
+14,66
+16,60
+29,48
+28,56
+58,45
+4,40
+1,16
+16,44
+20,49
+16,2
+46,34
+46,48
+42,61
+54,59
+18,27
+37,52
+34,69
+2,40
+43,44
+65,70
+16,55
+20,33
+12,37
+29,62
+47,40
+50,63
+7,48
+27,42
+48,50
+57,56
+4,30
+14,68
+60,59
+3,32
+58,36
+44,67
+33,60
+14,39
+20,52
+38,66
+33,64
+58,70
+23,66
+32,18
+5,36
+4,18
+60,43
+58,69
+52,8
+14,24
+30,45
+8,30
+45,28
+30,53
+32,58
+60,50
+2,44
+64,38
+35,28
+62,60
+18,20
+56,11
+63,60
+49,66
+8,54
+67,40
+7,70
+43,30
+62,11
+36,40
+54,32
+8,47
+45,60
+36,67
+41,4
+33,40
+70,10
+40,26
+2,22
+38,57
+56,10
+26,49
+14,1
+42,54
+36,34
+26,43
+16,16
+66,32
+59,20
+12,57
+48,24
+46,57
+43,42
+54,68
+56,69
+65,32
+5,44
+44,2
+18,0
+41,6
+44,40
+4,32
+36,59
+12,12
+26,62
+37,44
+8,32
+47,24
+60,36
+2,25
+33,26
+1,38
+10,49
+20,12
+40,41
+24,5
+15,32
+8,60
+14,52
+27,54
+18,54
+12,3
+64,48
+2,38
+44,70
+30,34
+26,56
+50,20
+56,4
+23,68
+56,32
+8,36
+54,24
+10,64
+61,46
+55,6
+54,56
+14,54
+35,50
+54,9
+47,52
+44,12
+42,70
+70,6
+14,8
+62,4
+60,47
+13,8
+66,51
+66,2
+60,7
+50,4
+66,15
+38,3
+67,4
+0,48
+17,42
+48,6
+16,65
+10,68
+26,33
+44,20
+20,24
+70,7
+46,54
+28,13
+34,58
+2,65
+28,19
+65,28
+12,36
+18,38
+28,23
+33,2
+68,0
+36,58
+14,44
+16,29
+54,21
+0,55
+50,15
+20,4
+30,26
+62,67
+32,30
+49,8
+30,31
+5,66
+41,16
+46,42
+23,22
+55,48
+2,0
+29,24
+47,26
+46,8
+41,64
+4,28
+25,24
+6,3
+15,68
+56,48
+4,0
+48,69
+45,20
+18,30
+60,19
+13,42
+17,10
+4,2
+70,69
+38,46
+24,50
+37,68
+36,38
+70,20
+2,9
+59,6
+40,61
+67,0
+30,36
+22,30
+20,8
+44,8
+14,36
+46,33
+22,70
+21,34
+36,36
+42,15
+68,10
+70,17
+0,28
+26,28
+67,30
+16,69
+53,16
+2,68
+38,24
+4,1
+66,24
+30,4
+31,32
+60,18
+27,40
+12,0
+10,70
+43,40
+41,30
+32,56
+46,62
+52,42
+59,0
+69,56
+66,26
+24,36
+55,54
+50,40
+35,0
+54,29
+6,8
+56,36
+15,24
+2,56
+32,4
+58,52
+58,18
+52,40
+46,36
+4,54
+30,20
+52,22
+66,56
+46,18
+36,70
+64,52
+38,38
+70,0
+67,20
+3,34
+70,2
+68,28
+32,42
+44,27
+7,34
+36,21
+26,54
+42,38
+32,23
+42,58
+45,32
+18,3
+50,38
+10,60
+2,20
+40,35
+27,44
+10,5
+16,4
+19,40
+29,2
+2,42
+31,8
+22,16
+66,46
+28,37
+66,48
+27,32
+4,66
+59,58
+66,28
+36,50
+14,51
+36,4
+12,49
+14,70
+33,0
+66,30
+44,11
+20,64
+28,14
+26,70
+44,68
+65,40
+52,10
+18,44
+58,12
+16,47
+1,70
+26,44
+62,70
+39,24
+2,12
+32,60
+64,24
+7,8
+20,18
+34,41
+40,15
+24,62
+67,50
+44,37
+14,12
+0,49
+52,1
+47,48
+16,38
+28,28
+57,18
+28,66
+54,0
+48,12
+28,58
+26,17
+66,50
+44,18
+11,10
+67,18
+6,63
+32,10
+26,68
+68,69
+52,13
+9,18
+6,11
+32,26
+38,12
+45,58
+44,56
+30,17
+20,38
+12,64
+19,20
+52,36
+8,0
+32,57
+30,10
+42,35
+38,28
+22,65
+5,4
+15,48
+18,68
+70,18
+8,15
+62,68
+40,54
+55,12
+52,65
+42,42
+58,42
+46,10
+56,13
+4,37
+16,64
+14,55
+35,34
+31,44
+12,18
+44,7
+24,12
+19,52
+18,12
+33,70
+28,8
+53,6
+48,11
+0,66
+6,10
+34,31
+0,52
+8,8
+29,30
+26,10
+66,35
+22,24
+51,66
+6,6
+10,34
+28,39
+38,8
+34,45
+30,42
+36,49
+64,41
+69,64
+44,22
+64,18
+10,38
+39,0
+32,70
+24,46
+38,62
+17,22
+28,55
+13,28
+45,36
+48,27
+45,34
+64,34
+18,70
+10,54
+52,31
+60,44
+20,62
+4,21
+53,68
+24,61
+60,60
+36,3
+23,50
+42,13
+10,37
+70,52
+38,49
+46,3
+54,12
+50,48
+26,8
+3,58
+11,8
+48,21
+17,60
+9,42
+4,64
+46,12
+66,17
+24,53
+45,44
+12,30
+68,30
+14,6
+32,49
+0,22
+58,27
+62,53
+12,25
+17,30
+62,30
+22,66
+8,40
+12,54
+10,28
+39,70
+61,36
+50,11
+66,52
+47,14
+55,26
+7,36
+55,64
+36,28
+7,14
+54,22
+12,46
+32,28
+42,14
+50,68
+10,52
+58,50
+16,68
+55,32
+58,10
+48,52
+58,68
+62,20
+22,47
+16,34
+53,24
+24,22
+62,54
+26,24
+8,58
+6,28
+13,46
+14,19
+4,20
+20,68
+9,50
+13,4
+11,34
+64,54
+64,16
+20,17
+56,18
+22,26
+56,56
+36,60
+38,6
+28,52
+0,8
+24,0
+59,66
+36,48
+16,26
+4,62
+4,16
+4,6
+48,64
+42,46
+4,55
+62,52
+2,26
+55,0
+12,16
+39,26
+6,20
+36,57
+44,6
+67,22
+52,2
+2,4
+2,14
+40,4
+40,20
+53,50
+7,68
+48,0
+68,58
+68,54
+0,11
+37,56
+26,67
+56,8
+25,56
+44,42
+12,60
+25,70
+49,6
+40,46
+57,36
+25,54
+12,48
+68,4
+61,4
+13,22
+48,16
+54,36
+1,22
+34,16
+27,8
+21,44
+40,60
+63,34
+42,27
+27,56
+56,23
+20,44
+70,36
+56,62
+44,10
+24,44
+37,36
+70,22
+45,14
+36,56
+49,22
+20,27
+4,26
+66,68
+62,19
+62,41
+0,10
+44,48
+32,38
+46,0
+0,53
+52,50
+4,46
+0,58
+21,12
+39,50
+22,60
+30,62
+4,11
+28,50
+22,8
+56,30
+26,32
+60,28
+65,2
+59,12
+70,48
+40,55
+0,65
+68,64
+26,26
+51,22
+58,34
+58,60
+62,12
+53,70
+46,60
+42,50
+7,20
+22,38
+2,62
+0,62
+14,5
+29,68
+64,44
+42,0
+58,40
+66,42
+60,32
+28,32
+69,70
+40,40
+35,12
+47,50
diff --git a/2024/18-RAM_Run/second.hs b/2024/18-RAM_Run/second.hs
new file mode 100644
index 0000000..04c465c
--- /dev/null
+++ b/2024/18-RAM_Run/second.hs
@@ -0,0 +1,84 @@
+-- requires cabal install --lib megaparsec parser-combinators heap vector
+module Main (main) where
+
+import Control.Monad (void, when)
+import Data.Functor
+import qualified Data.Heap as H
+import qualified Data.List as L
+import qualified Data.Map as M
+import qualified Data.Vector as V
+import Data.Void (Void)
+import Text.Megaparsec
+import Text.Megaparsec.Char
+
+exampleExpectedOutput = (6, 1)
+
+type Coord = (Int, Int)
+type Input = [Coord]
+
+type Parser = Parsec Void String
+
+parseNumber :: Parser Int
+parseNumber = read <$> some digitChar
+
+parseCoord :: Parser Coord
+parseCoord = (,) <$> parseNumber <* char ','
+ <*> parseNumber <* eol
+
+parseInput' :: Parser Input
+parseInput' = some parseCoord <* eof
+
+parseInput :: String -> IO Input
+parseInput filename = do
+ input <- readFile filename
+ case runParser parseInput' filename input of
+ Left bundle -> error $ errorBundlePretty bundle
+ Right input' -> return input'
+
+type Cost = Int
+data Position = Position Coord Cost deriving Show
+instance Ord Position where
+ compare (Position _ c1) (Position _ c2) = c1 `compare` c2
+instance Eq Position where
+ (Position p1 _ ) == (Position p2 _ ) = p1 == p2
+type Visited = M.Map Coord Cost
+type Maze = M.Map Coord ()
+
+type Candidates = H.MinHeap Position
+
+compute' :: Int -> Int -> Input -> Bool
+compute' size cutoff input = walk (M.singleton (0, 0) 0) $ H.singleton (Position (0, 0) 0)
+ where
+ walk :: Visited -> Candidates -> Bool
+ walk v h | H.isEmpty h = False
+ | x == size && y == size = True
+ | otherwise = walk v' $ H.union h' $ H.fromList n
+ where
+ ([pos@(Position p@(x, y) c)], h') = H.splitAt 1 h
+ n = nexts v pos
+ v' = L.foldl' (\acc (Position a b) -> M.insert a b acc) v n
+ nexts :: Visited -> Position -> [Position]
+ nexts v (Position p c) = L.filter (valid v) . map (\p' -> Position p' (c+1)) $ candidates p
+ valid :: Visited -> Position -> Bool
+ valid v (Position p@(x, y) c) = x >= 0 && x <= size && y >= 0 && y <= size && not (M.member p maze) && case M.lookup p v of
+ Just c' -> c < c'
+ Nothing -> True
+ candidates :: Coord -> [Coord]
+ candidates (x, y) = [ (x-1, y), (x+1, y), (x, y-1), (x, y+1) ]
+ maze = M.fromList $ zip (take cutoff input) (L.repeat ())
+
+compute :: Int -> Int -> Int -> Input -> Coord
+compute size n m input | mid == n = input L.!! n
+ | valid = compute size mid m input
+ | otherwise = compute size n mid input
+ where
+ mid = (n + (m - n) `div` 2)
+ valid = compute' size mid input
+
+main :: IO ()
+main = do
+ example <- parseInput "example"
+ let exampleOutput = compute 6 12 (length example) example
+ when (exampleOutput /= exampleExpectedOutput) (error $ "example failed: got " ++ show exampleOutput ++ " instead of " ++ show exampleExpectedOutput)
+ input <- parseInput "input"
+ print $ compute 70 1024 (length input) input