CopilotとChatGPTの違いとは

こんにちは。私はCopilotとChatGPTの違いについて調べました。
# CopilotとChatGPTの基本的な違い
初めにCopilotとchatGPTの違いについてですが、CopilotはBingの検索エンジンを生かした情報収集の速度と精度が優れており、chatGPTは文章作成やアイディア出しなど創作物の生成を得意としています。それぞれに良さがあるということですね。
# プログラムコードの違い
実際にコードを同じ条件で書いてもらいました。一個目は「javaで二次元配列を作成して、九九の段を計算するプログラムを組んでほしい」というメッセージを送信して作成してもらいました。
・Copilot
public class MultiplicationTable {
    public static void main(String[] args) {
        // 9x9の二次元配列を作成
        int[][] table = new int[9][9];

        // 二次元配列に九九の値を格納
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                table[i][j] = (i + 1) * (j + 1);
            }
        }

        // 九九の表を出力
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                System.out.print(table[i][j] + "\t");
            }
            System.out.println();
        }
    }
}
実行結果
1   2   3   4   5   6   7   8   9   
2   4   6   8   10  12  14  16  18  
3   6   9   12  15  18  21  24  27  
4   8   12  16  20  24  28  32  36  
5   10  15  20  25  30  35  40  45  
6   12  18  24  30  36  42  48  54  
7   14  21  28  35  42  49  56  63  
8   16  24  32  40  48  56  64  72  
9   18  27  36  45  54  63  72  81  


・ChatGPT
public class MultiplicationTable {
    public static void main(String[] args) {
        int[][] multiplicationTable = new int[9][9]; // 9x9の二次元配列
        
        // 九九の計算
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                multiplicationTable[i][j] = (i + 1) * (j + 1); // 九九の計算
            }
        }

        // 結果の表示
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                System.out.print(multiplicationTable[i][j] + "\t"); // タブで区切る
            }
            System.out.println(); // 改行
        }
    }
}
実行結果
1	2	3	4	5	6	7	8	9	
2	4	6	8	10	12	14	16	18	
3	6	9	12	15	18	21	24	27	
4	8	12	16	20	24	28	32	36	
5	10	15	20	25	30	35	40	45	
6	12	18	24	30	36	42	48	54	
7	14	21	28	35	42	49	56	63	
8	16	24	32	40	48	56	64	72	
9	18	27	36	45	54	63	72	81	

簡単なコードを書いてもらうと変数名にしか違いは生まれませんでした。
次に「C++で簡単な迷路を作ってほしい」というメッセージを送信し、プログラムを書いてもらいました。
・Copilot
#include <iostream>
#include <vector>

// 迷路のサイズ
const int WIDTH = 10;
const int HEIGHT = 10;

// 迷路の表示
void printMaze(const std::vector<std::vector<char>>& maze) {
    for (const auto& row : maze) {
        for (const auto& cell : row) {
            std::cout << cell;
        }
        std::cout << std::endl;
    }
}

// 迷路の初期化
std::vector<std::vector<char>> createMaze() {
    std::vector<std::vector<char>> maze(HEIGHT, std::vector<char>(WIDTH, '#'));

    // 迷路のパスを作成（例として固定のパスを作成）
    for (int i = 1; i < HEIGHT - 1; ++i) {
        maze[i][1] = ' ';
    }
    for (int i = 1; i < WIDTH - 1; ++i) {
        maze[HEIGHT - 2][i] = ' ';
    }

    // スタートとゴールを設定
    maze[1][1] = 'S';  // スタート
    maze[HEIGHT - 2][WIDTH - 2] = 'G';  // ゴール

    return maze;
}

int main() {
    // 迷路を生成
    std::vector<std::vector<char>> maze = createMaze();

    // 迷路を表示
    printMaze(maze);

    return 0;
}

・ChatGPT
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>

using namespace std;

// 迷路のサイズ
const int WIDTH = 7;
const int HEIGHT = 7;

// 迷路の描画
void drawMaze(const vector<vector<char>>& maze) {
    for (int i = 0; i < HEIGHT; ++i) {
        for (int j = 0; j < WIDTH; ++j) {
            cout << maze[i][j] << " ";
        }
        cout << endl;
    }
}

// プレイヤーの移動
bool movePlayer(vector<vector<char>>& maze, int& x, int& y, char move) {
    int newX = x;
    int newY = y;

    if (move == 'w') {
        newX--;
    } else if (move == 's') {
        newX++;
    } else if (move == 'a') {
        newY--;
    } else if (move == 'd') {
        newY++;
    }

    // 移動先が迷路の外でないか、壁でないか確認
    if (newX >= 0 && newX < HEIGHT && newY >= 0 && newY < WIDTH && maze[newX][newY] != '#') {
        maze[x][y] = '.';  // 元の位置を通路に戻す
        x = newX;
        y = newY;
        maze[x][y] = 'P';  // 新しい位置にプレイヤーを移動
        return true;
    }
    return false;
}

int main() {
    // 迷路の初期設定
    vector<vector<char>> maze = {
        { '#', '#', '#', '#', '#', '#', '#' },
        { '#', 'P', '.', '.', '#', '.', '#' },
        { '#', '.', '#', '.', '#', '.', '#' },
        { '#', '.', '#', '#', '#', '.', '#' },
        { '#', '.', '#', '.', '.', '.', '#' },
        { '#', '#', '#', '#', '#', '#', '#' }
    };

    // プレイヤーの位置
    int playerX = 1;
    int playerY = 1;

    // 初期描画
    drawMaze(maze);

    char move;
    while (true) {
        cout << "移動 (w: 上, s: 下, a: 左, d: 右, q: 終了): ";
        cin >> move;

        if (move == 'q') {
            break;  // ゲーム終了
        }

        if (movePlayer(maze, playerX, playerY, move)) {
            drawMaze(maze);
        } else {
            cout << "無効な移動です。もう一度試してください。" << endl;
        }
    }

    return 0;
} 

かなり違いが出ました。大きく違う点として終了条件です。Copilotはゴールで自動終了、q入力で強制終了ですが、ChatGPTはqを入力するまで終了しません。これはゴールを設定しているかどうかの違いだと思っています。
# 最後に
私が感じたのは、使用する人が異なってくるのかなと思いました。ChatGPTは文章作成に強いAIで、学生の志望理由添削や面接練習などで役立つため学生からの支持が強いのではないかと思います。CopilotはMicrosoft社のアプリを多用しているビジネス系の方の支持が多いと思います。自分なりの考察ですが…。