[英]“drawing” char/string shapes by a variable diagonal length in haskell
我正在寻找一个仅通过定义对角线的长度来“绘制”菱形“对象”的函数(将其命名为菱形)(例如:如下所示,因此对角线的长度为5 “ *”,但只有3个可见):
Main> diamond 5
Output:
*
***
*****
***
*
我有以下功能:
stars x
| (x mod 2 == 1) = (firstHalf x) ++ [x] ++ reverse(firstHalf x)
| otherwise = (firstHalf x) ++ reverse(firstHalf x)`
firstHalf x = take (x div 2) (iterate (2+) 1)
space x = map (div 2) (map ((x+1)-) (stars x))
输出示例:
space 5 = [2,1,0,1,2]
stars 5 = [1,3,5,3,1]
此功能可能有效,但我不知道如何解决此错误:
应用程序中输入错误:
diamond x = mapM_ putStrLn $ (replicate (space x) [' ']) ++ (replicate (star x) ['*'])
而且我猜想,即使此错误已解决,也仍需要进行调整,将这两个列表合并以获得所需的结果。 有任何想法吗?
您可以生成许多与明星replicate
:
ghci> replicate 5 '*'
"*****"
您也可以使用任何其他字符(例如空格( ' '
)来执行此操作。
您可以使用putStrLn
在屏幕上打印一行:
ghci> putStrLn (replicate 5 '*')
*****
这是一个生成上面星星的程序:
main = do
putStrLn $ replicate 2 ' ' ++ replicate 1 '*'
putStrLn $ replicate 1 ' ' ++ replicate 3 '*'
putStrLn $ replicate 0 ' ' ++ replicate 5 '*'
putStrLn $ replicate 1 ' ' ++ replicate 3 '*'
putStrLn $ replicate 2 ' ' ++ replicate 1 '*'
您可以使用=
定义函数:
hello x = putStrLn $ "Hello " ++ x
main = do
hello "Bob" -- prints "Hello Bob"
(如果您从ghci提示符下执行此操作,则必须先说出let
:例如: let hello x = putStrLn $ "Hello " ++ x
)
我不知道为什么我在这个问题上花了很多时间,但是我感觉很喜欢。 通常,我们希望问题提供一些证据,证明您在寻求帮助之前已经花费了一些时间来尝试解决问题。 圣诞节快乐...
我把所有的东西都给你了。 现在,您必须将它们放在一起。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.