美文网首页
Designer Door Mat - Python@Hacke

Designer Door Mat - Python@Hacke

作者: 瞎鸡扒花 | 来源:发表于2019-01-02 17:06 被阅读0次

    最近在做Hackerrank的练习,Designer Door Mat是python练习中的一题。题目并不难,但是在完成题目后查看讨论区大神的回答后还是感受到了差距,具体如下:

    题目

    Mr. Vincent works in a door mat manufacturing company. One day, he designed a new door mat with the following specifications:

    Mat size must be N * M. (N is an odd natural number, and M is 3 times N.)
    The design should have 'WELCOME' written in the center.
    The design pattern should only use |, . and - characters.
    Sample Designs

    Size: 7 x 21 
    ---------.|.---------
    ------.|..|..|.------
    ---.|..|..|..|..|.---
    -------WELCOME-------
    ---.|..|..|..|..|.---
    ------.|..|..|.------
    ---------.|.---------
    
    Size: 11 x 33
    ---------------.|.---------------
    ------------.|..|..|.------------
    ---------.|..|..|..|..|.---------
    ------.|..|..|..|..|..|..|.------
    ---.|..|..|..|..|..|..|..|..|.---
    -------------WELCOME-------------
    ---.|..|..|..|..|..|..|..|..|.---
    ------.|..|..|..|..|..|..|.------
    ---------.|..|..|..|..|.---------
    ------------.|..|..|.------------
    ---------------.|.---------------
    

    解答

    My Answer

    # Enter your code here. Read input from STDIN. Print output to STDOUT
    N, M = map(int,input().split())
    string = [0 for _ in range(N)]
    
    for i in range(N//2+1):
        tmp = ''
        if i == N // 2:
            for _ in range((M-7)//2):
                tmp += '-'
            tmp += 'WELCOME'
            for _ in range((M-7)//2):
                tmp += '-'
            string[i] = tmp
        else:
            for _ in range((M-3*(2*i+1))//2):
                tmp += '-'
            for _ in range(2*i+1):
                tmp += '.|.'
            for _ in range((M-3*(2*i+1))//2):
                tmp += '-'
            string[i] = tmp
            string[len(string)-i-1]=tmp
    
    print('\n'.join(string))
    

    我的解法是比较愚蠢的直男型解法了,分别处理了WELCOME行和其他行并分别构成每行的字符串,存入列表后再以join的方式输出。再来看大神的解答

    Elegant Answer

    n, m = map(int,input().split())
    pattern = [('.|.'*(2*i + 1)).center(m, '-') for i in range(n//2)]
    print('\n'.join(pattern + ['WELCOME'.center(m, '-')] + pattern[::-1]))
    

    除去解决输入的那一行,仅仅使用两行代码就解决了这一问题。
    大神的解释如下:
    ('.|.'*(2*i + 1)).center(m, '-')将重复出现的.|.用string的center()方法将其设定为居中,并以-符号填充满字符串。
    将该字符串通过for循环构成pattern列表,此时列表的内容会包含

     ---------.|.---------
     ------.|..|..|.------
     ---.|..|..|..|..|.---
    

    之后再输出时加入WELCOME行['WELCOME'.center(m, '-')]和倒序的pattern列表pattern[::-1]

    拓展

    str.center()方法

    str.center(width, [fillchar])
    

    返回width宽度的将str居中的字符串,空缺的部分以fillchar填满。

    参数:
    width -- 字符串的总宽度。
    fillchar -- 填充字符。

    如果 width 小于字符串宽度直接返回字符串,不会截断。fillchar默认为空格且fillchar只支持单个字符。

    list[::-1] Extended Slices

    对于string,list,tuple,可以使用如下方法进行切片:
    <object_name>[<start_index>, <stop_index>, <step>]
    切片会从start index开始,到stop index结束(不包含stop index),并且以step的大小来对index进行操作。step默认为1
    example 1:

    a = '1234'
    print a[::2]
    

    将会输出13

    example 2:

    a = '1234'
    print a[3:0:-1]
    

    将会输出 432

    若step为负数,这回从stop开始逆向输出该字符串。list[;;-1]是常见的将列表逆序输出的操作方式。

    hackerrank designer-door-mat 原题
    what is [::-1] in stackoverflow
    python3 str.center()
    Extended Slices - Python Document

    相关文章

      网友评论

          本文标题:Designer Door Mat - Python@Hacke

          本文链接:https://www.haomeiwen.com/subject/nnugjttx.html