蟒蛇空心钻石

时间:2013-01-02 13:08:06

标签: python

我的目标是使用python创建一个空心钻石。

示例输入:

Input an odd Integer:
      9

示例输出:

    *
   * *
  *   *
 *     *
*       *
 *     *
  *   *
   * *
    *

但到目前为止,我有以下代码无效。请帮我修改代码以实现上述目标:

a=int(input("Input an odd integer: "))

k=1
c=1

r=a

while k<=r:
    while c<=r:
        print "*"
        c+=1

    r-=1
    c=1

    while c<=2*k-1:
        print "*"
        c+=1

    print "\n"
    k+=1

r=1
k=1
c=1

while k<=a-1:
   while c<=r:
       print " "
       c+=1

   r+=1
   c=1

   while c<= 2*(a-k)-1:
       print ("*")
       c+=1

   print "\n"
   k+=1

上面的代码返回的结果离我的目标很远。

Input an odd integer: 7
*
*
*
*
*
*
*
*


*
*
*
*
*
*
*
*


*
*
*
*
*
*
*


*
*
*
*
*
*
*



*
*
*
*
*
*
*
*
*
*
*


*
*
*
*
*
*
*
*
*


*
*
*
*
*
* 
*


*
*
*
*
*


*
*
*





*

我实际上正在转换这篇文章中的代码:用{C}语言编写的http://www.programmingsimplified.com/c/source-code/c-program-print-diamond-pattern,稍后会修改为空洞的代码但我无法理解......我的转换有问题。< / p>

9 个答案:

答案 0 :(得分:9)

空心菱形是等式的解决方案

|x|+|y| = N

在整数网格上。所以空心钻石作为1衬里:

In [22]: N = 9//2; print('\n'.join([''.join([('*' if abs(x)+abs(y) == N else ' ') for x in range(-N, N+1)]) for y in range(-N, N+1)]))
    *    
   * *   
  *   *  
 *     * 
*       *
 *     * 
  *   *  
   * *   
    *    

答案 1 :(得分:8)

您的问题是您继续使用print。 print语句(以及Python 3中的函数)将在您打印的内容后添加换行符,除非您明确告诉它不要。你可以在Python 2中这样做:

print '*', # note the trailing comma

或者在Python 3中(带有打印功能),如下所示:

print('*', end='')

我的解决方案

我对问题采取了自己的看法并提出了这个解决方案:

# The diamond size
l = 9

# Initialize first row; this will create a list with a
# single element, the first row containing a single star
rows = ['*']

# Add half of the rows; we loop over the odd numbers from
# 1 to l, and then append a star followed by `i` spaces and
# again a star. Note that range will not include `l` itself.
for i in range(1, l, 2):
    rows.append('*' + ' ' * i + '*')

# Mirror the rows and append; we get all but the last row
# (the middle row) from the list, and inverse it (using
# `[::-1]`) and add that to the original list. Now we have
# all the rows we need. Print it to see what's inside.
rows += rows[:-1][::-1]

# center-align each row, and join them
# We first define a function that does nothing else than
# centering whatever it gets to `l` characters. This will
# add the spaces we need around the stars
align = lambda x: ('{:^%s}' % l).format(x)

# And then we apply that function to all rows using `map`
# and then join the rows by a line break.
diamond = '\n'.join(map(align, rows))

# and print
print(diamond)

答案 2 :(得分:1)

def diamond(n, c='*'):
    for i in range(n):
        spc = i * 2 - 1
        if spc >= n - 1:
            spc = n - spc % n - 4
        if spc < 1:
            print(c.center(n))
        else:
            print((c + spc * ' ' + c).center(n))

if __name__ == '__main__':
    diamond(int(input("Input an odd integer: ")))

答案 3 :(得分:1)

这不是很漂亮,但它的功能可以满足您的需求:

def make_diamond(size):
    if not size%2:
        raise ValueError('odd number required')
    r = [' ' * space + '*' + ' ' * (size-2-(space*2)) + '*' + ' ' * space for space in xrange((size-1)/2)]    
    r.append(' ' * ((size-1)/2) + '*' + ' ' * ((size-1)/2))
    return '\n'.join(r[-1:0:-1] + r)
  • 首先我检查以确保它是一个奇数,
  • 然后我创建了一个从中心向下的行列表。
  • 然后我创造了最后一点。
  • 然后我将它们作为一个字符串返回,底部的镜子没有中心线。

输出:

>>> print make_diamond(5)
  *  
 * * 
*   *
 * * 
  *  
>>> print make_diamond(9)
    *    
   * *   
  *   *  
 *     * 
*       *
 *     * 
  *   *  
   * *   
    *   

答案 4 :(得分:0)

在一个循环中制作它;)

x = input("enter no of odd lines : ") #e.g. x=5
i = int(math.fabs(x/2)) # i=2 (loop for spaces before first star)
j = int(x-2) #j=3 # y & j carry loops for spaces in between
y = int(x-3) #y=2 
print ( " " * i + "*" )
i = i-1 #i=1

while math.fabs(i) <= math.fabs((x/2)-1): # i <= 1
      b = int(j- math.fabs(y)) # b = (1, 3, 1) no of spaces in between stars
      a = int(math.fabs(i)) # a = (1, 0, 1) no of spaces before first star
      print (" "* a + "*" + " "*b + "*")
      y = y-2 # 2,0,-2
      i = i-1 # 1,0,-1, -2 (loop wont run for -2)

i = int(math.fabs(i)) # i = -2
print ( " " * i + "*")

答案 5 :(得分:0)

之前的回答有两处更正,已在此完成:

import math
x = int(input("enter no of odd lines : ")) #e.g. x=5
i = int(math.fabs(x/2)) # i=2 (loop for spaces before first star)
j = int(x-2) #j=3 # y & j carry loops for spaces in between
y = int(x-3) #y=2 
print ( " " * i + "*" )
i = i-1 #i=1

while math.fabs(i) <= math.fabs((x/2)-1): # i <= 1
    b = int(j- math.fabs(y)) # b = (1, 3, 1) no of spaces in between stars
    a = int(math.fabs(i)) # a = (1, 0, 1) no of spaces before first star
    print (" "* a + "*" + " "*b + "*")
    y = y-2 # 2,0,-2
    i = i-1 # 1,0,-1, -2 (loop wont run for -2)

i = int(math.fabs(i)) # i = -2
print ( " " * i + "*")

注意:现在这适用于python 2.5x和python 3.x. 如果你想知道两个答案的区别,那就google吧!

答案 6 :(得分:0)

sizeChoice = 13
N = sizeChoice//2
for column in range (-N, N + 1):
    for row in range (-N, N + 1):
        if abs(column) + abs(row) == N:
            print ("*", end = " ")
        else:
            print(" ", end = " ")
    print ( )

答案 7 :(得分:0)

此代码非常适合打印空心菱形,您可以在其中设置对角线长度以达到用户要求

n=int(input('Enter Odd Diagonal length :'))-1
j=n-1
print(' '*(n)+'*')
for i in range(1, 2*n):
    if i>n:
        print(' '*(i-n)+'*'+' '*(2*j-1)+'*')
        j-=1
    else:
        print(' '*(n-i)+'*'+' '*(2*i-1)+'*')
if n>1:
    print(' '*n+'*')

答案 8 :(得分:0)

仅使用打印功能的Python中的圣钻石

for i in range(1,6):
    print(' '*(5-i) + '*'*1 + ' '*(i-1) + ' '*max((i-2),0) + '*'*(1%i) )

for j in range(4,0,-1):
    print(' '*(5-j) + '*'*1 + ' '*(j-1) + ' '*max((j-2),0) + '*'*(1%j) )