Python
パズル

ロッカーの開閉回数の合計は?Pythonで答えを求める

テスト問題が気になる

ロッカーの開閉回数の合計は?
http://www.sankei.com/life/news/171018/lif1710180001-n1.html
http://www.itmedia.co.jp/news/articles/1710/19/news049.html
これって要するに、2乗しろって事です。
だから、開いているロッカーは、2乗を並べれば 1,4,9,16,25,36,49,64,81,100,121,144,169,196 となる。
しかし、問題文が、200個のロッカーを100回開け閉めとあるので、100より大きな数値は反対になるので、121,144,169,196以外が開いている事になる。
これで1と3の問題が導き出せる。
2の問題は単なる約数なので、約数を導き出せれば良い。(100より大きな数値は約数を1減らせば、答えが導き出せる)
ただ、それだと面白くないので、プログラムで、この動作を実際にやらせてみて答えを出してみようと思う。(昼休みに)

Pythonでプログラム

# 変数の初期化
lockers = [False] * 200
count = [0] * 200

# ロッカーを100回開け閉めし、その数をカウントする
for x in range(100):
  for y in range(x, 200, x + 1):
      lockers[y] = not(lockers[y])
      count[y] += 1

'''
for i in range(200):
  print('{0}:{1}:{2}'.format((i + 1),  lockers[i], count[i]))
print
'''

# 1 番号1~10のロッカーで開いているロッカーを表示する
for i in range(10):
  if (lockers[i] == True):
     print('{0}:{1}'.format((i + 1),  lockers[i]))
print

# 2 99、100、101のロッカーの開け閉めの数を表示する
print('{0}:{1}'.format(( 98 + 1), count[ 98]))
print('{0}:{1}'.format(( 99 + 1), count[ 99]))
print('{0}:{1}'.format((100 + 1), count[100]))
print

# 3 開いているロッカーの数を表示する
open = 0
for i in range(200):
  if (lockers[i] == True):
    open += 1
print('{0}'.format(open))

結果

1:True
4:True
9:True

99:6
100:9
101:1

106

答え

  • 番号1~10までの10個のロッカーのうち、開いているロッカーの番号をすべて書きなさい。
    • 1,4,9のロッカーです。
  • 99、100、101のロッカーは、それぞれ何回開閉されましたか。開けた回数と閉めた回数の合計を答えなさい。
    • 99は6回です。
    • 100は9回です。
    • 101は1回です。
  • 200個のロッカーのうち、開いているロッカーは何個ありますか。
    • 106個です。