|
- import System.IO
-
- data Incarnation = S Bool Bool Int (Int,Int) Int Int
-
- seed :: Int -> Int
- seed n = 1 + (h * (n+1))
- where h = (div n 2)
-
- lineage :: Int -> [Int]
- lineage n = take (n*n) $ futures (atom n)
-
- atom :: Int -> Incarnation
- atom n = S False True 1 (1,0) (seed n) n
-
- xor :: Bool -> Bool -> Bool
- xor a b = (a || b) && (not (a && b))
-
- futures :: Incarnation -> [Int]
- futures self@(S _ _ _ _ l _) =
- (l:(futures (evolve self)))
-
- divine :: Incarnation -> Int
- divine (S v s _ _ l n) = l `sign` val
- where
- sign = if s then (+) else (-)
- val = if v then n else 1
-
- evolve :: Incarnation -> Incarnation
- evolve i@(S v s cd (so,sn) _ b)
- | cd > 1 = (S v s (cd-1) (so,sn) (divine i) b)
- | otherwise =
- (S (not v) (s `xor` v) (cs ns) ns (divine i) b)
- where
- ns = (intuit v (so,sn))
- cs = (if v then fst else snd)
-
- intuit :: Bool -> (Int,Int) -> (Int,Int)
- intuit True (a,b) = ((a+1),b)
- intuit _ (a,b) = (a,(b+1))
-
- -- blurgh io
- -- bloating the program making me import stuff >:(
-
- main :: IO ()
- main = do
- putStr "destinies to observe: "
- hFlush stdout
- args <- getLine
- mapM_ putStrLn
- $ map (\n -> ("n=" ++ (show n) ++ " ~ ")
- ++ (if (aura n)
- then (show (lineage (read n)))
- else "[ soul contains invalid aura ]"))
- (words args)
-
- aura :: String -> Bool
- aura s = if (foldr (&&) True (map (`elem` ['0'..'9']) s))
- then ((mod rs 2) == 1)
- else False
- where
- rs = (read s)::Int
|