ChatGPTについて何ができるのか色々調べてみた

何番煎じかはわかりませんが、
今話題のChatGPTについていろいろ調べてみました。
かなり色々できるようです。

:::note info
日本語で質問しているのにも関わらず、英語や中国語で返答されることがあります。
:::

:::note info
ChatGPTの返答が長い場合、途中で返答が止まってしまうことがあるので、
その際は、「続きを書いてください」で続きを書いてくれます。
※たまに続きが変になる(途中が抜けている)ことがあります。
:::

:::note info
ChatGPTの返答は同じ質問でも毎回異なるものが返ってきます。
ですので、この記事での返答はあくまで一例となります。
:::

:::note info
この記事は随時更新予定です。
:::

# ChatGPTとは？
[OpenAI](https://openai.com/)がリリースしたAIを使った対話型のチャットボットになります。
2022/12現在は研究のために無料公開されています。
質問等をすると、AIにより様々な返答をしてくれます。
この記事では何ができるのかについていろいろ調べてみました。

:::note info
後に有料化になる予定とのこと
:::

https://openai.com/blog/chatgpt/

# コマンドについての実行例
Linux等で使用するコマンドについて実行例を伴って説明してくれます。
例として、pingについて聞いてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/aa17eeb6-fd6a-18da-6fc4-9c4f51966c69.png)


# プログラムを作成させる
chatgptに聞いてみたところ、プログラムの作成はできず、
プログラム作成についてのアドバイスなどはできるとのことでしたが、
問題なく作成してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/26f4140f-fe48-98cf-1efe-0d023b124c66.png)

```text
フィボナッチ数列を求めるプログラムをC++で書いて
ただし、再帰は用いないでください
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/e941e383-5c8d-0e1d-a022-071013d32159.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/6fdda764-2301-53ac-6685-b014711a71ba.png)


```cpp
#include <iostream>

int main() {
  // フィボナッチ数列を保存する配列を定義
  int fibonacci[20];

  // 最初の2つの要素を代入
  fibonacci[0] = 0;
  fibonacci[1] = 1;

  // 求める要素数
  int n = 20;

  // 求める要素を求めるループ
  for (int i = 2; i < n; i++) {
    // i番目の要素は、i-1番目とi-2番目の要素の和
    fibonacci[i] = fibonacci[i-1] + fibonacci[i-2];
  }

  // 求めたフィボナッチ数列を表示
  for (int i = 0; i < n; i++) {
    std::cout << fibonacci[i] << " ";
  }
  std::cout << std::endl;

  return 0;
}

```

# プログラムの作成方法を教えてくれる
今回はJavaからMySQLへ接続しデーターを取得する方法を聞いてみました。
環境構築していないし、私自身Javaは詳しくないので、
正常に動作するかわかりませんが、それらしきプログラムが提示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/651a3a62-8680-2f8e-2815-300e30d9796e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/94fcff55-f058-bedd-b84b-cb928f570123.png)


# 競技プログラミングの問題を解く
プログラムが作成できるので、
難しい問題でなければ競技プログラミングの問題を解くこともできます。
例として、下記問題を解かせてみます。
[ABC 085 C - Otoshidama](https://atcoder.jp/contests/abc085/tasks/abc085_c)

プログラム例を示した後にプログラムの解説を行って、実行結果まで示してくれます。
```text
下記問題をC++で解きなさい。
【問題概要】
10000 円札と、5000 円札と、1000 円札が合計でN枚あって、合計金額がY円であったという。このような条件を満たす各金額の札の枚数の組を1つ求めなさい。そのような状況が存在し得ない場合には各組を-1として出力しなさい。

【制約】

1≦N≦2000
1000≦Y≦2∗10^7
Nは整数
Yは1000の倍数
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/efb9a132-ea04-ba05-1772-1053f23c1989.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/216d99db-0108-d664-3cd1-9f5b2076861b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/bebcc21a-fd4b-b60e-2548-ccb7801e55d6.png)

```cpp
#include <iostream>

int main()
{
  // 入力を受け取る
  int N, Y;
  std::cin >> N >> Y;

  // 各金額の札の枚数を求める
  for (int num_10000 = 0; num_10000 <= N; ++num_10000) {
    for (int num_5000 = 0; num_5000 <= N - num_10000; ++num_5000) {
      int num_1000 = N - num_10000 - num_5000;
      if (num_10000 * 10000 + num_5000 * 5000 + num_1000 * 1000 == Y) {
        // 合計金額が Y 円である組を出力する
        std::cout << num_10000 << " " << num_5000 << " " << num_1000 << std::endl;
        return 0;
      }
    }
  }

  // 合計金額が Y 円である組が見つからなかった場合
  std::cout << "-1 -1 -1" << std::endl;

  return 0;
}
```

実際にAtCoderに提出したところ、問題なくACとなりました。

# 記事を書かせる
Qiita投稿用の記事を作成させることができます。
ChatGPTはQiitaが何であるかは理解している模様。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/a3b36e98-6cff-3a4e-d0a9-1c6cad9bb094.png)

試しにリファクタリングについて記事を書かせてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/a9c1d5b8-67aa-75fb-d08a-ab77e1df2749.png)

以下、記事となります。

:::note info
出力される形式は実際に画面で表示される形式(記号とかがない状態)となるため、
ここに記載の記事は私の方で記号(#や*)を追記して同じ見た目にしています。
:::


## リファクタリングとは

リファクタリングとは、ソフトウェアのコードを改善することを意味します。 リファクタリングは、コードをより読みやすく、保守しやすくすることを目的として行われます。 リファクタリングは、機能追加やバグ修正を行うこととは別に、定期的に行うことが推奨されています。

### リファクタリングのメリット
* コードの読みやすさが向上する
* バグを減らすことができる
* メンテナンスしやすくなる
* チーム開発での作業効率が向上する

### リファクタリングのタイミング
リファクタリングは、機能追加やバグ修正を行う前に行うことが一般的です。 これは、リファクタリングを行った後に機能追加やバグ修正を行うことで、新しいコードを書く手間を省くことができるからです。 リファクタリングを行うときは、テストコードを用意して、リファクタリング前後で機能が正しく動作することを確認することが重要です。

### リファクタリングの方法
リファクタリングは、様々な方法で行うことができます。 例えば、以下のような方法があります。

* メソッド名を変更する
* メソッドを分割する
* メソッドを統合する
* 変数名を変更する
* 不要なコードを削除する

リファクタリングを行う際は、必ずテストコードを用意して、リファクタリング前後で機能が正しく動作することを確認することが重要です。

### リファクタリングツール
リファクタリングを行う際には、リファクタリングツールを利用することもできます。 リファクタリングツールは、自動的にコードを改善するためのツールです。 使い方は、通常のエディタでコードを開いた状態で、リファクタリングツールを実行するだけです。 リファクタリングツールを使うことで、手作業で行うリファクタリング作業が自動化されるため、作業効率が向上します。

### リファクタリングの best practice
* リファクタリングを行う前に、必ずテストコードを用意する
* リファクタリングを行う際は、一つずつ小さな変更を行う
* リファクタリング後も、機能が正しく動作することを確認する
* リファクタリングを定期的に行うことで、コードの質を保つ

リファクタリングは、ソフトウェア開発において欠かせないテクニックです。 機能追加やバグ修正の前に行うことで、新しいコードを書く手間を省くことができるだけでなく、コードの読みやすさや保守しやすさを向上させることができます。 リファクタリングを行う際は、テストコードを用意して、機能が正しく動作することを確認することが大切です。

リファクタリングは、特に大規模なプロジェクトでは、定期的に行うことが重要です。 これは、コードベースが膨大になっていくにつれて、複雑化していくためです。 大規模なプロジェクトでは、リファクタリングを定期的に行うことで、コードの質を保ち、バグを減らすことができるでしょう。

また、リファクタリングは、チーム開発でも重要です。 チームで開発する場合は、リファクタリングを行うことで、他のメンバーが理解しやすいコードを書くことができます。 また、リファクタリングを行うことで、他のメンバーが作業する際に手間を省くことができます。

リファクタリングは、コードを改善するためのテクニックですが、そのためには経験と知識が必要です。 リファクタリングをする際には、慎重に行うことが大切です。 また、リファクタリングを行う際には、常にテストコードを用意して、機能が正しく動作することを確認することが重要です。



記事ここまで

# リファクタリング
コードのリファクタリングができます。
ただし、完璧とはいかないようです。

:::note info
using namespace std;を消したのはいいですが、
std::が追加されていませんでした。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/c76b650b-6607-9d9d-274d-93f46c568d39.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/45f60ddc-4dae-45e9-a0d2-dc601c553b92.png)



# 俳句を作る
俳句まで作れてしまいます。
今回は単純に冬に季語としましたが、条件を細かく指定すればジャンル等絞った状態で作成が可能になるかと思います。

:::note info
今回は上五が字足らずになってしまいました。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/3f43f99b-875b-875a-6a6f-bc557c166057.png)


# 落語を作る
落語も作れます。
そこまで面白くはないですが。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/f360db4e-72c7-d489-4218-31b27568219d.png)

# しりとりで遊べます
しりとりができます。
ただし、ChatGPTは漢字が読めないため、入力した文字の末尾がひらがなの **"ん"**で終わる言葉のみを終了判定に使っています。
また、最後の文字から始まる文字でしりとりをするため、読み方が違っていても、同じ漢字であればOKとみなされます。
なお、こちらが入力した文字については末尾のもののみを判定するだけで、先頭の文字についてはなんでも通ってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/10607aca-4d93-9e66-7c7e-8f3529c5202e.png)

簡単にChatGPTが負けてしまうこともありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/85b0021d-ac1e-4600-dbc5-ae34d71b3a17.png)

# 日本の芸能人について聞いてみた
試しに明石家さんまについて聞いてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/71a5d8cc-b1b1-a389-8950-062077742790.png)
大枠はあっているものの、詳細な部分はかなり間違っています。

# 文章の作成
文章を作成することができます。
今回はさくらについてである調で作成させてみました。
最初の1文のみである調となっていて、残りはですます調となっていました。
～調については完ぺきではないようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/c59eb275-7cd2-7410-69c3-4489d63be03b.png)

命令文も作成させてみました。
こちらも命令文とはいいがたいものが出来上がりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/e85b9950-e9f8-3067-9971-dfd090be1d48.png)

# 自分の間違いについて謝った
回答の中で、パナソニックの旧社名をパイオニアと間違って記載してきました。
それに対し、追加の質問で、パナソニックの旧社名について聞いたところ、
最後に、誤って表示してしまったと謝ってきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855481/d1db3856-fa4d-b7be-607a-8c2a19feab95.png)