これは何?
なんとなく ChatGPT ですごくちゃんとしたコードが手に入ったよ、という記事が多くて、だめだったよ、という記事が少ない気がしたので、そういう記事を書いておく。
課題1
こんな課題を与えてみた。
正の整数 n, m を与えます。n<a_1<a_2<...<a_m となる整数の列 {a_i} で、逆数の合計が 1 になるものをすべて出力するプログラムを書いてください。
初心者にはぱっと書けない感じかなとは思うけど、決して高難易度ではない。という感覚。
回答
回答はこうなった。
なんというか、拾うところがなくて論評できない感じ。
そのアルゴリズムではどうにもならないところもまずいんだけど、「# 出力」とされるものが出力されるようなコードではないところがなによりまずい。
2, 3, 4, 5, 7 の逆数の和は全然 1 じゃないし、1/2+1/3+1/4 の時点で 1を超えている。
拙実装
ruby で書いたら 20行ぐらい。
ちょっと自信ないけど。
def find_series_impl(lo, m, rest_inv, list, block)
if m==1
block[list + [rest_inv.to_i]] if rest_inv.denominator==1
return
end
b = [lo, 1+rest_inv.floor.to_i].max
e = m*rest_inv.ceil.to_i
(b...e).each do |x|
find_series_impl(x+1, m-1, 1r/(1r/rest_inv-1r/x), list+[x], block)
end
end
def find_series(n, m, &block)
find_series_impl(1+n, m, 1, [], block)
end
find_series(*ARGV[0,2].map(&:to_i)){ p _1 }
実行例(抜粋)
$ ruby find_series.rb 2 5
[3, 4, 5, 6, 20]
$ ruby find_series.rb 5 11
[6, 7, 8, 9, 10, 11, 12, 13, 18, 21, 40040]
[6, 7, 8, 9, 10, 11, 12, 14, 15, 24, 2772]
[6, 7, 8, 9, 10, 12, 13, 14, 15, 18, 2184]
[6, 7, 8, 9, 10, 12, 14, 15, 18, 24, 28]
Python にも有理数クラスがあるので大差ないと思う。
課題2
もう少しかんたんなのを。
a^2+b^2=c^3 を満たす正の整数 a, b, c の組を、c の値が小さい順に 10個挙げるプログラムを書いてください。a≦b とします。
回答
回答はこうなった。
課題1 よりは惜しいけど、全然正しくないし、そんな結果は出力されない。
勝手に上限を 100 に決めるべきじゃないし、c についてはループを回す必要はない。どうしてもループ回すにしても回す範囲が間違っている。
それにしても、 2 6 10
とか 8 15 17
とかどっから湧いてきたんだろと思う。
拙実装
こちらも ruby で書いたら 20行ぐらい。
def hoge
(1..).each do |c|
(1...Math.sqrt(c**3/2).ceil).each do |a|
b=Math.sqrt(c**3-a**2)
yield [a, b.round, c] if b==b.round && a<=b
end
end
end
count=0
last_c=0
hoge do |x|
break if last_c<x.last && 10<=count
p x
count+=1
end
「c の値が小さい順に」が面倒で、同率 10位が複数あったらそれを全部出す、ということのために手間がかかっている。実際は 10位と11位は c の値が違うのでどうでもいいのだけれど。
実行例
$ ruby fuga.rb
[2, 11, 5]
[5, 10, 5]
[10, 30, 10]
[18, 26, 10]
[9, 46, 13]
[26, 39, 13]
[17, 68, 17]
[47, 52, 17]
[16, 88, 20]
[40, 80, 20]
全体感想
これぐらい書けてほしいとは思ってないんだけど。
書けない場合に「書けません」とか言うこともなく、自信なさげな素振りも見せないのは困るなと思った。
この例では明確に間違っているから実際に困ることはないわけだけれど。
ChatGPT が役に立ちそうなコードを出力する場合であっても、そのコードにまずい点があったらそれを発見できる人間がいないと困るということだと思う。
計算誤差でたまに正しくない結果が出るとか、セキュリティホールとか、そういうやつ。
まだ今の所そうだということで、明日には大幅に改善しているかもしれないけれど。