如何用Python或任何其他编程语言创建模式?

时间:2014-03-19 21:10:12

标签: python c++ nested-loops

所以我一直试图弄清楚我在Python中看到的这些奇特模式背后的逻辑。例如:

   #
  # #
 # # #
# # # #
 # # #
  # #
   #

我意识到我应该使用嵌套循环来实现这种模式,但我不知道如何绕过它。我认为有一个逻辑可以根据我想要的行数来轻松创建任何模式,例如,假设U想要将上面的模式增加到11行。我应该能够为我的代码提供输入,然后生成它。所以这只是使用for循环并在11范围内迭代。

但是,我对嵌套循环感到困惑。

有人可以解释我需要用来制作任何形状,大小或长度的任何形式的逻辑吗?

注意:如果使用代码示例,请尝试使用Python或C ++。

感谢。

3 个答案:

答案 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:

libaa libcaca

答案 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)

说明

  1. '#'*i:创建一个重复i次的相同模式的字符串。
  2. ' '.join('#'*i):在每个#之间添加一个空格。例如i=4给出# # # #。一个更容易的替代方案是'# '*i,但最后会给出额外的空间。
  3. ' '*(n-i):为前一个字符串添加一个偏移量,以便以下行在之前开始一列。
  4. 将金字塔上下颠倒而不使用最后一行(l[:-1])。请注意,reversed可以替换为l[-2::-1]