おはこんち。
冬優子ぱっちんです。
巷で噂のOpenAI開発chatGPT、「119を素数として証明してください」「119が素数でないことを証明してください」問題で私のTwitterタイムラインでは少し疑問視されていました。
実際、私もchatGPTを使用してみて、どのような回答が得られるのか知りたくなったので、流行りに乗っかる形で記事にしてみます。
chatGPTには再帰関数に関する問題を聞きました。
最初に、「理論上可能か?」という点と「コードで示せるか?」という点で、確認し回答がコードで返ってきました。
function analyze($tokens){
$stack = array();
for($i = 0; $i < count($tokens); $i++){
$token = $tokens[$i];
switch($token) {
case "(":
$temp = array();
for($j = $i + 1; $tokens[$j] != ")"; $j++) {
if($tokens[$j] === "(" ){
//再帰的に解析
$temp[] = analyze($tokens, $j);
}else{
$temp[] = $tokens[$j];
}
}
array_push($stack, array($tokens[$j - 1], $temp));
$i = $j;
break;
case "+":
case "-":
case "*":
case "/":
array_push($stack, array($token, array_pop($stack), array_pop($stack)));
break;
default:
array_push($stack, $token);
}
}
return $stack;
}
$tokens = array("1", "+", "(", "2", "*", "(", "3", "+", "4", ")", ")", "*", "5");
$result = analyze($tokens);
print_r($result);
という返答。
しかしながら、提示されたコードでは要件を満たせない。
結果は以下。
array(2) { [0]=> array(3) { [0]=> string(1) "*" [1]=> array(2) { [0]=> string(1) "4" [1]=> array(6) { [0]=> string(1) "2" [1]=> string(1) "*" [2]=> array(2) { [0]=> array(3) { [0]=> string(1) "*" [1]=> array(2) { [0]=> string(1) "4" [1]=> array(3) { [0]=> string(1) "3" [1]=> string(1) "+" [2]=> string(1) "4" } } [2]=> NULL } [1]=> string(1) "5" } [3]=> string(1) "3" [4]=> string(1) "+" [5]=> string(1) "4" } } [2]=> array(3) { [0]=> string(1) "+" [1]=> string(1) "1" [2]=> NULL } } [1]=> string(1) "5" }
ゴングが鳴った。(笑)
老害私「あーだこーだ言うんじゃありません!!!!」
しかしながら、またしても結果は不備。
ですが、AIながら非常に惜しい結果を出しました。最後の数値2つがズレているのみです。
私が自前で修正。
AIにコードを提示します。
? なぜ再帰関数で組んでいるのに、入れ子に対して不備があるんだ?と思いながら、ではあなたのコードを提示してください、と聞きます。
function analyze($tokens){
$stack = array();
$temp = array();
for($i = 0; $i < count($tokens); $i++){
$token = $tokens[$i];
if ($token === '(') {
// 再帰的に解析
$temp[] = analyze(array_slice($tokens, $i+1));
$i += count($temp[count($temp)-1]) + 2;
}elseif(in_array($token, array("+", "-", "*", "/"))){
$temp[] = $token;
$temp[] = array_pop($stack);
$temp[] = array_pop($stack);
}elseif ($token === ')') {
break;
}else{
$stack[] = $token;
}
}
return $temp;
}
とのコード指示。
・・・とふと思い返せば、サンプルをもらってなかったので適当に作ってもらう。
サンプルをプログラムに書き込み、実行するも提示されたコードはうまくいかず。
array(7) { [0]=> string(1) "+" [1]=> string(1) "1" [2]=> NULL [3]=> array(8) { [0]=> string(1) "*" [1]=> string(1) "2" [2]=> NULL [3]=> array(3) { [0]=> string(1) "+" [1]=> string(1) "3" [2]=> NULL } [4]=> string(1) "-" [5]=> NULL [6]=> NULL [7]=> array(3) { [0]=> string(1) "/" [1]=> string(1) "6" [2]=> NULL } } [4]=> string(1) "/" [5]=> string(1) "6" [6]=> NULL }
何度か、再度コードを提示してもらうも尽く駄目。
ですが、結果的に自前で軽く修正することになりましたが、それだけで動くプログラムを書くことができました。
ついでに罵っておく。(笑)
AIにも分からせてやったことだし、今度は新成人に説教垂れるか(お団子)
こうやって会話してると、結構優秀なAIだと私は感じます。
適当にサンプル作ってって言うとすぐサンプル出てくるのでね。(笑)
こういう雑用、結構面倒臭いんです。ランダムで作って、って言っても多分すぐ出してくれますね。
ただ、構文解析する為の一つの機能に対してこれだけの会話で3時間程度掛かっています。
ぶっちゃけ自前で書いたほうが早いとは感じる速度。簡単に手直ししてやる程度でどこまでクオリティが上がるかと思いましたが、現実問題指定した要件の出力ですら手間取ります。
簡単な表示、それまた言語の置き換え(PHPからC#などに)であれば、それまたそれなりの性能してるんじゃないんでしょうか?(といっても、この性能であれば微妙にニュアンスやら結果が変わってきそうですが)
久々に面白いおもちゃを見つけた冬優子ぱっちんでした。
読了、ありがとうございました。