this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

1module Lib 2 ( checksumAfterXSteps 3 ) where 4 5import qualified Data.Map.Strict as M 6import Data.Maybe 7 8checksumAfterXSteps :: Int -> Int 9checksumAfterXSteps steps = go 0 'A' 0 $ M.singleton 0 False 10 where go :: Int -> Char -> Int -> M.Map Int Bool -> Int 11 go step state pos tape 12 | step == steps = length $ filter (==True) $ map snd $ M.toList tape 13 | otherwise = case state of 14 'A' -> let val = fromMaybe False (M.lookup pos tape) 15 newVal = not val 16 newPos = if not val then (pos + 1) else (pos - 1) 17 newState = 'B' 18 newTape = case M.lookup pos tape of 19 Just _ -> M.adjust (\_ -> newVal) pos tape 20 Nothing -> M.insert pos newVal tape 21 in go (step + 1) newState newPos newTape 22 'B' -> let val = fromMaybe False (M.lookup pos tape) 23 newVal = val 24 newPos = if not val then (pos + 1) else (pos - 1) 25 newState = if not val then 'C' else 'B' 26 newTape = case M.lookup pos tape of 27 Just _ -> M.adjust (\_ -> newVal) pos tape 28 Nothing -> M.insert pos newVal tape 29 in go (step + 1) newState newPos newTape 30 'C' -> let val = fromMaybe False (M.lookup pos tape) 31 newVal = not val 32 newPos = if not val then (pos + 1) else (pos - 1) 33 newState = if not val then 'D' else 'A' 34 newTape = case M.lookup pos tape of 35 Just _ -> M.adjust (\_ -> newVal) pos tape 36 Nothing -> M.insert pos newVal tape 37 in go (step + 1) newState newPos newTape 38 'D' -> let val = fromMaybe False (M.lookup pos tape) 39 newVal = True 40 newPos = (pos - 1) 41 newState = if not val then 'E' else 'F' 42 newTape = case M.lookup pos tape of 43 Just _ -> M.adjust (\_ -> newVal) pos tape 44 Nothing -> M.insert pos newVal tape 45 in go (step + 1) newState newPos newTape 46 'E' -> let val = fromMaybe False (M.lookup pos tape) 47 newVal = not val 48 newPos = (pos - 1) 49 newState = if not val then 'A' else 'D' 50 newTape = case M.lookup pos tape of 51 Just _ -> M.adjust (\_ -> newVal) pos tape 52 Nothing -> M.insert pos newVal tape 53 in go (step + 1) newState newPos newTape 54 'F' -> let val = fromMaybe False (M.lookup pos tape) 55 newVal = True 56 newPos = if not val then (pos + 1) else (pos - 1) 57 newState = if not val then 'A' else 'E' 58 newTape = case M.lookup pos tape of 59 Just _ -> M.adjust (\_ -> newVal) pos tape 60 Nothing -> M.insert pos newVal tape 61 in go (step + 1) newState newPos newTape 62 _ -> 0