Haskell如何实现多个自定义三角形在同一行并排打印输出
实现思路
你思路的方向是对的,核心就是先统一三个三角形的高度,再按行横向拼接即可,具体实现逻辑如下:
- 编写辅助函数补全每个三角形的高度:以三个三角形的最大高度为基准,给高度不足的三角形顶部补对应数量的全空格行,保证三个三角形行数相同
- 用
zipWith3将三个三角形的对应行拼接,行之间可加自定义数量的空格做间隔 - 最后将拼接好的行统一用
unlines输出
完整实现代码
import Data.List ( intersperse, zipWith3 ) type Triangle = Char -> Int -> [String] centeredTriangle :: Triangle centeredTriangle c n = [replicate (n-i) ' ' ++ intersperse ' ' (replicate i c) | i <- [0 .. n]] -- 辅助函数:将三角形补全到指定高度,顶部补空格行 padTriangle :: Int -> [String] -> [String] padTriangle targetHeight tri = let currentHeight = length tri -- 计算需要补的行数 padLineCount = targetHeight - currentHeight -- 取三角形底行的长度作为补全行的长度,保证对齐 lineWidth = length $ last tri padLines = replicate padLineCount (replicate lineWidth ' ') in padLines ++ tri triangles :: Int -> Int -> Int -> IO() triangles a b c = do let t1 = centeredTriangle '*' a t2 = centeredTriangle '*' b t3 = centeredTriangle '*' c -- 取三个三角形的最大高度作为统一高度 maxH = maximum [length t1, length t2, length t3] -- 补全所有三角形到统一高度 paddedT1 = padTriangle maxH t1 paddedT2 = padTriangle maxH t2 paddedT3 = padTriangle maxH t3 -- 按行拼接,中间加4个空格做间隔,可按需调整间隔大小 combinedLines = zipWith3 (\x y z -> x ++ " " ++ y ++ " " ++ z) paddedT1 paddedT2 paddedT3 putStr $ unlines combinedLines
使用说明
在GHCI中执行triangles 1 2 3即可得到你期望的横向并排效果,如果不需要最顶部的全空行,将最后一行输出代码改为putStr $ unlines $ tail combinedLines即可。
内容的提问来源于stack exchange,提问作者Mampenda
相关产品推荐
相关产品推荐

