ChatGPTでC言語のプログラム出力を試した所感

# 1.この記事の内容

ChatGPTを使って，いくつかの方法でC言語のプログラムを出力させましたので，その方法と生成されたプログラムに対する所感を記します．

ソースコードの詳細は，[筆者のGitHub](https://github.com/ryoma-jp/samples/tree/master/python/chatgpt_code_test)で公開していますので，併せて参照ください．

まず結論ですが，今回はソートをテーマにChatGPTにC言語のソースコードを出力させましたが，基礎的なプログラミング能力は高い印象でした．
ソートというテーマが簡単すぎたところもありますが，今回の実験条件においては，実装バグなく正常に動作するプログラムがChatGPTから出力されました．

ただ1点，Pythonで実装したクイックソートのプログラムをC言語に変換させた際に，マージソートに置き換わってしまった点が，等価変換に失敗した事例となりました．

# 2.背景

先日，[TensorFlowで実装されたYOLOv3](https://github.com/zzh8829/yolov3-tf2)のNMS処理を，TensorFlowを使用しない実装に変換させた際に，8割くらい正しく出力され，微修正を行いました．
これを受けて，ChatGPTのプログラミング能力がどれくらいあるかが気になり試行しました．

# 3.仕様

今回，ChatGPTに出力させるプログラムはソートにしました．
1～100,000の整数をランダムに並び替えた配列を，昇順ソートする仕様です．

ChatGPTへの指示の仕方は，下記の3種を試しました．

- 実験1) 並べ替えの要件を日本語で与え，ソートを行う関数を出力するように指示する
- 実験2) Python言語で[sorting](https://pypi.org/project/sorting/)モジュールを使用しない関数を，C言語に変換するように指示する
- 実験3) Python言語で[sorting](https://pypi.org/project/sorting/)モジュールを使用する関数を，C言語に変換するように指示する

実験1～3すべてで昇順ソートが可能なソースコードが出力されました．
実験1では，ソートアルゴリズムを指定しなかったからか，バブルソートのソースコードが出力されました．
実験2では，Pythonで実装したクイックソートのプログラムが，マージソートとなってC言語で出力されました．
実験3では，Pythonの``sorting.quick``関数を解釈したのか，クイックソートのC言語のソースコードが出力されました．

## 3-1.実験1

### 3-1-1.ChatGPTへ指示した内容

```
数値を昇順に並べ替えるプログラムをC言語で作成してください
仕様は以下の通りです

- 1から10万の整数値が整数型で格納された領域のアドレスを引数にとる
- 昇順に並べ替えた結果が格納された領域のアドレスを返す
```

### 3-1-2.ChatGPTが出力したソースコード

```c
#include <stdio.h>

// 配列の要素を交換する関数
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 数値を昇順に並べ替える関数
void sortAscending(int *arr, int size) {
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(&arr[j], &arr[j + 1]);
            }
        }
    }
}

int main() {
    int arr[100000];  // 配列の宣言

    // 配列に1から10万の整数値を格納する
    for (int i = 0; i < 100000; i++) {
        arr[i] = i + 1;
    }

    // 数値を昇順に並べ替える
    sortAscending(arr, 100000);

    // 結果の表示（最初の10個の要素のみ表示）
    for (int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}
```

## 3-2.実験2

### 3-2-1.ChatGPTへ指示した内容

```
以下のPythonプログラムをC言語に変換してください

def sort(data):
    """sort
    
    sort function
    
    Args:
        data: list of integer values
    
    Returns:
        sorted values
    """
    
    if (len(data) <= 1):
        return data
    
    pivot = data.pop(0)
    left = [i for i in data if i <= pivot]
    right = [i for i in data if i > pivot]
    
    left = sort(left)
    right = sort(right)
    
    return left + [pivot] + right
```

### 3-2-2.ChatGPTが出力したソースコード

```c
#include <stdio.h>
#include <stdlib.h>

void sort(int *data, int length);

void merge(int *data, int *left, int left_length, int *right, int right_length);

void printArray(int *data, int length);

int main() {
    int data[] = {5, 3, 8, 4, 2, 7, 1, 6};
    int length = sizeof(data) / sizeof(data[0]);

    sort(data, length);

    printf("Sorted array: ");
    printArray(data, length);

    return 0;
}

void sort(int *data, int length) {
    if (length <= 1) {
        return;
    }

    int pivot = data[0];
    int *left = malloc((length - 1) * sizeof(int));
    int *right = malloc((length - 1) * sizeof(int));
    int left_length = 0;
    int right_length = 0;

    for (int i = 1; i < length; i++) {
        if (data[i] <= pivot) {
            left[left_length] = data[i];
            left_length++;
        } else {
            right[right_length] = data[i];
            right_length++;
        }
    }

    sort(left, left_length);
    sort(right, right_length);
    merge(data, left, left_length, right, right_length);

    free(left);
    free(right);
}

void merge(int *data, int *left, int left_length, int *right, int right_length) {
    int i = 0;
    int j = 0;
    int k = 0;

    while (i < left_length && j < right_length) {
        if (left[i] <= right[j]) {
            data[k] = left[i];
            i++;
        } else {
            data[k] = right[j];
            j++;
        }
        k++;
    }

    while (i < left_length) {
        data[k] = left[i];
        i++;
        k++;
    }

    while (j < right_length) {
        data[k] = right[j];
        j++;
        k++;
    }
}

void printArray(int *data, int length) {
    for (int i = 0; i < length; i++) {
        printf("%d ", data[i]);
    }
    printf("\n");
}
```

## 3-3.実験3

### 3-3-1.ChatGPTへ指示した内容

```
以下のPythonのプログラムをC言語に変換してください

def sort(data):
    """sort
    
    sort function
    
    Args:
        data: list of integer values
    
    Returns:
        sorted values
    """
    
    ret = sorting.quick(data)
    
    return ret
```

### 3-3-2.ChatGPTが出力したソースコード

```c
#include <stdio.h>

void quickSort(int arr[], int low, int high);

void sort(int data[], int size) {
    quickSort(data, 0, size - 1);
}

int partition(int arr[], int low, int high) {
    int pivot = arr[high];
    int i = (low - 1);

    for (int j = low; j <= high - 1; j++) {
        if (arr[j] < pivot) {
            i++;
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }

    int temp = arr[i + 1];
    arr[i + 1] = arr[high];
    arr[high] = temp;

    return (i + 1);
}

void quickSort(int arr[], int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high);

        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

int main() {
    int data[] = {5, 8, 2, 4, 1};
    int size = sizeof(data) / sizeof(data[0]);

    sort(data, size);

    printf("Sorted values: ");
    for (int i = 0; i < size; i++) {
        printf("%d ", data[i]);
    }

    return 0;
}

```
# 4.さいごに

実験ごとにソートアルゴリズムにばらつきが生じたものの，基礎的なプログラミング能力を有する印象でした．
ただし，プログラミング言語の変換に関しては，アルゴリズムが等価変換されないケースがあり，ChatGPTが出力するプログラムは過信せず，利用者はしっかりとテストを行う必要があります．