1. Haskell / Говнокод #12976

    −95

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    module Main where
    
    import Control.Monad
    --import Data.Monoid
    
    data State s a = State (s -> (a, s))
    
    runState :: State s a -> s -> (a, s)
    runState (State f) = f
    
    instance Monad (State s) where
    			return a = State $ \s -> (a, s)
    			ma >>= mf = State $ \s0 -> let (b, s1) = runState ma s0 
    				in runState (mf b) s1
    
    type FSM s = State s s 
    
    fsm :: (ev -> s -> s) -> (ev -> FSM s)
    fsm transition = \e -> State $ \s -> (s, transition e s)
    
    data PN = NONZ | PONZ | POPZ | NOPZ deriving (Eq,Show)
    
    parse :: Int -> FSM PN
    parse = fsm $ trans 
    	where trans 1 NONZ= PONZ
    	      trans 1 NOPZ= POPZ
    	      trans 1 POPZ= NOPZ
    	      trans 1 PONZ= NONZ
    	      trans 0 POPZ= PONZ
    	      trans 0 PONZ= POPZ
    	      trans 0 NONZ= NOPZ
    	      trans 0 NOPZ= NONZ
    	      
    conv [] = []
    conv ('1':xs) = 1:(conv xs)
    conv ('0':xs) = 0:(conv xs)
    conv (_:xs) = error "parse error"
    
    main =do
    	x <- getLine
    	print $ (snd $ runState (mapM parse (conv x)) POPZ) == POPZ
    	print $ runState (mapM parse (conv x)) POPZ

    Конечный автомат на Haskell

    Запостил: Abbath, 08 Мая 2013

    Комментарии (1) RSS

    Добавить комментарий