LoginSignup
0
1

Github Copilot の修正力!

Last updated at Posted at 2024-05-10

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を含む数の出現回数の合計と、それ以外の数の出現回数との比率を求める

できたプログラムが以下の通り。

image.png

Google Colabで実行すると。。。

image.png

ありゃ。エラーですね。。。

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が自分のミスだとして、修正コードを示してくれました!

image.png

修正後のソースを再度Colabで実行すると、ちゃんと実行されました。

image.png

感想

生成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 , "%")
円グラフ
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1