はじめに
M-1で実装できそうなネタを教えてもらったので書きました。
3人とも可愛い
https://x.com/mgrd33/status/1481212541582049286?s=20
ともしげの初期コード
import random
zodiac_list = ["牡羊座", "牡牛座", "双子座", "蟹座", "獅子座", "乙女座", "天秤座", "蠍座", "射手座", "山羊座", "水瓶座", "魚座"]
gender_list = ["女", "男", "その他", "回答しない"]
def mikawa():
while True:
zodiac = random.choice(zodiac_list)
gender = random.choice(gender_list)
if zodiac == "蠍座" and gender == "女":
print(f"モグライダー「{zodiac}の{gender}ですか?」美川さん「そうよ、私は{zodiac}の{gender}~♡」")
break # 条件を満たしたらループを終了
else:
print(f"モグライダー「{zodiac}の{gender}ですか?」美川さん「いいえ」")
# 関数を実行
mikawa()
出力例
モグライダー「山羊座の男ですか?」美川さん「いいえ」
モグライダー「獅子座のその他ですか?」美川さん「いいえ」
モグライダー「水瓶座のその他ですか?」美川さん「いいえ」
...
モグライダー「蠍座の女ですか?」美川さん「そうよ、私は蠍座の女~♡」
最悪47(12×4-1)通り「いいえ」と答えさせられる美川さんが大変気の毒である。
あと、ともしげは一回聞いて違った組み合わせを忘れていそうなので、「いいえ」が47回ではすまない可能性が高い。美川さんがかなり気の毒である。
芝さんのコードレビュー後
def mikawa(z, g):
for zodiac in zodiac_list:
if zodiac == "さそり座":
print(f"モグライダー「{zodiac}ですか?」美川さん「コクリ」")
for gender in gender_list:
if gender == "女":
print(f"モグライダー「{zodiac}の{gender}ですか?」美川さん「そうよ、私はさそり座の女~♡」")
break
else:
print(f"モグライダー「{zodiac}の{gender}ですか?」美川さん「惜しい、私はさそり座の女~♡」")
else:
print(f"モグライダー「{zodiac}ですか?」美川さん「いいえ」")
print(mikawa(zodiac, gender))
出力
モグライダー「牡羊座ですか?」美川さん「いいえ」
モグライダー「牡牛座ですか?」美川さん「いいえ」
モグライダー「双子座ですか?」美川さん「いいえ」
モグライダー「かに座ですか?」美川さん「いいえ」
モグライダー「獅子座ですか?」美川さん「いいえ」
モグライダー「乙女座ですか?」美川さん「いいえ」
モグライダー「さそり座ですか?」美川さん「コクリ」
モグライダー「さそり座の女ですか?」美川さん「そうよ、私はさそり座の女~♡」
芝さんのコードレビューにより、美川さんが「いいえ」と回答する回数を、最大47回から7回までに減らすことができました。
感想
確かに、美川さんは太陽星座×月星座×ASCまで当てて欲しいかもしれないし、性別が2種類だけしかない時代でもないので、最適性を損なわずに計算量を落とすことは大事だなと学びました。