0

簡単に言うと、ユーザー入力が 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...
4

1 に答える 1

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

これは楽しく興味深い問題でした。楽しみ。:)

注: 7create_pattern()を別の数字に変更して、他のパターンを生成します。

于 2012-09-30T16:12:07.530 に答える