packages feed

diagrams-0.2.1.3: example/ferrers.hs

module Main where

import Graphics.Rendering.Diagrams
import Graphics.Rendering.Diagrams.Engine
import Graphics.Rendering.Diagrams.Types

import Data.List
import Data.Function

partitions :: Int -> [[Int]]
partitions n = partitions' n n
  where partitions' 0 _ = [[]]
        partitions' n 1 = [replicate n 1]
        partitions' n k = do s <- [k,k-1..1]
                             p <- partitions' (n-s) (min (n-s) s)
                             return (s:p)

parts = groupBy ((==) `on` head) . partitions

ferrersTableaux :: Int -> Diagram
ferrersTableaux = vsep 20 . map (hsep 20 . map ferrers) . parts

ferrers :: [Int] -> Diagram
ferrers = hsep 3 . map (vsep 3 . flip replicate (circle 10))

main = renderAs PNG "ferrers.png" (Height 300) (lw 0 $ fc black $ ferrersTableaux 6)