如何在一行中打印多个三角形 (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]
、
- 写一个函数
boundingBox :: Triangle -> (Int,Int)
.
- 写一个函数
maxBoundingBox :: [Triangle] -> (Int,Int)
.
- 写一个函数
putInBox :: Triangle -> (Int,Int) -> Triangle
.
- 写一个函数
makeSameSize :: [Triangle] -> [Triangle]
.
- 写一个函数
sideToSide :: Triangle -> [String] -> [String]
.
在 foldr
中使用它将所有调整大小的 Triangle
连接在一起。
如果您是第一个创建这些三角形的人,则不需要上述某些功能。然后你只知道你将根据给定参数创建的三角形的边界框。
我有这个自定义的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]
、
- 写一个函数
boundingBox :: Triangle -> (Int,Int)
. - 写一个函数
maxBoundingBox :: [Triangle] -> (Int,Int)
. - 写一个函数
putInBox :: Triangle -> (Int,Int) -> Triangle
. - 写一个函数
makeSameSize :: [Triangle] -> [Triangle]
. - 写一个函数
sideToSide :: Triangle -> [String] -> [String]
.
在 foldr
中使用它将所有调整大小的 Triangle
连接在一起。
如果您是第一个创建这些三角形的人,则不需要上述某些功能。然后你只知道你将根据给定参数创建的三角形的边界框。