Haskell Quiz/PP Pascal/Solution Burton

From HaskellWiki
< Haskell Quiz‎ | PP Pascal
Revision as of 15:03, 2 November 2006 by Jim Burton (talk | contribs) (added my solution)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
{--
*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 :: [[Int]]
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-1) ' '
                          padR d      = replicate (pad-(cols d)+1) ' '