从命令行参数打印出瓷砖

Posted

技术标签:

【中文标题】从命令行参数打印出瓷砖【英文标题】:print out tiles from command line argument 【发布时间】:2020-01-06 03:09:02 【问题描述】:

我需要根据命令行参数打印图块,其中第一个参数是宽度,第二个是名称。 例如:

$ python tile.py 5 tommy
------+|+------
---+|++|++|+---
-----TOMMY-----
---+|++|++|+---
------+|+------

$ python tile.py 7 Samuel 
---------+|+---------
------+|++|++|+------
---+|++|++|++|++|+---
--------SAMUEL-------
---+|++|++|++|++|+---
------+|++|++|+------
---------+|+---------

因为有一些限制:宽度只能是奇数,名字的长度不能超过3*宽度。

我很困惑如何做垂直部分,因为它可以是 5 层、7 层或更多层

import sys
a = int(sys.argv[1])
if a%2==0:
    print('Error: tile height must be an odd number')
else:
    if len(sys.argv[2])>(3*a):
        print('Error: name must fit within  characters'.format(3*a))
    else:
        print('-'*((3*a-3)/2)+'+-+'+'-'*((3*a-3)/2))
        print('-'*((3*a-9)/2))

【问题讨论】:

在我看来,宽度和高度总是相同的,因为你总是将“-”的数量减少 2,直到剩下最少 3,所以对于宽度 = 9,一个一行将有 9 '-' 一个将有 7,然后是 5,然后是 3,这是 4 行,然后是名称的一行,然后以相反的顺序再有 4 行,所以总共 9 个 【参考方案1】:

您可以使用字符串函数str.center 来简化填充。除此之外,您只需使用循环向上计数然后向下计数,利用列表中的 python str.join* 运算符:

#        Growing width       Name    Shrinking width
widths = list(range(a//2)) + [-1] + list(reversed(range(a//2)))
for k in widths:
    # Print name if we're halfway there
    if k == -1: 
        # Print name in uppercase, centered over 3*a characters, padded with '-'
        print(name.upper().center(3*a,'-'))
    else:
        # Repeat '+|+' 1+2k number of times, 
        # join with nothing in between and center, padding with '-'
        print("".join(["+|+"]*(1+2*k)).center(3*a,'-'))


【讨论】:

以上是关于从命令行参数打印出瓷砖的主要内容,如果未能解决你的问题,请参考以下文章

Golang系列文章:打印命令行参数

expect接收命令行传递的参数并设置为变量和打印变量的值

在 bash for 循环中使用命令行参数范围打印包含参数的括号

使用参数 + stdout + stderr 从命令行调用 MFC 应用程序

Perl和python命令行参数的区别

如果提供了任何命令行参数,则将打印语句输出重定向到文件