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, '-'))
( buf
buffer) 変数は、シーケンスの次の文字を保持します。この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になりました