Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module Main where
  2.  
  3. import Data.List
  4.  
  5. data NestedList a = Elem a | List [NestedList a] deriving Show
  6. type NestedInt = NestedList Int
  7.  
  8. test :: (Show a, Eq a) => a -> a -> String
  9. test x y = if x == y then "Pass" else "expected " ++ show x ++ " but got " ++ show y
  10.  
  11. primes n = sieve [2..n]
  12.   where sieve (x:xs) = x : sieve (xs \\ [x,x+x..n])
  13.         sieve [] = []
  14.  
  15. primeFactors :: Int -> [Int]
  16. primeFactors n
  17.   | null factors = [n]
  18.   | otherwise   = let f = head factors in f:primeFactors ( n `div` f)
  19.   where factors = filter (\x -> n `rem` x == 0) $ primes (n-1)
  20.  
  21. encode' :: NestedInt -> NestedInt
  22. encode' (List xs) = List $ map encode' xs
  23. encode' (Elem n)
  24.   | n == 2    = List []
  25.   | otherwise = List $ map (encode' . Elem) $ primeFactors n'
  26.   where primes' = primes n
  27.        n'      = if n `elem` primes' then pIndex else n
  28.        pIndex  = fst $ head $ filter ((n==) . snd) $ zip [1..] primes'
  29.  
  30. encode :: Int -> String
  31. encode = filter (`elem` "[]") . show . (read :: String -> NestedInt) . show . encode' . Elem
  32.  
  33. main :: IO ()
  34. main = do
  35.  print $ test "[[[]][[]]]" $ encode 9
  36.  print $ test "[[][[[]][[]]]]" $ encode 46
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement