【问题标题】:Prompt the user for a number between 1 and 9, then prints a square of text提示用户输入 1 到 9 之间的数字,然后打印一个正方形的文本
【发布时间】:2017-05-02 04:12:30
【问题描述】:

如何编写一个程序,提示用户输入 1 到 9 之间的数字,包括 1 到 9,然后在控制台上打印一个正方形的文本,如下所示:

1****
22***
333**
4444*
55555

这是我目前所拥有的:

import numpy as np

b_num = raw_input()
b_num = int(b_num)

mat = np.zeros((b_num, b_num)).tolist()
mat = np.char.mod('%.5g', mat)
mat[0:9] = '*'

for i in range(b_num):
        for a in range(i):
                mat[i, a] = i + 1
                mat[0:0] = '1'

mat = '\n'.join(map(str, mat))
mat = mat.replace(']', '')
mat = mat.replace('[', '')
mat = mat.replace('\'', '')
mat = mat.replace(' ', '')

print mat

目前这会输出一个成功的数组如下:

1****
22***
333**
4444*
55555

我不禁想知道是否有更优雅的解决方案。

【问题讨论】:

  • 优雅与否是见仁见智,至少你的代码能像你想要的那样工作,也是你所期望的!

标签: python arrays numpy formatting type-conversion


【解决方案1】:

您可以使用格式说明符来打印相应的框:

>>> n = int(input())     # raw_input() Py2
5
>>> for i in range(1, n+1):
...     print("{:*<{width}}".format(str(i)*i, width=n))
1****
22***
333**
4444*
55555

这里使用{:*&lt;{width}},表示用*填充,左对齐&lt;,宽度为{width}——这是一个传递给格式函数width=n的变量

【讨论】:

  • 啊,这是一项重大改进!
【解决方案2】:

怎么样:

b_num = raw_input()
b_num = int(b_num)

for b in xrange(1,b_num+1):
    print("".join((str(b) if i < b else '*' for i in xrange(b_num))))

至少对我来说,这很优雅。

【讨论】:

    【解决方案3】:

    优雅是主观的,但尝试用更少的线条来做到这一点我可能会做这样的事情。

    import numpy as np
    
    b_num = int(input("What Number?"))
    
    arr = np.array([str(i)*i + "*"*(b_num-i)for i in range(1,b_num+1)])
    

    【讨论】:

    • 完全迷人
    猜你喜欢
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多