Personal tools

Haskell Quiz/PP Pascal/Solution Jethr0

From HaskellWiki

< Haskell Quiz | PP Pascal(Difference between revisions)
Jump to: navigation, search
m
 
m (using 3 spaces to make the triangle more symmetrical)
Line 2: Line 2:
 
<pre>
 
<pre>
 
> pp_pascal 10
 
> pp_pascal 10
                1
+
                      1
                1 1
+
                    1   1
              1 2 1
+
                  1   2   1
            1 3 3 1
+
                1   3   3   1
          1 4 6 4 1
+
              1   4   6   4   1
        1 5 10 10 5 1
+
          1   5   10   10   5   1
      1 6 15 20 15 6 1
+
        1   6   15   20   15   6   1
    1 7 21 35 35 21 7 1
+
      1   7   21   35   35   21   7   1
   1 8 28 56 70 56 28 8 1
+
   1   8   28   56   70   56   28   8   1
1 9 36 84 126 126 84 36 9 1
+
1   9   36   84   126   126   84   36   9   1
 
</pre>
 
</pre>
  
Line 17: Line 17:
 
Solution:
 
Solution:
 
<haskell>
 
<haskell>
 +
-- also using the pascal triangle function from [[Blow your Mind]]
 
pp_pascal n = unlines . map (center . showp) $ pascal
 
pp_pascal n = unlines . map (center . showp) $ pascal
 
     where pascal  = take n $ iterate (\row -> zipWith (+) ([0] ++ row) (row ++ [0])) [1]
 
     where pascal  = take n $ iterate (\row -> zipWith (+) ([0] ++ row) (row ++ [0])) [1]
           showp    = concat . intersperse " " . map show
+
           showp    = concat . intersperse "   " . map show
 
           len      = length . showp $ last pascal
 
           len      = length . showp $ last pascal
 
           center s = replicate ((len - (length s)) `div` 2) ' ' ++ s
 
           center s = replicate ((len - (length s)) `div` 2) ' ' ++ s
 
</haskell>
 
</haskell>

Revision as of 00:48, 21 December 2006

Example:

> pp_pascal 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


Solution:

-- also using the pascal triangle function from [[Blow your Mind]]
pp_pascal n = unlines . map (center . showp) $ pascal
    where pascal   = take n $ iterate (\row -> zipWith (+) ([0] ++ row) (row ++ [0])) [1]
          showp    = concat . intersperse "   " . map show
          len      = length . showp $ last pascal
          center s = replicate ((len - (length s)) `div` 2) ' ' ++ s