Haskell Quiz/PP Pascal/Solution Burton

(Difference between revisions)
 Revision as of 15:40, 2 November 2006 (edit)m ← Previous diff Revision as of 15:43, 2 November 2006 (edit) (undo) (use Integers not Ints in `pascal')Next diff → 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 :: [[Int]] + 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 :: [[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) ' '