fork(2) download
  1. import Control.Monad
  2.  
  3. data Tree a
  4. = Nil
  5. | Branch a (Tree a) (Tree a)
  6. deriving (Show, Eq)
  7.  
  8. notEach :: Tree Bool -> [Tree Bool]
  9. notEach t = go t id []
  10. where
  11. go :: Tree Bool -> (Tree Bool -> Tree Bool) -> [Tree Bool] -> [Tree Bool]
  12. go Nil repack acc = acc
  13. go (Branch x l r) repack acc =
  14. let acc1 = go r (\r' -> repack $ Branch x l r') acc
  15. acc2 = go l (\l' -> repack $ Branch x l' r) acc1
  16. acc3 = (repack (Branch (not x) l r)) : acc2
  17. in acc3
  18.  
  19. procreateL :: Int -> Tree Bool
  20. procreateL 0 = Nil
  21. procreateL n = Branch (n `rem` 2 == 0) (procreateL (n - 1)) (procreateL (n `div` 2))
  22.  
  23. procreateR :: Int -> Tree Bool
  24. procreateR 0 = Nil
  25. procreateR n = Branch (n `rem` 2 == 0) (procreateR (n `div` 2)) (procreateR (n - 1))
  26.  
  27. test :: IO ()
  28. test = do
  29. guard $ notEach (procreateL 3) == [Branch True (Branch True (Branch False Nil Nil) (Branch False Nil Nil)) (Branch False Nil Nil), Branch False (Branch False (Branch False Nil Nil) (Branch False Nil Nil)) (Branch False Nil Nil), Branch False (Branch True (Branch True Nil Nil) (Branch False Nil Nil)) (Branch False Nil Nil), Branch False (Branch True (Branch False Nil Nil) (Branch True Nil Nil)) (Branch False Nil Nil), Branch False (Branch True (Branch False Nil Nil) (Branch False Nil Nil)) (Branch True Nil Nil)]
  30. guard $ notEach (procreateR 3) == [Branch True (Branch False Nil Nil) (Branch True (Branch False Nil Nil) (Branch False Nil Nil)), Branch False (Branch True Nil Nil) (Branch True (Branch False Nil Nil) (Branch False Nil Nil)), Branch False (Branch False Nil Nil) (Branch False (Branch False Nil Nil) (Branch False Nil Nil)), Branch False (Branch False Nil Nil) (Branch True (Branch True Nil Nil) (Branch False Nil Nil)), Branch False (Branch False Nil Nil) (Branch True (Branch False Nil Nil) (Branch True Nil Nil))]
  31. guard $ length (notEach $ procreateL 150) == 1564307
  32. guard $ length (notEach $ procreateR 150) == 1564307
  33.  
  34. main = test
  35.  
Success #stdin #stdout 0.61s 134352KB
stdin
Standard input is empty
stdout
Standard output is empty