34 lines
1.1 KiB
Haskell
34 lines
1.1 KiB
Haskell
import Data.Char
|
|
import Debug.Trace as T
|
|
|
|
main = do
|
|
cont <- getContents
|
|
let content = (map digitToInt $ init cont)
|
|
let base = [0,1,0,-1]
|
|
let patter = drop 500 (map (getPatternForIndex base (length content)) [0..(length content)])
|
|
let input = drop 500 content
|
|
|
|
let test1 = doSteps input patter 1
|
|
--putStrLn (show input)
|
|
--mapM putStrLn (map show patter)
|
|
putStrLn (show test1)
|
|
|
|
getPatternForIndex :: [Int] -> Int -> Int -> [Int]
|
|
getPatternForIndex patter length index = drop (1 + index) $ take (length +1) (cycle base)
|
|
where base = concat $ map (replicate (index+1)) patter
|
|
|
|
getInputForIndex :: [Int] -> Int -> [Int]
|
|
getInputForIndex xs index = drop index xs
|
|
|
|
get :: [Int] -> Int
|
|
get xs = mod (abs $ (sum xs)) 10
|
|
|
|
step :: [Int] -> [[Int]] -> [Int]
|
|
step xs patterns = map (\(a,b) -> get( zipWith (*) a b)) $ zip inputs patterns
|
|
where inputs = map (getInputForIndex xs) [0..(length patterns)]
|
|
|
|
doSteps :: [Int] -> [[Int]] -> Int -> [Int]
|
|
doSteps xs patterns cnt
|
|
| cnt == 0 = xs
|
|
| otherwise = doSteps (step xs patterns) patterns (cnt -1)
|