0

高さ 291 行のテキスト ピラミッドを作成しようとしています。これにより、次のことを意味します。

Here is an example of a pyramid of height 6:   
 -----a-----    
----bcd----   
---efghi---  
--jklmnop--  
-qrstuvwxy-  
zabcdefghij  

Notice:   
-- each line has the same number of characters  
-- the letters a-z form the pyramid, and are re-used.

これまでのところ、私が持っているのはこれだけです:

letters="abcdefghijklmnopqrstuvwxyz"
#(291*2)-1
for i in range (581):    

私は本当にこれを行う方法を学びたいので、答え自体ではなく、正しい方向への助けやプッシュがあれば大歓迎です:)

4

1 に答える 1

7
from itertools import cycle, islice

letters = "abcdefghijklmnopqrstuvwxyz"
height = 6
width = height*2-1

it = cycle(letters)
for count in range(1, width+1, 2):
    print(''.join(islice(it, count)).center(width, '-'))

このソリューションはitertoolsモジュールを使用します。
このcycle関数は、一連の文字を無期限に繰り返す反復子を作成し、毎回islice次のcount文字を取得するために使用されます (1 文字ずつ吐き出されるため、 を使用して 1 つの文字列にします)。次の行がありますが、ダッシュはありません。あとは簡単です。それだけです。''.join(...)center


itertoolsを使用しない、非常によく似た別のソリューション:

letters = "abcdefghijklmnopqrstuvwxyz"
height = 6
width = height*2-1

buf = ""
def next_letters(n):
    global buf, letters
    while len(buf)<n:
        buf += letters
    ret, buf = buf[:n], buf[n:]
    return ret

for count in range(1, width+1, 2):
    print(next_letters(count).center(width, '-'))

( bufbuffer) 変数は、シーケンスの次の文字を保持します。このnext_letters関数は、十分な文字があるかどうかを確認し、必要に応じて拡張してから、最初のn文字を返し、それらを「削除」します。

「デバッグ バージョン」でどのように動作するかを見てみましょう。

letters = "abcdefghijklmnopqrstuvwxyz"
height = 6
width = height*2-1

buf = ""
def next_letters(n):
    global buf, letters
    print("Requested {} letters. Buffer is '{}'".format(n, buf))
    while len(buf)<n:
        buf += letters
        print("Buffer was extended to '{}'".format(buf))
    ret, buf = buf[:n], buf[n:]
    print("Returned '{}'; buffer is now '{}'".format(ret, buf))
    return ret

for count in range(1, width+1, 2):
    print(next_letters(count).center(width, '-'))

1文字をリクエストしました。バッファは ''
バッファは 'abcdefghijklmnopqrstuvwxyz' に拡張されました
'a' が返されました。buffer is now 'bcdefghijklmnopqrstuvwxyz' --a
-----
要求された 3 文字。バッファーは 'bcdefghijklmnopqrstuvwxyz' です。'bcd' が
返されました。buffer is now 'efghijklmnopqrstuvwxyz'
----bcd----
要求された 5 文字。バッファーは 'efghijklmnopqrstuvwxyz' です。'efghi' が
返されました。buffer is now 'jklmnopqrstuvwxyz'
---efghi---
7 文字を要求しました。バッファーは 'jklmnopqrstuvwxyz' です 'jklmnop' が
返されました。バッファーは現在 'qrstuvwxyz'
です --jklmnop--
9 文字を要求しました。バッファは「qrstuvwxyz」です
'qrstuvwxy' を返しました。バッファーは「z」
になりました -qrstuvwxy-
11通の手紙を要求。バッファは 'z'
バッファは 'zabcdefghijklmnopqrstuvwxyz' に拡張されました 'zabcdefghij' が
返されました。バッファは「klmnopqrstuvwxyz」
zabcdefghijになりました

于 2012-10-15T17:28:43.030 に答える