import Data.Char main = do content <- getContents let input = map digitToInt $ init content let base = [0,1,0,-1] let patter = map (getPatternForIndex base (length input)) [1..(length input)] let test1 = doSteps input patter 100 putStrLn (show input) --mapM putStrLn (map show patter) putStrLn (show test1) getPatternForIndex :: [Int] -> Int -> Int -> [Int] getPatternForIndex patter length index = drop 1 $ take (length +1) (cycle base) where base = concat $ map (replicate index) patter get :: [Int] -> Int get xs = mod (abs $ (sum xs)) 10 step :: [Int] -> [[Int]] -> [Int] step xs patterns = map ( get . zipWith (*) xs ) patterns doSteps :: [Int] -> [[Int]] -> Int -> [Int] doSteps xs patterns cnt | cnt == 0 = xs | otherwise = doSteps (step xs patterns) patterns (cnt -1)