質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1244閲覧

実行結果が想像していたものと異なる

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/05/19 21:23

編集2019/05/19 21:23

以下の名前データがあります

python

1gname=["ジョージ","ジョン","ポール","リンゴ"] 2sname=["ハリスン","レノン","マッカートニー","スター"] 3beatles=["ジョン・レノン","ポール・マッカートニー","ジョージ・ハリスン","リンゴ・スター"]

gname,snameの要素を4個ずつランダムに抽出し、それらを組み合わせて名前を生成します。生成した名前がbeatlesに存在すれば正解とし、4人の名前が同時に全て正解になるまで繰り返すプログラムです。このプログラムですが、実行結果において名前が4つ表示されるはずが3つしか表示されなかったり、正誤の判定がおかしかったり(名前はあっているのに正解数にカウントされていなかったり、その逆もあり)します。プログラムを見直してみましたがわかりません。原因は何でしょうか?

※このプログラムは少し長いため、大まかな内容を理解するだけでもかなりの時間を要するかと思います。時間のある方は以下のプログラムを見て回答していただければ幸いです。

該当のソースコード

python

1import random 2gname=["ジョージ","ジョン","ポール","リンゴ"] 3sname=["ハリスン","レノン","マッカートニー","スター"] 4beatles=["ジョン・レノン","ポール・マッカートニー","ジョージ・ハリスン","リンゴ・スター"] 5g=random.sample(gname,4) #gnameから重複なく4つ選ぶ 6s=random.sample(sname,4) #snameから重複なく4つ選ぶ 7count=0 #正解数をカウントする変数 8b=[0,1,2,3] 9 10for x in range(0,3): 11 b[x]=str(g[x])+"・"+str(s[x]) #ランダムに選んだgとsを結合 12 13while count < 4: #4人正解するまで繰り返す 14 for x in range(0,3): 15 for y in range(0,3): 16 if b[x]==beatles[y]: #生成した名前とbeatlesが同じがチエック 17 count=count+1 #同じなら正解数を1増やす 18 print(b[x]) 19 if count==0: 20 print("不正解です\n") #一度も正解していなければ不正解と表示 21 else: 22 print(str(count)+"つ正解です\n") #正解していれば正解数を表示 23 g=random.sample(gname,4) 24 s=random.sample(sname,4) #新たに要素をランダムに抽出し、結合する 25 for i in range(0,3): 26 b[i]=str(g[i])+"・"+str(s[i]) 27

実行結果 (あくまで一例。出力される名前の組み合わせは毎回変わる)

python

1ポール・レノン 2リンゴ・マッカートニー 3ジョン・スター 4不正解です 5 6ポール・マッカートニー 7ジョージ・ハリスン 8ジョン・レノン 93つ正解です 10 11ジョン・ハリスン 12ポール・スター 13リンゴ・レノン 143つ正解です 15 16ジョン・ハリスン 17ジョージ・レノン 18ポール・マッカートニー 194つ正解です

# 私が望む実行結果 (あくまで一例。出力される名前の組み合わせは毎回変わる)
上の実行結果との違い
・名前の組み合わせは3つではなく4つ表示されている
・正誤の判定がちゃんとしている

python

1ジョージ・レノン 2ジョン・ハリスン 3ポール・スター 4リンゴ・マッカートニー 5不正解です 6 7ジョージ・ハリスン 8ジョン・マッカートニー 9ポール・スター 10リンゴ・レノン 111つ正解です 12 13ジョージ・ハリスン 14ジョン・レノン 15ポール・スター 16リンゴ・マッカートニー 172つ正解です 18 19ジョージ・ハリスン 20ジョン・レノン 21ポール・マッカートニー 22リンゴ・スター 234つ正解です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

とりあえず怪しそうなのは、所々に見られる range(0, 3) です。
これは 0以上3未満 の範囲を表します。

4人なら、range(0, 4) あるいは単に range(4) を使った方が良いでしょう。


ご提示のコードには、正解のカウント数を適切にリセットしていないというバグがまだあります。
これでは通算4回正解すると終了してしまいます。

実行結果も実際そのようになっていますね。

plain

1ポール・レノン 2リンゴ・マッカートニー 3ジョン・スター 4不正解です 5 6ポール・マッカートニー ← 正解1 7ジョージ・ハリスン ← 正解2 8ジョン・レノン ← 正解3 93つ正解です 10 11ジョン・ハリスン 12ポール・スター 13リンゴ・レノン 143つ正解です 15 16ジョン・ハリスン 17ジョージ・レノン 18ポール・マッカートニー ← 正解4 194つ正解です

正解の判定をする際は集合演算を用いた方が楽かと思います。
答えの集合との共通部分を取れば、その要素数が正解数と同じになります。

投稿2019/05/19 22:26

編集2019/05/19 22:30
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/05/20 07:51

返信遅くなってすみません。ご回答ありがとうございます。解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問