【问题标题】:Making diamond ASCII art with Python用 Python 制作钻石 ASCII 艺术
【发布时间】:2017-09-03 01:49:42
【问题描述】:

我无法制作这颗钻石。每当我使字符等于偶数长度时,结果都很好。然而,当它很奇怪时,只有钻石的底部会被弄乱。我已经为此工作了几个小时,几乎完成了。提前感谢您的帮助。

chars = 'ABCDEF'
length = len(chars)
string = ''
dots = (length*2 - 1)*2 - 1
for i in range(length):
    string1 = ''
    string += chars[i]
    length1 = len(string)
    for j in range(0, length1):
        if j % 2 != 0:
            string1 += chars[length -1 - j].center(3, '.')
        else:
            string1 += chars[length - 1 - j]
    for k in range(i - 1, -1, -1):
        if k % 2 != 0:
            string1 += chars[length - 1 - k].center(3, '.')
        else:
            string1 += chars[length - 1 - k]
    string1 = string1.center(dots, '.')
    print(string1)

string=''
for i in range(length - 1):
    string1 = ''
    string += chars[i]
    length1 = len(string)
    for j in range(length - 1 - i):
        if j % 2 != 0:
            string1 += chars[length - 1 - j]
        else:
            string1 += chars[length -1 - j].center(3, '.')
    for k in range(i + 2, length):
        if k % 2 != 0:
            string1 += chars[k].center(3, '.')
        else:
            string1 += chars[k]
    string1 = string1.center(dots, '.')     
    print(string1)

当字符长度为奇数时

当字符长度为偶数时

【问题讨论】:

    标签: python python-3.x string ascii-art


    【解决方案1】:

    这是蟒蛇。您可以使用许多有用的字符串函数在几行代码中创建创造性的 ASCII 艺术。

    其中一些最重要的是str.joinstr.Xjust。我们还将使用chrord 来遍历字符范围。

    首先,定义一个处理填充的函数。

    def pad(c1, c2, sep='.', field_width=10):
        out = sep.join(chr(x) for x in range(c2, c1, -1)).rjust(field_width, sep) # build the first part 
        return sep.join([out, chr(c1), out[::-1]])
    

    第一行代码将构建菱形线的前半部分。第二行将前半部分与中心字母和前半部分的反转版本连接起来。

    接下来,确定范围 - 您的钻石将有多大。

    start = 'A'
    end = ...
    field_width = (ord(end) - ord('A')) * 2 - 1
    

    现在,您需要两个单独的循环 - 一个用于上方的菱形,另一个用于下方的菱形。两个循环在每次迭代时都调用pad

    for e in range(ord(end), ord(start), -1):
        print(pad(e, ord(end), '.', field_width))
    
    for e in range(ord(start), ord(end) + 1):
        print(pad(e, ord(end), '.', field_width))
    

    end = 'E':

    ........E........
    ......E.D.E......
    ....E.D.C.D.E....
    ..E.D.C.B.C.D.E..
    E.D.C.B.A.B.C.D.E
    ..E.D.C.B.C.D.E..
    ....E.D.C.D.E....
    ......E.D.E......
    ........E........
    

    end = 'F':

    ..........F..........
    ........F.E.F........
    ......F.E.D.E.F......
    ....F.E.D.C.D.E.F....
    ..F.E.D.C.B.C.D.E.F..
    F.E.D.C.B.A.B.C.D.E.F
    ..F.E.D.C.B.C.D.E.F..
    ....F.E.D.C.D.E.F....
    ......F.E.D.E.F......
    ........F.E.F........
    ..........F..........
    

    Seth Difley's answer 探索了一种替代方法,该方法涉及构建钻石的前半部分并将其反转以获得后半部分。实际上,这种方法也可以用于此解决方案,类似于:

    lines = []
    for e in range(ord(end), ord(start) - 1, -1):
        lines.append(pad(e, ord(end), '.', field_width))
    
    for x in lines + lines[-2::-1]:
        print(x)
    

    这也产生相同的输出,并且速度更快。

    【讨论】:

      【解决方案2】:

      策略:由于现有程序正确渲染了菱形的上半部分,因此生成上半部分,然后通过反转上半部分的线条来生成下半部分。 build_diamond 返回一个包含上半部分字符串的列表。 print('\n'.join(string_list)) 打印上半部分。 bottom_of_diamond_string_list = list(reversed(string_list))[1:] 从上半部分反转字符串,并用[1:] 删除中间字符串以获得下半部分的字符串。 print('\n'.join(bottom_of_diamond_string_list)) 打印下半部分。经过测试并适用于 5 和 6(偶数和奇数)chars 长度。如果需要,可以进行更多代码清理。

      chars = 'ABCDEF'
      length = len(chars)
      
      def build_diamond(length):
          dots = (length*2 - 1)*2 - 1
          string = ''
          string_list = []
          for i in range(length):
              string1 = ''
              string += chars[i]
              length1 = len(string)
              for j in range(0, length1):
                  if j % 2 != 0:
                      string1 += chars[length -1 - j].center(3, '.')
                  else:
                      string1 += chars[length - 1 - j]
              for k in range(i - 1, -1, -1):
                  if k % 2 != 0:
                      string1 += chars[length - 1 - k].center(3, '.')
                  else:
                      string1 += chars[length - 1 - k]
              string1 = string1.center(dots, '.')
              string_list.append(string1)
          return string_list
      
      if __name__ == '__main__':
          string_list = build_diamond(length)
          print('\n'.join(string_list))
          bottom_of_diamond_string_list = list(reversed(string_list))[1:]
          print('\n'.join(bottom_of_diamond_string_list))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-27
        • 1970-01-01
        • 1970-01-01
        • 2016-10-12
        • 2010-12-14
        • 1970-01-01
        • 2011-11-14
        相关资源
        最近更新 更多