簡體   English   中英

打印 '*' 的 'X' 模式

[英]Print a 'X' pattern of '*'

我正在嘗試在 Python 中打印此模式:

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

並想出了這個代碼:

size = 7
inner_size = size - 3
space=0

for i in range(inner_size):
    print (' ' * space + '*' + ' ' * inner_size + '*')
    inner_size -=2
    space +=1
print "    *"

t_size=7
t_inner_size = 0
space=3
for i in range(inner_size):
    print (' ' * space + '*' + ' ' * inner_size + '*')
    inner_size +=2
    space -=1

但是,它打印了這個:

*    *
 *  *
  **
   **
    *

如何打印所需的圖案? 是否可以在一個循環中完成此操作?

這是一種方法:

def pattern(size):
    for i in range(size):
        print("".join("*" if j == i or size - 1 - j == i else " "
                      for j in range(size)))

詳細信息: i是行索引, j是列索引(均從零開始)。 j == i條件生成從左上角到右下角的對角線。 size - 1 - j == i條件生成從右上角到左下角的對角線。 它們一起產生了 X 形狀。

當調用大小為 7 時:

pattern(7)

它打印:

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

請注意,它適用於偶數和奇數大小。 在大小均勻的情況下,生成的 X 將在中心包含一個 2x2 的星星塊。

解決問題的另一種方法:

for i in range(5):
      for j in range(5):
           if ((i==j) or j==(5-i-1)):
               print " *",
           else:
               print " ",
       print ""

~

我在問題中使用了您現有代碼中的想法,並使用簡單、清晰的代碼在單個循環中進行了一些調整:

def xprint(size):
    i,j = 0,size - 1

    while j >= 0 and i < size:

        initial_spaces = ' '*min(i,j)
        middle_spaces = ' '*(abs(i - j) - 1)
        final_spaces = ' '*(size - 1 - max(i,j))

        if j == i:
            print initial_spaces + '*' + final_spaces
        else:
            print initial_spaces + '*' + middle_spaces + '*' + final_spaces

        i += 1
        j -= 1

xprint(7) 

它打印出:

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

一種線性時間簡單的方法。

您問是否可以通過“單循環來完成。 所以你去:

n = 3
for i in range(-n, n + 1):
    print('{}*{}{}'.format(
        (n + 1 - abs(i)) * ' ',
        (2 * abs(i) - 1) * ' ',
        '' if i == 0 else '*'))

說明:

對於任何給定的行,我們需要 2 組空格。 第一個*之前的空格和第一個*之后的空格。 我們將字符串格式化如下: {}*{}

現在我們添加一個額外的占位符,因為每一行都有 2x '*',除了中間的一行。 我們以類似於-3 -2 -1 0 1 2 3的方式進行計數,中間線的索引為0 因此現在我們的字符串格式變成了{}*{}{}

現在,第一個*之前的空間需要n + 1 - abs(i)否。 的空間。
第一個*之后的空格需要n + 1 - abs(i)沒有空格。

輸出(n=3):

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

輸出(n=5):

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

雖然人們使用整個圖案尺寸作為輸入,但我認為使用重復尺寸作為輸入更直觀。 因此,只需根據需要更改n的值。

PS:這不是最優雅的,也不是最清晰的解決方案。 但它在單個循環中工作。

你也可以這樣做:

pattern_size = 7
for t in range(pattern_size):
    pattern = list(" " * pattern_size)
    pattern[t] = "*"
    pattern[-(t+1)] = "*"
    print("".join(pattern))

輸出:

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

上述模式的另一個代碼

i = 0
j = 6
for row in range(7):
    for column in range(7):
        if(column == i or column == j):
            print("*",end="")
        else:
            print(" ",end="")
    print("\n")
    i += 1
    j -= 1

結果:

*     *

 *   * 

  * *  

   *   

  * *  

 *   * 

*     *

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM