3の倍数と3がつく数字の出現数
懐かしい「世界のナベアツ」の持ちネタで、「3の倍数と3がつく数字の時にあほになる」というのがありますが、1から始めてどんどん大きい数字に進めていくと、だんだんあほになる割合が高くなるという話があります。
そこで、1から1億まで数えながら、3の倍数と3がつく数値がどれくらいの割合で出現するのかを調べてみました。
%%time
counta = 0
countn = 0
for i in range(1, 100000000):
if (i % 3) == 0:
#print(i , "AHO!")
counta += 1
elif ('3' in str(i)):
#print(i , "AHO!")
counta += 1
else:
#print(i)
countn += 1
print("A/N = ", (counta/countn)*100 , "%")
結果は以下の通り。あほになるほうがだいぶ多いですね。
A/N = 248.45859339669568 %
Github Copilotにプログラムを作ってもらう
このプログラムをGithub copilotくんにみせたら、NumPyかPandasを使ってみたらというので、それならプログラム書いてよとお願いしてみました。
次のプログラムを作成してください。
・ NumPyを使用する
・ 1から100000000までの整数のうち、3の倍数と3を含む数の出現回数を求める
・ それ以外の数の出現回数を求める
・ 3の倍数と3を含む数の出現回数の合計と、それ以外の数の出現回数との比率を求める
できたプログラムが以下の通り。
Google Colabで実行すると。。。
ありゃ。エラーですね。。。
Github Copilotによる修正
Copilotくんにエラーを報告。
このプログラムを実行すると、以下のエラーが発生します。
TypeError Traceback (most recent call last) in <cell line: 7>() 5 6 # 3の倍数または3を含む数をフィルタリング ----> 7 mask = (numbers % 3 == 0) | ('3' in str(number) for number in numbers) 8 9 # 3の倍数または3を含む数の出現回数
TypeError: unsupported operand type(s) for |: 'bool' and 'generator'
すると、なんとCopilotが自分のミスだとして、修正コードを示してくれました!
修正後のソースを再度Colabで実行すると、ちゃんと実行されました。
感想
生成AIがこの手のプログラムを作成するのは、これまでも何度も目にしてきましたが、自らのミスを理解して修正コードまで書けるとは。さすがです。
おまけ(視覚化)
ついでに、あほとノーマルのせめぎ合いを視覚化してみました。クラウドで実行する場合は、CPU時間をだいぶ使いますのでご注意ください。
%%time
import matplotlib.pyplot as plt
from IPython.display import clear_output
import time
counta = 0
countn = 0
labels = ('AHO', 'NORMAL')
for i in range(1, 100000000):
if (i % 3) == 0:
#print(i , "AHO!")
counta += 1
elif ('3' in str(i)):
#print(i , "AHO!")
counta += 1
else:
#print(i)
countn += 1
if(i % 1000 == 0):
ratio = (counta , countn)
plt.pie(ratio, labels=labels, autopct='%1.1f%%')
plt.title('n = ' + str(i))
clear_output(wait=True)
plt.show()
print("A/N = ", (counta/countn)*100 , "%")