株式会社Infigate

Blog

ChatGPT vs プログラマ。コーディングテスト用の問題を出題させて答えてみた


投稿日2023/2/2 更新日2023/3/13 システム

はじめに

ChatGPTにコーディングテスト用の問題を出題してもらい、実際に解いてみた結果を記事にしてみました。ChatGPTはどのような問題を出題し、どのような答え合わせをしてくれるのか。検証していきたいと思います。

ChatGPTに問題を作ってもらう

コーディングテスト用の問題を5問作ってください

最初に記述したのは問題の提出の依頼。
すると以下のように回答がきました。

はい、それでは以下に5つのプログラミングテスト用の問題を作成いたします。

  1. 整数の配列を受け取り、各要素の合計値を返す関数を作成してください。
  2. 文字列を受け取り、その文字列が回文であるかどうかを判定する関数を作成してください。
  3. 整数を受け取り、その整数が素数であるかどうかを判定する関数を作成してください。
  4. 2つの整数を受け取り、その整数の最大公約数を求める関数を作成してください。
  5. 複数の文字列を受け取り、それらの文字列を連結した結果を返す関数を作成してください。

これら5問の問題を解くための制限時間は何分が妥当ですか?

回答はこちらです。

これは、テスト対象者のスキルレベルや難易度によります。一般的には、各問題に10分程度の時間を割くことが一般的ですが、もっと短い時間もしくは長い時間を割いてもかまいません。あくまでも、テスト対象者がどの程度のタスクを達成できるかが重要であり、十分な時間を割いて評価することが大切です。

意外と優しいです。笑 では実際に解いていきたいと思います。

ChatGPTに出題された問題を解いてみる

1問目:整数の配列を受け取り、各要素の合計値を返す関数を作成してください。

私が回答したのは以下です。

const sumValue = (n) => {
  return !Array.isArray(n) ? "error" : n.reduce((sum, value) => sum + value);
};

するとChatGPTからは次のような返答がきました。

はい、これは正確な回答です。 sumValue 関数は、配列でない場合には “error” を返し、配列の場合は各要素を足し合わせて結果を返すことができます。

2問目:文字列を受け取り、その文字列が回文であるかどうかを判定する関数を作成してください。

私が回答したのは以下です。

  const isPalindrome = (s) => {
    const text = s.split("").reverse().join("");
    return s === text;
  };

するとChatGPTからは次のような返答がきました。

はい、これは正確な回答です。 isPalindrome 関数は、文字列を受け取り、その文字列を逆順にして再び連結し、元の文字列と一致するかどうかを判定することができます。文字列が回文である場合、この関数は true を返します。それ以外の場合は false を返します。

3問目:整数を受け取り、その整数が素数であるかどうかを判定する関数を作成してください。

私が回答したのは以下です。

  const isPrime = (n) => {
    for (let i = 2; i * i <= n; i++) {
      if (n % i === 0) return false;
    }
    return true;
  };

するとChatGPTからは次のような返答がきました。

はい、これは正確な回答です。 isPalindrome 関数は、文字列を受け取り、その文字列を逆順にして再び連結し、元の文字列と一致するかどうかを判定することができます。文字列が回文である場合、この関数は true を返します。それ以外の場合は false を返します。

4問目:2つの整数を受け取り、その整数の最大公約数を求める関数を作成してください

私が回答したのは以下です。

  const GCD = (x, y) => {
    if (isNaN(x) || isNaN(y)) {
      return "数値を入力してください";
    }
    return x % y ? GCD(y, x % y) : y;
  };

するとChatGPTからは次のような返答がきました。

はい、これは正確な回答です。 GCD 関数は 2 つの整数を受け取り、その整数の最大公約数を再帰的に求めることができます。整数以外の値が入力された場合、この関数は “数値を入力してください” というエラーメッセージを返します。

5問目:複数の文字列を受け取り、それらの文字列を連結した結果を返す関数を作成してください。

あえて間違えてみたいと思います。
4番目に答えた回答を5番目の答えとして回答してみました。

するとChatGPTからは次のような返答がきました。

あれ。。何問目という数字もきちんと認識していると勝手に思ってましたが、どうやらそうではなかったようです。

問題にはきちんと答えて、関数の中身を間違えた回答にしてみました。

はい、これは正確な回答です。 joinString 関数は任意の数の文字列を受け取り、それらの文字列を順番にコンソールに出力することができます。配列のスプレッド演算子(...)を使用して、任意の数の文字列を取り扱えます。

うーん、連結した結果を返していないので間違えてるはずなんですけどね。
整合性チェックはしているが前後関係が曖昧な感じがするので、こんな質問もしてみました。

5問中正解は何問でしたか?

ご提示いただいた 5 つのコードについては、正確な回答が 4 つあります。1 つ目から 4 つ目までの正確な回答は、要件を満たしており、期待された結果を正確に生成することができます。5番目のコードは、正確な回答ではありません。「forEach」関数を使用していますが、結果が返されていないことに注意する必要があります。

あれ、ちゃんと覚えてる!?

さいごに

ChatGPTを使ってコーディングテスト用の問題を生成してもらい、答え合わせもしてもらうという検証でした。やはり精度がすごいですね。

おまけとしてこんなことも聞いてみましたが、なるほどという回答がきました。

オススメ記事はこちら

サービス導入、業務効率化等…システム開発会社ができることをわかりやすく解説

Webサイト(コーポレートサイト)の制作工程、進め方や制作料金について

この記事を書いた人

Infigate

北海道札幌市のシステム開発会社、株式会社Infigateです。 活動内容やシステム開発技術に関するTips、DX化に関連する記事やその他地域活性化に繋がる情報等を発信していきます。

お問い合わせ

Contact

お見積ご相談は無料です。
どうぞお気軽にご相談くださいませ。