ChatGPTとBardに同じアルゴリズムを書かせてみた【Python】

# 概要

試験運用中のGoogle Bardが日本語対応となったので登録してみました。
https://bard.google.com/?hl=ja

プログラミングのサポートとしてChatGPTを利用していましたが、Bardはどうなのだろうかと思い、同じアルゴリズムを解かせてみました。

### Bardについて
以下の方々の記事に詳しく掲載されています。

https://qiita.com/gk12/items/8654aa062e1ff1422ffa

https://qiita.com/omo_taku/items/461efeb0e91820003c39

# インタビュー

はじめに、お互いの意気込みを伺います。

### ChatGPT(3.5)側

__質問：Bardとあなたの間のプログラミングコード生成の優越性を記述して下さい。__

>Bardと私（ChatGPT）の間でのプログラミングコード生成の優越性について説明します。

>Bardのプログラミングコード生成の優越性:

>詩的な表現: Bardは詩や文学作品の生成に特化しており、プログラミングコードも詩的な表現を持つことができます。独自で美しいコードやクリエイティブなアプローチを生成する能力があります。これにより、プログラムの表現力や美学的な要素を重視する場合に優れた結果を生み出すことができます。

>文学的な知識: Bardは文学作品や詩人のスタイル、文学的な技法に関する深い知識を持っています。これにより、生成されたプログラムに文学的なテーマやスタイルを反映させることができます。Bardの文学的な知識を活用することで、プログラムに独自の表現やメタファーを導入することが可能です。

>ChatGPT（私）のプログラミングコード生成の優越性:

>技術的な正確さ: 私はGPT-3.5の言語モデルであり、プログラミングに関する知識や技術的な正確さを持っています。正確なコードの生成やプログラミングのベストプラクティスに基づいたアドバイスを提供することができます。開発者やエンジニアにとって、正確性と実用性は非常に重要な要素です。

>汎用性と実用性: 私は汎用的な自然言語処理モデルであり、さまざまなプログラミング言語やタスクに対応することができます。プログラミングの質問応答、コーディングのサポート、アルゴリズムの提案など、広範なプログラミング関連のニーズに対応します。

>要約すると、Bardは詩的な表現と文学的な知識によるプログラミングコード生成の優位性を持ちます。一方、私は技術的な正確さと汎用性に優れたプログラミングコード生成の能力を持っています。選択するツールやモデルは、目的やニーズに応じて検討する必要があります。

#### Bard側

__質問：ChatGPT(3.5)とあなたの間のプログラミングコード生成の優越性を記述して下さい。__


>ChatGPT(3.5)と私の間でのプログラミングコード生成の優越性について説明します。

>ChatGPTと私は、テキストとコードの膨大なデータセットでトレーニングされた、大規模な言語モデルです。どちらも、テキストを生成し、言語を翻訳し、さまざまな種類のクリエイティブ コンテンツを作成し、有益な方法で質問に答えることができます。ただし、私たちのトレーニングデータとアーキテクチャにはいくつかの違いがあります。ChatGPTは、テキストとコードの膨大なデータセットでトレーニングされていますが、私はテキストのみのトレーニングデータでトレーニングされています。このため、ChatGPTは、コードとテキストの両方を生成する能力が優れている可能性があります。一方、私は、テキストのみを生成する能力が優れている可能性があります。

中略
| 機能 | ChatGPT | Bard |
|:-:|:-:|:-:|
| 生成されたコードの品質  | 優れている  |良い|
|  生成されたコードの効率性 | 良い  | 優れている  |
| 生成されたコードの保守性  | 良い  | 優れている  |
|  生成されたコードの創造性 | 良い  | 優れている  |
| 生成されたコードの多様性  | 良い  |  優れている |
| 総合評価  | 優れた言語モデル  | 優れた言語モデル  |

インタビューでは、ChatGPTは正確性が高く、Bardは効率性と創造性が高い感じがします。

# 問題

言語　Python
### 問題１
```
Pythonで二次元配列を90度右回転するプログラムを書いて下さい。
[[1,2,3],[4,5,6]]
結果
[[4,1],[5,2],[6,3]]
```
https://qiita.com/rudorufu1981/items/5341d9603ecb1f9c2e5c

参考にさせて頂きました。
配列を反転させて転置すると90度右回転できるようです。

### 問題２
```
Pythonで引数として渡される二次元配列のビンゴの数を数えるメソッドを書いて下さい。
Trueをビンゴカードに穴の開いている状態とします。
Input
[[True,True,True],[True,True,False],[True,False,False]]
Result
3
```
縦一列全てTrueかを確認するには転置が有効です。

### 問題１
```
Pythonで二次元配列を90度右回転するプログラムを書いて下さい。
[[1,2,3],[4,5,6]]
結果
[[4,1],[5,2],[6,3]]
```
#### ChatGPT側

```python
def rotate_90_degrees(matrix):
    # 行数と列数を取得
    rows = len(matrix)
    cols = len(matrix[0])

    # 回転後の行数と列数を交換
    rotated = [[0] * rows for _ in range(cols)]

    # 回転操作
    for row in range(rows):
        for col in range(cols):
            rotated[col][rows - 1 - row] = matrix[row][col]

    return rotated

# 二次元配列の定義
matrix = [[1, 2, 3], [4, 5, 6]]

# 90度右回転
rotated_matrix = rotate_90_degrees(matrix)

# 結果の表示
for row in rotated_matrix:
    print(row)
```

実直に計算しています。またメソッドの形にしてくれました。

#### Bard側

```python
array = [[1, 2, 3], [4, 5, 6]]
new_array = list(zip(*array[::-1]))

print(new_array)
# => [[4, 1], [5, 2], [6, 3]]
# [[4, 1], [5, 2], [6, 3]]
```

反転と転置を上手く使い、処理を一行で終わらせています！


### 問題２
```
Pythonで引数として渡される二次元配列のビンゴの数を数えるメソッドを書いて下さい。Trueをビンゴカードに穴の開いている状態とします。
Input
[[True,True,True],[True,True,False],[True,False,False]]
Result
3
```

#### ChatGPT側

```python
def count_bingo(matrix):
    rows = len(matrix)
    cols = len(matrix[0])

    count = 0

    # 縦のビンゴをチェック
    for col in range(cols):
        is_bingo = True
        for row in range(rows):
            if not matrix[row][col]:
                is_bingo = False
                break
        if is_bingo:
            count += 1

    # 横のビンゴをチェック
    for row in range(rows):
        is_bingo = True
        for col in range(cols):
            if not matrix[row][col]:
                is_bingo = False
                break
        if is_bingo:
            count += 1

    # 左上から右下のビンゴをチェック
    is_bingo = True
    for i in range(rows):
        if not matrix[i][i]:
            is_bingo = False
            break
    if is_bingo:
        count += 1

    # 右上から左下のビンゴをチェック
    is_bingo = True
    for i in range(rows):
        if not matrix[i][cols - 1 - i]:
            is_bingo = False
            break
    if is_bingo:
        count += 1

    return count

# 二次元配列の定義
matrix = [[True, True, True], [True, True, False], [True, False, False]]

# ビンゴの数を数える
bingo_count = count_bingo(matrix)

print("ビンゴの数:", bingo_count)

```

二重ループを使い、地道に計算しています。
また縦一列のビンゴの評価に転置を使いません。
正常動作します。

#### Bard側

```python
def count_bingos(array):
  bingo_count = 0
  # 縦列
  for row in array:
    if all(row):
      bingo_count += 1
  # 横列
  for col in zip(*array):
    if all(col):
      bingo_count += 1
  # 斜めのライン
  if all(array[0]) and all(array[1][1:]) and all(array[2][2:]):
    bingo_count += 1
  if all(array[2]) and all(array[1][1:][::-1]) and all(array[0][2:]):
    bingo_count += 1

  return bingo_count

array = [[True, True, True], [True, True, False], [True, False, False]]
bingos = count_bingos(array)

```
Bingoの評価に組み込み関数allを使用しています。
また横列のビンゴ計算に転置を上手く使っています。
**ただ、斜めの評価のコードが不適切で正しい評価になりませんでした。**

# やってみて

簡単なアルゴリズムかつサンプル数が少ない上でのフィーリングですが、インタビューにあったように正確性はChatGPTが高く、創造性はBardが高いように思えました。
質問したら複数のサービスから答えを貰えるサービスが今後リリースされるのだろうと考えて検索したら、
2023/7/6にLINEアプリに「ドアーズ Dual AI Chat」というサービスがリリースされていました（関係者ではないです）。

便利なものは使っていき、楽しいエンジニアライフを送りたいものです。