46 lines
994 B
Haskell
46 lines
994 B
Haskell
import Control.Monad (join)
|
|
import Data.Bifunctor (bimap)
|
|
import Data.Ix (range)
|
|
import Data.List.Split (chunksOf)
|
|
import Data.Tuple (swap)
|
|
|
|
---------------------- PASCAL MATRIX ---------------------
|
|
|
|
pascalMatrix :: ((Int, Int) -> (Int, Int)) -> Int -> [Int]
|
|
pascalMatrix f n =
|
|
bc . f
|
|
<$> range
|
|
((0, 0), join bimap pred (n, n))
|
|
|
|
-- Binomial coefficient
|
|
bc :: (Int, Int) -> Int
|
|
bc (n, k) =
|
|
foldr
|
|
(\x a -> quot (a * succ (n - x)) x)
|
|
1
|
|
[k, pred k .. 1]
|
|
|
|
|
|
--------------------------- TEST -------------------------
|
|
matrixSize = 5 :: Int
|
|
|
|
main :: IO ()
|
|
main =
|
|
mapM_
|
|
putStrLn
|
|
( unlines
|
|
. ( \(s, xs) ->
|
|
s :
|
|
(show <$> chunksOf matrixSize xs)
|
|
)
|
|
<$> zip
|
|
["Lower", "Upper", "Symmetric"]
|
|
( pascalMatrix
|
|
<$> [ id, -- Lower
|
|
swap, -- Upper
|
|
\(a, b) -> (a + b, b) -- Symmetric
|
|
]
|
|
<*> [matrixSize]
|
|
)
|
|
)
|