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每次从中获取下一个字母(因为它们被逐个字符地吐出,我们用 将它们变成一个字符串)。所以我们有下一行,但没有破折号。剩下的很简单:就是它。''.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'; 缓冲区现在是 'bcdefghijklmnopqrstuvwxyz'
-----a-----
请求 3 个字母。缓冲区是 'bcdefghijklmnopqrstuvwxyz'
返回 'bcd'; 缓冲区现在是 'efghijklmnopqrstuvwxyz'
----bcd----
请求 5 个字母。缓冲区是 'efghijklmnopqrstuvwxyz'
返回 'ef​​ghi';缓冲区现在是 'jklmnopqrstuvwxyz'
---efghi---
请求 7 个字母。缓冲区是 'jklmnopqrstuvwxyz'
返回 'jklmnop'; 缓冲区现在是 'qrstuvwxyz'
--jklmnop--
请求 9 个字母。缓冲区是'qrstuvwxyz'
返回'qrstuvwxy';缓冲区现在是“z”
-qrstuvwxy-
请求了 11 封信。缓冲区为 'z'
缓冲区已扩展为 'zabcdefghijklmnopqrstuvwxyz'
返回 'zabcdefghij'; 缓冲区现在是 'klmnopqrstuvwxyz'
zabcdefghij

于 2012-10-15T17:28:43.030 回答