this repo has no description
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