1

私は 50 個のクリスマス ライトを 1 列に並べていますが、最初にプラグを差し込んだときは、すべてのライトが消えています。ライトは 1 つのボタンで制御され、ボタンを押すたびに、一部のライトの状態が反転します (つまり、オフの場合はオンに変わり、オンの場合はオフに変わります)。変化するライトの選択は、これまでにボタンが押された回数によって異なります。

  • 1 回押すと、1 番目、2 番目、3 番目、4 番目、…、50 番目のライトの状態が変わります
  • 2 回押すと、2 回目、4 回目、6 回目、… のライトの状態が変わります。
  • 3 回目のプレスでは、3 回目、6 回目、9 回目、…、ライトの状態が変わります。
  • n 回押すと、n のすべての倍数に対応するライトの状態が変わります。

任意の回数「n」回押した後に点灯しているライトを確認するにはどうすればよいですか?

ライトを表すブール配列を定義してみました。次の関数を書きました。

lightsarray = [False] * 50 ### All lights are off at start ###

def pressbutton(n):
    count = 0

    for count in range(0, n):   
        lightsarray[::int(n)] = [not y for y in lightsarray[::int(n)]]
        count = count + 1
        return lightsarray

現在、n = 1 の出力はTrue, True, True, True, True, True...

n = 2 の出力は次のとおりです。True, False, True, False, True, False...

ここまでは順調ですね。しかし、n = 3 の場合、私は期待していますTrue, False, False, False, True, True, True...

しかし、私は得ていますTrue, False, False, True, False, False...

配列の状態の割り当て/取得に問題があると思います。これを修正するにはどうすればよいですか? または、より良いアプローチがありますか?

--EDIT-- 皆様、ご回答ありがとうございます。変更を実装し、提案された出力を取得していますが、これがライトの期待される状態と一致するかどうかはわかりません。False = オフ、True = オンであることを念頭に置いて、最初の 5 つのライトを見てみましょう。これは期待されるものです:

0 プレスの場合、すべてオフです。

False, False, False, False, False...

1 回押すと、1 の倍数ごとにライトが反転します。

True, True, True, True, True...

2 回押すと、2 の倍数ごとにライトが反転します。

True, False, True, False, True...

2 番目と 4 番目のライトが切り替えられていることに注意してください。それ以外は変更されていません。

3 回押すと、3 の倍数ごとにライトが反転します。

True, False, False, False, True...

ただし、変更を行った後、たとえば、2 回押すとFalse, True...notが返され、 True, False...3 回押すと返されますTrue, True, False, False, False...(最初に 2 つの True があります)。

これを修正するにはどうすればよいですか? それが理にかなっていることを願っています。

4

3 に答える 3

1

あなたの主な問題は、同じ関数で複数の方法で count を使用していることです。本質的に、for count in rangeは と同じ変数を使用しcount=0count = count + 1ループ変数を変更しています。

lightsarrayもう 1 つの問題は、関数を実行するたびにグローバルを変更しているため、以前に関数を実行した方法によって出力が異なることです。

最後に、pressbutton関数がボタンを何回か押した結果をn表示することになっている場合は、ループの反復ごとにライトを 1 回ずつ反転させるのではなく、ループの反復ごとに異なるライトを変更する必要がありnます。

あなたはただやっているはずです

def pressbutton(n):
    lightsarray = [False] * 50 ### All lights are off at start ###
    for count in range(0, n):
        lightsarray[::count] = [not y for y in lightsarray[::count]]
    return lightsarray
于 2013-11-11T19:22:16.187 に答える
0

進行を理解していれば、各ステップ k で、最初に k 番目の要素を選択し、次に 2k 番目の要素、3k、4k... に移動すると言うでしょう。

これは xrange を使用して実現できます (メモリがいっぱいにならないので、範囲よりも xrange を好みます) ステップ引数を取ります。

これはそのような進行の例です

for k in xrange(1, n + 1):
    print range(k, n, k)

これでうまくいくはずです。出力は次のとおりです。例のようになります。

[1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 4, 6, 8]
[3, 6, 9]
[4, 8]
[5]
[6]
[7]
[8]
[9]
[]

n + 1 に行く必要がないことに注意してください。n で停止できます :)

于 2013-11-11T19:19:23.717 に答える
0

間違ったライトを切り替えます。nループカウンターではなくを使用しているcountため、常に間違ったライトを切り替えています。

1 からカウントを開始し、n(n + 1 までの範囲) までカウントする必要があります。

インデントが間違っています。帰りが早すぎます。ステートメントをインデント解除してreturn、ループの一部にならないようにします。

また、関数自体のlightsarray値の部分を作成します。関数を呼び出すたびに値が変更され、関数自体のテストが難しくなるため、ここではグローバルを使用しないでください。

count最後になりましたが、手動でインクリメントする必要はありません。これは、forループが既に行っていることです。

def pressbutton(n):
    lightsarray = [False] * 50 ### All lights are off at start ###
    for count in range(1, n + 1):   
        lightsarray[::count] = [not y for y in lightsarray[::count]]
    return lightsarray

これで期待どおりに動作します:

>>> pressbutton(1)
[True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
>>> pressbutton(2)
[False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True]
>>> pressbutton(3)
[True, True, False, False, False, True, True, True, False, False, False, True, True, True, False, False, False, True, True, True, False, False, False, True, True, True, False, False, False, True, True, True, False, False, False, True, True, True, False, False, False, True, True, True, False, False, False, True, True, True]
于 2013-11-11T19:22:31.390 に答える