0

このシナリオで板を歩く名前のリストから生存者を決定するコードがあります。リストの最後の人が生き残ります。このコードは次のとおりです。

names =  ["Andrew", "Brenda", "Craig", "Deidre", "Edward", "Felicity", "Greg", "Harriet"]
def survivor(names, step):
    Next = step - 1
    while len(names) > 1:
        names.pop(Next)
        Next = Next + step
        Next = (Next - 1) % len(names)
        print names

    return names[0]

これは、ステップに入ったものに基づいて生存者を返すように機能しますが、人が生き残るためにステップの最小の N を計算する必要もあります。たとえば、グレッグの場合は 3、アンドリューの場合は 2 です。

私がこれのために試したコードは次のとおりです。

assert name in names
for step in survivor(names, step):
    if survivor == name:
        return step

しかし、割り当て前に参照されたローカル変数ステップまたはグローバルステップが定義されていないと言い続けます。

assert name in names
for step in itertools.count(1):
    if survivor(names, step) == name:
        return step

しかし、これは戻ります

[「ブレンダ」、「クレイグ」、「デイドル」、「エドワード」、「フェリシティ」、「グレッグ」、「ハリエット」]

[「クレイグ」、「デイドル」、「エドワード」、「フェリシティ」、「グレッグ」、「ハリエット」]

[「デイドル」、「エドワード」、「フェリシティ」、「グレッグ」、「ハリエット」]

[「エドワード」、「フェリシティ」、「グレッグ」、「ハリエット」]

[「フェリシティ」、「グレッグ」、「ハリエット」]

[「グレッグ」、「ハリエット」]

[「ハリエット」]

これは私が欲しいものではありません

誰でも私がこれを解決するのを手伝ってくれますか?

4

2 に答える 2

2

このループは期待どおりに動作しません。必要なものは次のようになります。

def shortest(name):
    assert name in names
    for step in range(1, len(names)+1):
        #Go through all possible steps, from 1 to number of items (the +1 is to include the last item too)
        if survivor(names[:], step) == name: # Check that this item matches
            return step # Break out of the loop when you get to it

itertools.count(1)機能しますが、 a を使用することもできますwhile True。名前リストの長さよりも大きなステップを使用しても意味がありません。

あなたの問題はおそらく、最初の名前の後に名前配列が空になることでした。popすべての要素を削除しnames、グローバル スコープ (関数の外で定義) にあるリストを変更しているためです。したがって、それを複製する必要があります(どちらかnames[:]またはlist(names)両方を使用して同じ目的を達成します)。

それが私が作ったテストです:

for n in names:
    print n, shortest(n)

そして出力:

Andrew 2
Brenda None
Craig 5
Deidre 7
Edward None
Felicity 4
Greg 3
Harriet 1

注:そこに s がある理由はわかりませんNone...しかし、あなたが与えた例は一致しました!

于 2012-11-21T17:59:28.513 に答える
1
for step in survivor(names, step):

stepここで 2 回使用していることに注意してください。Pythonは、survivor関数からそれを取得する前に、どのように関数に渡すことになっていますか?

あなたが望むのは関数だと思います。これは、1 から名前のリストの長さまでのすべての値をループします。rangestep

for step in range(1, len(names)):

itertools.count考えてみると、あなたのバージョンも機能するはずです。この関数の戻り値をチェックしていますか、それとも出力されたものを見ているだけですか? 出力は、次の行からのもののように見えます。

print names

namesもう1つのことは、変更してコピーを作成していないため、関数が実行されるたびに元のリストが変更されることです。変更する前にコピーを作成したい場合があります。

def survivor(names, step):
    names = names[:]
    # etc

リストのコピーを作成する理由については、この質問を参照してください。names[:]

于 2012-11-21T17:33:23.047 に答える