Haskell Quiz/PP Pascal/Solution Burton
From HaskellWiki
(Difference between revisions)
m |
(use Integers not Ints in `pascal') |
||
| Line 16: | Line 16: | ||
--} | --} | ||
--Pascal's triangle from http://www.haskell.org/haskellwiki/Blow_your_mind | --Pascal's triangle from http://www.haskell.org/haskellwiki/Blow_your_mind | ||
| - | pascal :: [[ | + | pascal :: [[Integer]] |
pascal = iterate (\row -> zipWith (+) ([0] ++ row) (row ++ [0])) [1] | pascal = iterate (\row -> zipWith (+) ([0] ++ row) (row ++ [0])) [1] | ||
Revision as of 15:43, 2 November 2006
{-- *Main> ppPascal 10 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 --} --Pascal's triangle from http://www.haskell.org/haskellwiki/Blow_your_mind pascal :: [[Integer]] pascal = iterate (\row -> zipWith (+) ([0] ++ row) (row ++ [0])) [1] ppPascal :: Int -> IO () ppPascal n = putStrLn $ unlines $ map ppRow tr where tr = take n pascal mRow = last tr pad = cols $ maximum $ mRow cols n = if n < 10 then 1 else 1 + cols (n `div` 10) ppRow r@(x:xs) = padRow ++ (showFirst x) ++ (concat $ map showRest xs) ++ padRow where showFirst e = (show e) ++ (padR e) showRest e = padL ++ (show e) ++ padR e padRow = replicate ((length mRow - length r)*pad) ' ' padL = replicate pad ' ' padR d = replicate (pad-(cols d)) ' '
