检测模式中的位置和移位

时间:2012-09-29 14:42:27

标签: python-3.x

简单地说,当用户输入为6时,我希望使用for或while循环实现以下功能。

z....z
.z..z.
..zz..
..zz..
.z..z.
z....z

zz....
..z..z
...zz.
...zz.
..z..z
zz....

.zz...
z..z..
....zz
....zz
z..z..
.zz...

1 个答案:

答案 0 :(得分:0)

#!/usr/bin/env python3

def create_pattern(pattern_size):
    # Create our list that'll be storing this info
    pattern = []

    # first_x and last_x are "memory" so we know where to place the Xes.
    first_x = 0
    last_x = pattern_size - 1

    # Next, create an inner list for each line
    for level in range(0, pattern_size):

        # start our new line
        pattern.append([])

        # Now place the Xes where they belong
        for x in range(0, pattern_size):
            if x == first_x or x == last_x:
                pattern[level].append("x")
            else:
                pattern[level].append(".")

        # Move the Xes to the new positions
        first_x += 1
        last_x -= 1
    return pattern

# see 'help(list.pop)' and 'help(list.insert)' for more details
def right_shift(line):
    buf = line.pop()
    line.insert(0, buf)
    return line

# This function just acts upon each line of a pattern
def shift_pattern(pattern):
    for line in range(0, len(pattern)):
        line = right_shift(pattern[line])
    return pattern

if __name__ == "__main__":
    original = create_pattern(7)
    for j in range(len(original)):
        if j != 0:
            original = shift_pattern(original)
        for i in range(len(original)):
            print("".join(original[i]))

        print()

这个问题非常简洁。你需要的是一个右移。所以我做了什么 使用列表将模式分解为行和字符。可能有一个 更有效的方法,但它似乎是最直接的方式 这样做,因为Python字符串是不可变的,列表是可变的。

create_pattern()只是设置我们的"输入模式",它会被操纵 在第一次print()之后。

对我来说最有趣(也很重要)的部分是right_shift()。我的第一次 尝试是在程序上设置列表索引。这种方法有效,但是 很容易出错。然后我记得pop()。快速help(list)透露给 我可以简单地从列表中弹出最后一个元素并将其放在 开始"假"正确的转变。结果呢?

x.....x
.x...x.
..x.x..
...x...
..x.x..
.x...x.
x.....x

xx.....
..x...x
...x.x.
....x..
...x.x.
..x...x
xx.....

.xx....
x..x...
....x.x
.....x.
....x.x
x..x...
.xx....

..xx...
.x..x..
x....x.
......x
x....x.
.x..x..
..xx...

...xx..
..x..x.
.x....x
x......
.x....x
..x..x.
...xx..

....xx.
...x..x
x.x....
.x.....
x.x....
...x..x
....xx.

.....xx
x...x..
.x.x...
..x....
.x.x...
x...x..
.....xx

这是一个有趣而有趣的问题。请享用。 :)

注意:将create_pattern()中的7更改为另一个数字以生成其他模式。