0

我有这个自定义的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获取每个三角形的底线(列表的最后一个元素),并将它们放在一个新字符串中,然后我将其作为新字符串列表中的最后一个元素。我想如果我为每个元素(从最后一个元素开始)一直到顶部都这样做,我可以使用我的主要功能在同一行中打印三角形。我如何实现这一目标?

4

1 回答 1

1

使用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的 s 连接在一起。

如果您是首先创建这些三角形的人,则不需要上述某些功能。然后你只知道你将从给定的参数创建的三角形的边界

于 2021-10-10T18:12:21.853 回答