所以我一直试图弄清楚我在Python中看到的这些奇特模式背后的逻辑。例如:
#
# #
# # #
# # # #
# # #
# #
#
我意识到我应该使用嵌套循环来实现这种模式,但我不知道如何绕过它。我认为有一个逻辑可以根据我想要的行数来轻松创建任何模式,例如,假设U想要将上面的模式增加到11行。我应该能够为我的代码提供输入,然后生成它。所以这只是使用for循环并在11范围内迭代。
但是,我对嵌套循环感到困惑。
有人可以解释我需要用来制作任何形状,大小或长度的任何形式的逻辑吗?
注意:如果使用代码示例,请尝试使用Python或C ++。
感谢。
答案 0 :(得分:1)
谁不喜欢小码高尔夫
def makeDiamond(i):
from math import fabs
for x in range(-i+1,i):
print "%s%s"%(" "*abs(x), "# "*(i-abs(x)))
#print " " abs(x) number of times
#print "# " i-abs(x) number of times
#Or (which is much harder to read)
def makeDiamond2(i):
from math import fabs
"\n".join(["%s%s"%(" "*abs(x),"# "*(i-abs(x))) for x in range(-i+1,i)])
makeDiamond(4)
尝试制作形状时,请记下每行要查看的数字,然后尝试查找图案
3,1 | #
2,2 | # #
1,3 | # # #
0,4 |# # # #
1,3 | # # #
2,2 | # #
3,1 | #
我看到的是:
3,4-3 | #
2,4-2 | # #
1,4-1 | # # #
0,4-0 |# # # #
1,4-1 | # # #
2,4-2 | # #
3,4-3 | #
当你从i计数到0再回到i时的一个技巧是在你的循环中开始负数并取绝对值math.fabs
-3,4-3 | #
-2,4-2 | # #
-1,4-1 | # # #
+0,4-0 |# # # #
+1,4-1 | # # #
+2,4-2 | # #
+3,4-3 | #
答案 1 :(得分:0)
这是我的解决方案
def isfilled(x,y,n):
filled="#"
if (x+y)%2==0:
filled=" "
if x+y<n or x-y>n or y-x>n or x+y>3*n:
filled=" "
return filled
n=int(raw_input())
for x in range(2*n):
line=""
for y in range(2*n):
line+=isfilled(x,y,n)
if line.strip()=="":
continue
print line.rstrip()
基本上你将输出解释为(x,y)坐标并尝试用数学意义描述模式,例如黑棋盘正方形填充x+y mod 2 =0
x+y<n
等其他4个条件会从模式中删除半平面。
如果你的矢量格式的模式,让我们说作为一个svg文件,那么你可以这种方式绘制任意大小的任意模式
有些图书馆可以为(光栅)图像甚至视频执行这种ascii-art:
答案 2 :(得分:0)
这是我的算法:
def diamond(n):
l = [' '*(n-i) + ' '.join('#'*i) for i in range(1,n+1)]
l += reversed(l[:-1])
return '\n'.join(l)
说明:
'#'*i
:创建一个重复i
次的相同模式的字符串。' '.join('#'*i)
:在每个#
之间添加一个空格。例如i=4
给出# # # #
。一个更容易的替代方案是'# '*i
,但最后会给出额外的空间。' '*(n-i)
:为前一个字符串添加一个偏移量,以便以下行在之前开始一列。l[:-1]
)。请注意,reversed
可以替换为l[-2::-1]
。