ピラミッド

与えられた文字列でピラミッドです。id:MAS3:20080210#p1の続編。

import Data.List

main = do putStrLn $ pyramid "hoge"
          putStrLn $ pyramid "abracadabra"

pyramid :: String -> String
pyramid xs = pyramid' 0 xs

pyramid' :: Int -> String -> String
pyramid' _ [] = []
pyramid' n str@(_:xs) = pyramid' (n+1) xs
                        ++ replicate n ' '
                        ++ (Data.List.intersperse ' ' str)
                        ++ replicate n ' '
                        ++ "\n"

再帰を使わない版。横に長いので最後の文字の後ろの空白は省略。

import Data.List

main = do putStrLn $ pyramid "hoge"
          putStrLn $ pyramid "abracadabra"

pyramid :: String -> String
pyramid xs = unlines $ reverse $ map (\(n,m) -> replicate m ' ' ++ (Data.List.intersperse ' ' n)) (zip ((init.tails) xs) [0..])