如何在一行中打印多个三角形 (HASKELL)

How to print several triangles in one line (HASKELL)

我有这个自定义的IO() Triangle,它有一个三角形的每一行作为列表中的一个元素:

import Data.List ( intersperse )
type Triangle = Char -> Int -> [String]

centeredTriangle :: Triangle
centeredTriangle c n = [replicate (n-i) ' ' ++ intersperse ' ' (replicate i c) | i <- [0 .. n]]

输出:

Ok, one module loaded.
ghci> centeredTriangle '*' 6
["      ","     *","    * *","   * * *","  * * * *"," * * * * *","* * * * * *"]

当我 运行 我的主要功能时,我使用 unlines 像这样打印出三角形:

triangles :: Int -> Int -> Int -> IO()
triangles a b c = do 
    putStr $ unlines $ centeredTriangle '*' a
    putStr $ unlines $ centeredTriangle '*' b 
    putStr $ unlines $ centeredTriangle '*' c

输出:

ghci> triangles 1 2 3

*

 *
* *

  *
 * *
* * *

我想在同一行打印三角形,像这样:

ghci> triangles 1 2 3

               *
       *      * *
 *    * *    * * *

我意识到这可能是一个比我最初预期的更大的任务,但我的第一个想法是使用 centeredTriangle 获取每个三角形的底线(列表的最后一个元素),并将它们放在一起在一个新字符串中,然后将其作为新字符串列表中的最后一个元素。我想如果我对每个元素(从最后一个开始)执行此操作并一直到顶部,我可以使用我的主要功能在同一行中打印三角形。我该如何实现?

正在使用 type Triangle = [String]

  1. 写一个函数boundingBox :: Triangle -> (Int,Int).
  2. 写一个函数maxBoundingBox :: [Triangle] -> (Int,Int).
  3. 写一个函数putInBox :: Triangle -> (Int,Int) -> Triangle.
  4. 写一个函数makeSameSize :: [Triangle] -> [Triangle].
  5. 写一个函数sideToSide :: Triangle -> [String] -> [String].

foldr 中使用它将所有调整大小的 Triangle 连接在一起。

如果您是第一个创建这些三角形的人,则不需要上述某些功能。然后你只知道你根据给定参数创建的三角形的边界框。