Skip to content

Instantly share code, notes, and snippets.

@Kroisse
Created October 31, 2015 09:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Kroisse/73fb14ffaeddbb71788c to your computer and use it in GitHub Desktop.
Save Kroisse/73fb14ffaeddbb71788c to your computer and use it in GitHub Desktop.
Draw a Sierpinski triangle
module Main where
import Data.List (genericLength, genericReplicate)
import System.Environment (getArgs, getProgName)
import System.Exit (exitSuccess)
sierpinskiRows :: Integer -> [String]
sierpinskiRows 0 = []
sierpinskiRows 1 = ["*"]
sierpinskiRows n
| n < 0 = error "Negative size"
| otherwise = part ++ zipWith (++) innerPart part where
part = sierpinskiRows (n-1)
size = 2 ^ (n-2)
innerPart = map (rpad size ' ') part
rpad :: (Integral i) => i -> a -> [a] -> [a]
rpad n c s
| genericLength s < n = s ++ genericReplicate (n - genericLength s) c
| otherwise = s
main :: IO ()
main = getArgs >>= parse >>= draw
draw :: Integer -> IO ()
draw = mapM_ putStrLn . sierpinskiRows
parse :: (Read a) => [String] -> IO a
parse [n] = readIO n
parse _ = do
name <- getProgName
putStrLn ("Usage: " ++ name ++ " [number]")
exitSuccess
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment