2017-10-04 15 views
2

我需要使用Python While循環繪製以下模式。如何使用Python 2.7繪製這個領結圖案?

enter image description here

我花了相當多的時間和與此代碼打印它完美地來到了但是這個代碼是這麼多長,我覺得它不是那種好碼之一。

如果這裏有人能幫我縮小這段代碼或者提出一個更好的輸出方式嗎?

這裏是代碼:

#Question 10, Alternate Approach 
temp = 1 
pattern = "" 
innerSpace = 7 
starCount = 1 
while temp <= 5: 
    st = 1 
    while st <= starCount: 
     pattern = pattern + "*" 
     if st != starCount: 
      pattern = pattern + " " 
     st = st + 1 
    sp = 0 
    if temp == 5: 
      innerSpace = 1 
    while sp < innerSpace: 
     pattern = pattern + " " 
     sp = sp + 1 
    st = 1 
    while st <= starCount: 
     if temp == 5: 
      st = st + 1 
     pattern = pattern + "*" 
     if st != starCount: 
      pattern = pattern + " " 
     st = st + 1 
    temp = temp + 1 
    innerSpace = innerSpace - 2 
    pattern = pattern + "\n" 
    if temp % 2 == 0: 
     pattern = pattern + " " 
    else: 
     starCount = starCount + 1 
starCount = 2 
innerSpace = 1 
while temp > 5 and temp <= 9: 
    st = 1 
    while st <= starCount: 
     pattern = pattern + "*" 
     if st != starCount: 
      pattern = pattern + " " 
     st = st + 1 
    sp = 0 
    while sp < innerSpace: 
     pattern = pattern + " " 
     sp = sp + 1 
    st = 1 
    while st <= starCount: 
     pattern = pattern + "*" 
     if st != starCount: 
      pattern = pattern + " " 
     st = st + 1 
    temp = temp + 1 
    innerSpace = innerSpace + 2 
    pattern = pattern + "\n" 
    if temp % 2 == 0: 
     starCount = starCount - 1 
     pattern = pattern + " "   
print pattern 
+0

不,它不是。這個領結與我的相比有不同的模式。 –

+0

修改它,這就是程序員所做的! –

+0

考慮渲染到臨時(隨機訪問)緩衝區,而不是直接渲染到流。也許'collections.defaultdict'? – o11c

回答

3

因爲這看起來像一個任務,我會給你一個提示我會怎麼做。

利用弓的對稱性。它關於水平軸和垂直軸是對稱的。因此,您只需要解決1個角落,然後複製/鏡像結果以獲得其餘部分。

此代碼給出的看問題,這是剛剛移位初始字符串(弓的中間),以獲得所期望的形狀的一種方法:

m  = '*' 
size = 4 
n  = 5 # must be odd 
pad = ' ' * n 
middle = (m + pad) * size 
half = int(n/2) + 1 

print middle 
print middle[half*1:] 
print middle[half*2:] 
print middle[half*3:] 
print middle[half*4:] 
print middle[half*5:] 
print middle[half*6:] 

其中產量此:

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

祝你好運!

2

使用明星和間距和計數變量

counting=1 
star_amount=1 
space_amount=6 
loop_var=7 
while loop_var>0: 
    loop_var-=1 
    if space_amount==0: 
     counting*=-1 
    stars=" * "*star_amount 
    spaces=" "*space_amount 
    print(stars+spaces+stars) 
    star_amount+=counting 
    space_amount-= counting*2 
+0

非常感謝,但它在我的大學任務中,我需要通過循環來完成。 –

+0

@HenrySpike原始問題中沒有指定。 – SethMMorton

+0

我已經編輯它到您的需求 –

2

我會使用列表解析和字符串,並利用圖形的對稱性。

不是一個完整的解決方案,但恕我直言,您使用的可能是一個循環體

In [2]: a = '*' + ' '*8 

In [3]: a 
Out[3]: '*  ' 
In [24]: result = '' 

In [25]: result += a 

In [26]: result 
Out[26]: '*  ' 

In [27]: result += a[-1::-1] 

In [28]: result 
Out[28]: '*    *' 

In [29]: result += '\n' 

In [30]: a = ' '+'*' + ' '*7 

In [31]: a 
Out[31]: ' *  ' 

In [32]: result += a 

In [33]: result += a[-1::-1] 

In [34]: result += '\n' 

In [36]: print result 
*    * 
*    * 
2

的一部分循環多,如果他們在那裏爲循環。 我不認爲這是你的老師想要的。

背後的想法是運行,直到滿足某些條件,而不是 必然當迭代次數超過一定的限制。

條件並不需要包括在while語句中,您可以稍後檢查,並使用突破命令逃跑的循環

嘗試例如這樣的:

start = '*' 
while True: 
    print start 
    if start[0] == '*': 
     start = ' ' + start 
    else: 
     start = '*' + start   
    if (start == '* * *'): 
     break 

輸出只是你作業的一部分,認爲你應該能夠把它解決到最終的預期結果!

2

希望到了這個時候,HW就完成了。因爲我使用dynamic programming解決了這個問題,所以我想我會在這裏列出解決方案。

評論: 雖然看着模式,它觀察到,上半部分的下半部分是palindrome。因此我們只需要計算上半部分。

接下來,我們看到,對於每一個行計數,我們有圖案等,
行1 = 1,N
行2 = 2,n -1個
行3 = 1,3,N-2,N
行4 = 2,4,n-3,n-1
..等等。

將迭代索引作爲行計數並將n作爲輸入值,我們可以非常有效地動態計算剩餘值。

源代碼

def get_list(bound, alist): 
    tmp_list = [] 
    for i in xrange(1,bound + 1): 
     tmp_list.append(star if i in alist else dot) 
    return tmp_list 

star = "*" 
dot = " " 

n = 20 #How large of BowTie do you want? 
m = (n * 2) - 1 

#get top half list 
th = [] 
for idx,k in enumerate(xrange(1,n+1)): #run through 1 - n 
    row = idx + 1 
    tmplst = [] 
    if row % 2 != 0: 
     tmplst.append(i for i in xrange(1,row + 1) if i % 2 != 0) 
     tmplst.append(i for i in xrange(m, m-row, -1) if i % 2 != 0) 
    else: 
     tmplst.append(i for i in xrange(1,row + 1) if i % 2 == 0) 
     tmplst.append(i for i in xrange(m, m-row, -1) if i % 2 == 0) 
    #append each row value to top half list. 
    th.append(sorted(set([j for i in tmplst for j in i]))) 

#create palindrome of top half which is our bottom half 
th = th + th[len(th) -2::-1] 

#create list of * and blanks 
final = [get_list(m, i) for i in th] 

#Print BowTie 
for i in final: 
    print ' '.join(i)