見出し画像

#49 同じ?違う?

● 問題

5つの異なる数字が2組表示されます。
2組の数字の組み合わせが同じか違うかを判断します。
5問出題されるので,なるべく早く判断しましょう。
不正解の場合には,20秒のペナルティになります。

[3, 9, 4, 2, 8] - [2, 4, 3, 9, 8] 同じ(1),違う(0)?1 
正解 
[6, 4, 3, 8, 5] - [8, 5, 4, 3, 6] 同じ(1),違う(0)?1 
正解 
[6, 9, 3, 2, 4] - [9, 6, 3, 4, 2] 同じ(1),違う(0)?1 
正解 
[2, 8, 5, 7, 9] - [9, 7, 3, 8, 2] 同じ(1),違う(0)?0 
正解 
[2, 1, 6, 4, 5] - [2, 4, 5, 6, 1] 同じ(1),違う(0)?1 
正解 
===================================== 
正解数:5,不正解数:0 かかった時間:30.0秒

正しい実行結果

問題がいつも同じ数字の並びになっています。また,正しく判定されていません。

[9, 6, 4, 7, 1] - [9, 6, 4, 7, 1] 同じ(1),違う(0)?1 
不正解 
[1, 6, 5, 9, 7] - [1, 6, 5, 9, 7] 同じ(1),違う(0)?1 
正解 
[8, 7, 2, 4, 6] - [8, 7, 2, 4, 6] 同じ(1),違う(0)?1 
不正解 
[3, 7, 9, 8, 6] - [3, 7, 9, 8, 6] 同じ(1),違う(0)?1 
不正解 
[2, 8, 3, 1, 9] - [2, 8, 3, 1, 9] 同じ(1),違う(0)?1 
不正解 
===================================== 
正解数:1,不正解数:4 かかった時間:29.0秒

エラーのある実行結果
import random
import time

number = [1,2,3,4,5,6,7,8,9]
miss = 0

time_start = time.time()

for n in range(5):
    random.shuffle(number)

    question1 = number[:5]
    question2 = question1

    set_question = random.randint(0,1)
    if set_question == 0:
        question2[4] = number[5]
        
    random.shuffle(question1)
    random.shuffle(question2)

    while True:
        result = input(f'{question1[:5]} - {question2[:5]}  同じ(1),違う(0)?')
        if result in ['0','1']:
            break

    if result == '1' and set_question == 1:
      print('正解')
    elif result == '0' and set_question == 0:
      print('正解')
    else:
      print('不正解')
      miss += 1 

time_end = time.time()
t = round(time_end-time_start+miss*20,1)

print('=====================================')
print(f'正解数:{5-miss},不正解数:{miss}')
print(f'かかった時間:{t}秒')

● 解答

問題の数字が同じということは,question1 と question2 の設定に問題がありそうです。
random.shuffle(number)で1~9の数字をシャッフルし,question1 = number[:5] で5つの数字を取り出します。
question2 = question1 で question1と同じ数字をquestion2にコピーします。
random.shuffle(question1) と random.shuffle(question2) でそれぞれの配列をシャッフルすることで,同じ数字ですが並び方が変わるはずなのですが,出力結果は全く同じ並びになっています。

question2 = question1 とすると,question1 の配列が question2 の配列にコピーされるのではなく,question1 と question2 が同じ配列として扱われるということになります。
そのため,question1の配列を操作すると,question2の配列の中身も同じように操作されるのです。
question2  = question1.copy() とすると,question1の配列の中身だけをquestion2にコピーすることができます。このとき,question1とquestion2は互いに影響を受けません。

import random
import time

number = [1,2,3,4,5,6,7,8,9]
miss = 0

time_start = time.time()

for n in range(5):
    random.shuffle(number)

    question1 = number[:5]
    question2 = question1.copy() #修正

    set_question = random.randint(0,1)
    if set_question == 0:
        question2[4] = number[5]
        
    random.shuffle(question1)
    random.shuffle(question2)

    while True:
        result = input(f'{question1[:5]} - {question2[:5]}  同じ(1),違う(0)?')
        if result in ['0','1']:
            break

    if result == '1' and set_question == 1:
      print('正解')
    elif result == '0' and set_question == 0:
      print('正解')
    else:
      print('不正解')
      miss += 1 

time_end = time.time()
t = round(time_end-time_start+miss*20,1)

print('=====================================')
print(f'正解数:{5-miss},不正解数:{miss}')
print(f'かかった時間:{t}秒')

#Python  #プログラミング

この記事が気に入ったらサポートをしてみませんか?