Day 5 - alternate solution using unboxed vectors, but unfortunately they're not any faster
This commit is contained in:
parent
d3506becf4
commit
8097d2578d
2
5.hs
2
5.hs
|
@ -1,4 +1,4 @@
|
||||||
import Data.IntMap (IntMap, insert, size, fromList, findWithDefault)
|
import Data.IntMap (IntMap, insert, fromList, findWithDefault)
|
||||||
|
|
||||||
type Length = Int
|
type Length = Int
|
||||||
type Index = Int
|
type Index = Int
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
import Data.Vector.Unboxed (Vector, fromList, (!), (//))
|
||||||
|
import qualified Data.Vector.Unboxed as V (length)
|
||||||
|
|
||||||
|
type Length = Int
|
||||||
|
type Index = Int
|
||||||
|
type Steps = Int
|
||||||
|
type State = (Steps, Index, Vector Int)
|
||||||
|
type Update = Int -> Int
|
||||||
|
|
||||||
|
next :: Update -> State -> State
|
||||||
|
next f (steps, i, jumps) =
|
||||||
|
let value = jumps ! i
|
||||||
|
nextI = i + value
|
||||||
|
nextJumps = jumps // [(i, f value)]
|
||||||
|
in (steps + 1, nextI, nextJumps)
|
||||||
|
|
||||||
|
getExitSteps :: Update -> State -> Int
|
||||||
|
getExitSteps f (steps, i, jumps) =
|
||||||
|
if i >= V.length jumps then steps else getExitSteps f $! next f (steps, i, jumps)
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
input <- readFile "5.txt"
|
||||||
|
let jumpsList = fromList $ map read $ lines input
|
||||||
|
print $ getExitSteps (+1) (0, 0, jumpsList)
|
||||||
|
print $ getExitSteps (\v -> if v >= 3 then v - 1 else v + 1) (0, 0, jumpsList)
|
Loading…
Reference in New Issue