2017-10-04 9 views
2

私はPython While Loopsを使って次のパターンを描く必要があります。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:] 

これが得られます:

このコードは、単に、所望の形状を得るために、最初の文字列(弓の真ん中)にシフトしている問題を見ている1つの方法を、提供します

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

幸運を祈る!

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

私はリスト内包と文字列を使用し、図の対称性を利用します。

ない完全なソリューションが、彼らはループのをどこかのようにあなたがずっと whileループを使用私見

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) 
関連する問題