首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字母表Rangoli

字母表Rangoli
EN

Code Review用户
提问于 2022-05-05 16:15:01
回答 2查看 130关注 0票数 3

我已经用python编写了字母表的rangoli代码,并希望得到它的审查。其目标是打印由字母组成的同心钻石形状,中心是"a“,"b”形成下一层,然后是"c“等等。

任何关于使其更符合逻辑或更简洁的意见,将不胜感激。

代码语言:javascript
复制
import math


# input the size of alphabet rang oli
def print_rangoli(size):
    totalHeight = (2 * size) - 1
    totalWidth = (2 * totalHeight) - 1
    numberOfAlphabets = 1
    numberOfDashes = (totalWidth - numberOfAlphabets) // 2
    # initialize a list of alphabets
    alphabets = "a b c d e f g h i j k l m n o p q r s t u v w x y z".split(" ")
    # run a for loop totalHeight number of times
    for i in range(1, totalHeight + 1):
        if i <= math.ceil(totalHeight / 2):
            print("-" * numberOfDashes, end="")
            listIndex = size - 1
            for k in range(math.ceil(numberOfAlphabets / 2)):
                if size == 1:
                    print(alphabets[listIndex])
                else:
                    print(alphabets[listIndex] + "-", end="")
                listIndex -= 1
            listIndex += 1
            for k in range(math.floor(numberOfAlphabets / 2)):
                listIndex += 1
                if i == math.ceil(totalHeight / 2) and k == math.floor(numberOfAlphabets / 2) - 1:
                    print(alphabets[listIndex], end="")
                else:
                    print(alphabets[listIndex] + "-", end="")

            print("-" * (numberOfDashes - 1))
            if i != math.ceil(totalHeight / 2):
                numberOfAlphabets += 2
                numberOfDashes -= 2
        else:
            numberOfDashes += 2
            numberOfAlphabets -= 2
            print("-" * numberOfDashes, end="")
            listIndex = size - 1
            for k in range(math.ceil(numberOfAlphabets / 2)):
                print(alphabets[listIndex] + "-", end="")
                listIndex -= 1
            listIndex += 1
            for k in range(math.floor(numberOfAlphabets / 2)):
                listIndex += 1
                print(alphabets[listIndex] + "-", end="")

            print("-" * (numberOfDashes - 1))


if __name__ == "__main__":
    size = int(input())
    print_rangoli(size)
EN

回答 2

Code Review用户

发布于 2022-05-06 01:39:23

您可以将代码简化很多。

第一个简单的改变是您不需要这样定义字母表:

字母= "a b,c,d,e,g,h,i,j,k,L m,n,p,q,r,S,t,u,v,w,y,z“,.split(”")

如果将字符串视为可索引的,则代码将运行得很好:

代码语言:javascript
复制
alphabets = "abcdefghijklmnopqrstuvwxyz"

进一步简化,您可以利用内置模块:

代码语言:javascript
复制
from string import ascii_lowercase as alphabets

您可以使用"-"作为左填充、右填充和内部填充,而不是繁琐地确定将这些字符放置在何处,而可以使用str.center(width, '-')来填充,而使用'-'.join('cbabc')来获取"c-b-a-b-c"。把这两种技术结合起来,你就可以写

代码语言:javascript
复制
print('-'.join('cbabc').center(11, '-'))

…获得

代码语言:javascript
复制
--c-b-a-b-c--

计算numberOfDashesnumberOfAlphabets不需要做那么多的运算。我只需要将中间行组合成一个字符串,然后调用len(…)让Python告诉您布局必须有多宽。

按照您构建代码的方式,您有四种情况:if i <= math.ceil(totalHeight / 2):用来测试您是在上半部分还是下半部分,对于每一种情况,一个for k in …循环处理左侧,另一个for k in …循环处理右侧。

我建议使用abs()函数来帮助您执行对称迭代,而不是所有这些。

建议的解决方案

代码语言:javascript
复制
from string import ascii_lowercase

def seq(n, i):
    return '-'.join(
        ascii_lowercase[i + abs(j)]
        for j in range(i - n, n - i + 1)
    )

def rangoli(n):
    width = len(seq(n, 0))        # Pad everything to match the width of the center row
    return '\n'.join(
        seq(n, abs(i)).center(width, '-')
        for i in range(-n, n + 1)
    )

if __name__ == "__main__":
    size = int(input())
    print(rangoli(size - 1))
票数 5
EN

Code Review用户

发布于 2022-05-05 18:41:05

为了打印所有行,您可以使用两个周期:

  • 打印前半行的一个递增周期
  • 打印后半行的递减周期

为了打印一行,您可以注意到:

  • 内容中除了中间的字母(例如edcb +a+ bcde)外,还有与其自身相反的字母连接。
  • 每个空格都以连字符形式打印。
  • 每个字母/空格用连字符分隔。

在这种情况下,您可以做的是首先生成内容(letters+spaces),然后使用Python操作生成您的join行:

代码语言:javascript
复制
# input the size of alphabet rang oli
def print_rangoli(size):
    alphabet = "abcdefghijklmnopqrstuvwxyz"
    
    # extracting letters to use from alphabet
    letters = alphabet[:size]

    # variables used in the cycles
    dashes  = ''
    content = ''

    # generating first half
    for i in range(1, size+1, 1):
        dashes  = '-'*(size-i)
        content = letters[:i][::-1] + letters[1:i]
        print('-'.join(dashes + content + dashes))

    # generating second half
    for i in range(size-1, 0, -1):
        dashes  = '-'*(size-i)
        content = letters[:i][::-1] + letters[1:i]
        print('-'.join(dashes + content + dashes))

if __name__ == "__main__":
    size = int(input())
    print_rangoli(size)

此解决方案还处理与大小范围域0,26相关的边缘情况。如果您想处理与size <0或size > 26相关的情况,可以在函数开始时进行一些检查。

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/276328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档