FizzBuzz問題を生成AIにやらせてみた

5つの無料生成AIにFizzBuzzを解かせてみました。
使用するAIは5つ。
**Gemini1.3**
**ChatGPT3.5**
**ChatGPT4o**
**Microsoft Copilot**
**Claude3**
プロンプトは以下を基本とします。
`wikipediaの定義に則ってFizzBuzz問題の解答コードをPHPで生成してほしい`

:::note
出てきたメッセージに
`今生成したメッセージの各行の先頭に>をつけて`
を追加することで引用のmarkdownにしています。
引用文は全て生成されものをコピーしたものです。
:::

## Gemini1.3

https://gemini.google.com/

> ## Wikipediaの定義に基づくFizzBuzz問題の解答コード（PHP）
>
> WikipediaにおけるFizzBuzz問題の定義は以下の通りです。
>
> > プログラミングにおいて、FizzBuzz問題はしばしば初心者向けの課題として出題される。内容は、1からNまでの整数を順番に表示していくが、以下の条件に当てはまる場合はその数ではなく条件に合致する文字列を表示するものである。
> >
> > ・3の倍数の場合は「Fizz」と表示する。
> > ・5の倍数の場合は「Buzz」と表示する。
> > ・3の倍数かつ5の倍数でもある場合は「FizzBuzz」と表示する。
>
> この定義に基づいたFizzBuzz問題の解答コードをPHPは以下の通りです。
>
> ```php
> <?php
> for ($i = 1; $i <= 100; $i++) {
>     $fizz = ($i % 3 === 0) ? 'Fizz' : '';
>     $buzz = ($i % 5 === 0) ? 'Buzz' : '';
>     echo $fizz . $buzz . ($fizz === '' && $buzz === '') ? $i : '';
>     echo PHP_EOL;
> }
> ```
>
> このコードは以下の通り動作します。
>
> 1. `for`ループで1から100までの整数を順番に処理します。
> 2. `$fizz`変数に、現在の数が3の倍数かどうかを判定した結果を代入します。3の倍数であれば`"Fizz"`、そうでなければ空文字を代入します。
> 3. `$buzz`変数に、現在の数が5の倍数かどうかを判定した結果を代入します。5の倍数であれば`"Buzz"`、そうでなければ空文字を代入します。
> 4. `echo`文で、以下のいずれかを出力します。
>     * `$fizz`と`$buzz`の連結文字列。ただし、どちらも空文字の場合は現在の数を出力します。
>     * 空文字
>
> このコードは、Wikipediaの定義を忠実に実装しており、かつ簡潔で分かりやすいコードとなっています。
>
> ## その他
>
> 上記以外にも、FizzBuzz問題を解く方法は様々です。例えば、以下のような方法があります。
>
> * switch文を使用する
> * ternary operatorを使用する
> * 文字列の連結ではなく、sprintf関数を使用する
>
> それぞれの方法には一長一短があり、状況に応じて最適な方法を選択することができます。
>
> ## 参考情報
>
> * [Wikipedia: FizzBuzz](https://ja.wikipedia.org/wiki/FizzBuzz)
> * [Qiita: FizzBuzz問題をPHPで解いてみよう](https://www.asobou.co.jp/blog/web/fizzbuzz)
> * [AtCoder: FizzBuzz問題](https://atcoder.jp/contests/abc001/tasks/abc001_1)

## ChatGPT3.5

https://chatgpt.com/

>FizzBuzz問題は、1から100までの数を順番に出力するプログラムで、ただし3で割り切れる場合は"Fizz"、5で割り切れる場合は"Buzz"、3と5の両方で割り切れる場合は"FizzBuzz"を出力します。以下はそのPHPコードです。
>
>```php
><?php
>for ($i = 1; $i <= 100; $i++) {
>    if ($i % 3 == 0 && $i % 5 == 0) {
>        echo "FizzBuzz\n";
>    } elseif ($i % 3 == 0) {
>        echo "Fizz\n";
>    } elseif ($i % 5 == 0) {
>        echo "Buzz\n";
>    } else {
>        echo $i . "\n";
>    }
>}
>?>
>```
>
>このコードは、1から100までの数をループして、条件に基づいてそれぞれの数に対する適切な文字列を出力します。

### 引用にしようとして思い通りにいかない

>了解しました。各行の先頭に>をつけた形で、FizzBuzz問題の解答コードを再度表示します。
>
>```php
><?php
>for ($i = 1; $i <= 100; $i++) {
>    if ($i % 3 == 0 && $i % 5 == 0) {
>        echo "> FizzBuzz\n";
>    } elseif ($i % 3 == 0) {
>        echo "> Fizz\n";
>    } elseif ($i % 5 == 0) {
>        echo "> Buzz\n";
>    } else {
>        echo "> $i\n";
>    }
>}
>?>
>```
>
>これで各行の先頭に>がついた形でFizzBuzz問題の解答コードが表示されます。

#### 追加プロンプト:コードではなく全体に>をつけてほしい

>理解しました。全体に>をつけた形でFizzBuzz問題の解答コードを再表示します。
>
>>```php
>> <?php
>> for ($i = 1; $i <= 100; $i++) {
>>     if ($i % 3 == 0 && $i % 5 == 0) {
>>         echo "FizzBuzz\n";
>>     } elseif ($i % 3 == 0) {
>>         echo "Fizz\n";
>>     } elseif ($i % 5 == 0) {
>>         echo "Buzz\n";
>>     } else {
>>         echo $i . "\n";
>>     }
>> }
>> ?>
>```
>
>こちらが全体に>が付いた形でのFizzBuzz問題の解答コードです。

:::note alert
結局自力で引用の形にしています。
出力した内容に対しての融通が効かない印象です。
:::

## ChatGPT4o

>FizzBuzz問題は、1から100までの数字をプリントするプログラムですが、3の倍数のときは数字の代わりに「Fizz」、5の倍数のときは「Buzz」、両方の倍数のときは「FizzBuzz」をプリントします。以下にPHPでの解答コードを示します。
>
>```php
><?php
>for ($i = 1; $i <= 100; $i++) {
>    if ($i % 3 == 0 && $i % 5 == 0) {
>        echo "FizzBuzz\n";
>   } elseif ($i % 3 == 0) {
>        echo "Fizz\n";
>    } elseif ($i % 5 == 0) {
>        echo "Buzz\n";
>    } else {
>        echo $i . "\n";
>    }
>}
>?>
>```
>
>このコードは以下のように動作します：
>
>1. 1から100までの数字をループします（`for ($i = 1; $i <= 100; $i++)`）。
>2. 各数字について、まずその数字が3の倍数かつ5の倍数かをチェックします（`if ($i % 3 == 0 && $i % 5 == 0)`）。条件を満たす場合は「FizzBuzz」をプリントします。
>3. 次に、3の倍数かどうかをチェックします（`elseif ($i % 3 == 0)`）。条件を満たす場合は「Fizz」をプリントします。
>4. 次に、5の倍数かどうかをチェックします（`elseif ($i % 5 == 0)`）。条件を満たす場合は「Buzz」をプリントします。
>5. 最後に、どの条件にも当てはまらない場合はその数字自体をプリントします（`else { echo $i . "\n"; }`）。

### GPT4でも追加プロンプトが必要だった

>```php
>> <?php
>> for ($i = 1; $i <= 100; $i++) {
>>     if ($i % 3 == 0 && $i % 5 == 0) {
>>         echo "FizzBuzz\n";
>>     } elseif ($i % 3 == 0) {
>>         echo "Fizz\n";
>>     } elseif ($i % 5 == 0) {
>>         echo "Buzz\n";
>>     } else {
>>         echo $i . "\n";
>>     }
>> }
>> ?>
>```

#### 追加プロンプト:コードではなく全体に>をつけてほしい

>了解しました。以下が各行の先頭に`>`をつけたメッセージ全体です。
>
>> FizzBuzz問題は、1から100までの数字をプリントするプログラムですが、3の倍数のときは数字の代わりに「Fizz」、5の倍数のときは「Buzz」、両方の倍数のときは「FizzBuzz」をプリントします。以下にPHPでの解答コードを示します。
>> 
>> ```php
>> <?php
>> for ($i = 1; $i <= 100; $i++) {
>>     if ($i % 3 == 0 && $i % 5 == 0) {
>>         echo "FizzBuzz\n";
>>     } elseif ($i % 3 == 0) {
>>         echo "Fizz\n";
>>     } elseif ($i % 5 == 0) {
>>         echo "Buzz\n";
>>     } else {
>>         echo $i . "\n";
>>     }
>> }
>> ?>
>> ```
>> 
>> このコードは以下のように動作します：
>> 
>> 1. 1から100までの数字をループします（`for ($i = 1; $i <= 100; $i++)`）。
>> 2. 各数字について、まずその数字が3の倍数かつ5の倍数かをチェックします（`if ($i % 3 == 0 && $i % 5 == 0)`）。条件を満たす場合は「FizzBuzz」をプリントします。
>> 3. 次に、3の倍数かどうかをチェックします（`elseif ($i % 3 == 0)`）。条件を満たす場合は「Fizz」をプリントします。
>> 4. 次に、5の倍数かどうかをチェックします（`elseif ($i % 5 == 0)`）。条件を満たす場合は「Buzz」をプリントします。
>> 5. 最後に、どの条件にも当てはまらない場合はその数字自体をプリントします（`else { echo $i . "\n"; }`）。

GPT3.5とは異なり正しく認識してくれました。

## Microsoft Copilot

https://www.microsoft.com/ja-jp/microsoft-copilot

:::note warn
Edgeでの使用を推奨。
:::

>もちろんです。以下に、Wikipediaの定義に基づいたFizzBuzz問題の解答コードをPHPで示します。このコードは1から100までの数を出力し、3の倍数の時は「Fizz」、5の倍数の時は「Buzz」、15の倍数の時は「FizzBuzz」と出力します。
>
>```php
><?php
>for ($i = 1; $i <= 100; $i++) {
>    if ($i % 15 === 0) {
>        echo 'FizzBuzz';
>    } elseif ($i % 3 === 0) {
>        echo 'Fizz';
>    } elseif ($i % 5 === 0) {
>        echo 'Buzz';
>    } else {
>        echo $i;
>    }
>    echo PHP_EOL; // 改行を出力
>}
>?>
>```
>
>このコードは、各数値が3、5、15の倍数かどうかを判断し、対応する文字列を出力するシンプルなループと条件分岐を使用しています。`PHP_EOL`は、プラットフォームに応じた適切な改行文字を出力するために使用されます。実行すると、指定された振る舞いをするプログラムが得られます。お役に立てれば幸いです。
>
>ソース: Copilot との会話、 2024/5/29
>(1) 【PHP】FizzBuzz問題を解いてみた。【具体的解説付き】 - Qiita. https://qiita.com/Alto11233/items/5f4df07f6dcc28e82da3.
>(2) FizzBuzz問題をPHPで解いてみよう : ビジネスとIT活用に .... https://www.asobou.co.jp/blog/web/fizzbuzz.
>(3) 【初心者向け】【PHP】FizzBuzz問題 #初心者 - Qiita. https://qiita.com/TOMARU4400/items/974d2e62ecae73647c19.
>(4) 【ド文系でも分かる】PHPでFizzBuzz #PHP - Qiita. https://qiita.com/hisatoo/items/55bd6ad3158d3ab666ec.
>(5) undefined. https://blog.codinghorror.com/why-cant-programmers-program/.
>(6) undefined. http://sandbox.onlinephpfunctions.com/code/ce36167657f89d96b0fbd76379925dd3512955c9.
>(7) undefined. http://sandbox.onlinephpfunctions.com/code/919c5458aa05ed09f228c260b17803571dc91bd6.
>(8) undefined. http://sandbox.onlinephpfunctions.com/code/d6ec5cf1207c4dc4d9404654585923aa811b6926.
>(9) github.com. https://github.com/daviddoran/fizzbuzz/tree/db1ee9668bec87b3e3f97b2429ccdf45ab7931f7/php%2Fcanonical.php.
>(10) github.com. https://github.com/Aya217/Test1PHP/tree/fdb38352aed6617fe5c63a32905ead55bc9868b8/index.php.

### ChatGPTと同じなので追加プロンプトが必要

> もちろんです。以下のように各行の先頭に `>` をつけたメッセージをご覧ください。
>
>> ```php
>> <?php
>> for ($i = 1; $i <= 100; $i++) {
>>     if ($i % 15 === 0) {
>>         echo 'FizzBuzz';
>>     } elseif ($i % 3 === 0) {
>>         echo 'Fizz';
>>     } elseif ($i % 5 === 0) {
>>         echo 'Buzz';
>>     } else {
>>         echo $i;
>>     }
>>     echo PHP_EOL; // 改行を出力
>> }
>> ?>
>> ```
>
>
>  この形式は、通常、引用や特定のコンテキストでの発言を示すために使用されます。コードが期待通りに機能するかどうかを確認するために、PHP環境で実行してみてください。何か他にお手伝いできることがあれば、お知らせください。

#### 追加プロンプト:コードではなく全体に>をつけてほしい

>承知しました。以下のように全体に `>` をつけたメッセージをご覧ください。
>
>> もちろんです。以下に、Wikipediaの定義に基づいたFizzBuzz問題の解答コードをPHPで示します。このコードは1から100までの数を出力し、3の倍数の時は「Fizz」、5の倍数の時は「Buzz」、15の倍数の時は「FizzBuzz」と出力します。
>>
>> ```php
>> <?php
>> for ($i = 1; $i <= 100; $i++) {
>>     if ($i % 15 === 0) {
>>         echo 'FizzBuzz';
>>     } elseif ($i % 3 === 0) {
>>         echo 'Fizz';
>>     } elseif ($i % 5 === 0) {
>>         echo 'Buzz';
>>     } else {
>>         echo $i;
>>     }
>>     echo PHP_EOL; // 改行を出力
>> }
>> ?>
>> ```
>>
>> このコードは、各数値が3、5、15の倍数かどうかを判断し、対応する文字列を出力するシンプルなループと条件分岐を使用しています。`PHP_EOL`は、プラットフォームに応じた適切な改行文字を出力するために使用されます。実行すると、指定された振る舞いをするプログラムが得られます。お役に立てれば幸いです。
>
>これでご要望に沿った形になったかと思います。他にも何かお手伝いできることがあれば、遠慮なくお申し付けください。いつでもサポートいたします！

## Claude3

https://claude.ai/chats

> FizzBuzz問題とは、指定された数値の範囲内で、3で割り切れる数値の場合は"Fizz"、5で割り切れる数値の場合は"Buzz"、3と5で割り切れる数値の場合は"FizzBuzz"、それ以外の場合は数値をそのまま出力するプログラムのことです。
>
> Wikipediaの定義に従って、PHPでFizzBuzz問題を解くコードは以下のようになります。
>
> ```php
> <?php
> // FizzBuzz問題を解くための関数
> function fizzBuzz($n) {
>     // 1からnまでのループ
>     for ($i = 1; $i <= $n; $i++) {
>         // 3と5で割り切れる場合
>         if ($i % 3 == 0 && $i % 5 == 0) {
>             echo "FizzBuzz\n";
>         }
>         // 3で割り切れる場合
>         elseif ($i % 3 == 0) {
>             echo "Fizz\n";
>         }
>         // 5で割り切れる場合
>         elseif ($i % 5 == 0) {
>             echo "Buzz\n";
>         }
>         // それ以外の場合
>         else {
>             echo $i . "\n";
>         }
>     }
> }
>
> // 関数を実行する（例: 1から20までの範囲）
> fizzBuzz(20);
> ```
>
> このコードでは、まず `fizzBuzz` 関数を定義しています。この関数は1つの引数 `$n` を受け取り、1から `$n` までの数値について、FizzBuzz問題の条件に基づいて出力を行います。
>
> 関数内では `for` ループを使って1から `$n` までの数値をチェックしています。もし現在の数値が3と5で割り切れる場合は "FizzBuzz" を出力し、3で割り切れる場合は "Fizz" を出力し、5で割り切れる場合は "Buzz" を出力します。それ以外の場合は、数値をそのまま出力します。
>
> 最後に、この `fizzBuzz` 関数を呼び出して実行しています。この例では、1から20までの範囲で関数を実行しています。

## 総評
もちろん使い方や使用目的次第で大きく異なってくるものですが今回は以下の順番にします。
**GPT3.5 < Claude3 = GPT4o < Microsoft Copilot < Gemini**

今回のプロンプトでは**Gemini**が優秀な印象でした。
Wikipediaの定義の引用、コードの内容、解説、アドバイス、参考リンク全てが丁寧に生成されており一番わかりやすい結果になりました。
追加プロンプトでも想定通りに動いてくれたので,対話型として最も直感的に、言葉足らずでも察してくれる能力が高い印象です。

コード自体はGemini以外では単純で簡単、ほぼ差の無い結果となりました。

**ChatGPT**はその機能的にインターネットの情報が限られているため、リンクを貼ってくれるということはありません。情報ソースが求められるような場面では使いにくい可能性があります。

参考として追加でより洗練したコードを求めたところ以下のようなコードが生成されました。Geminiと遜色ないものとなっています。
```php
<?php
for ($i = 1; $i <= 100; $i++) {
    $output = '';
    if ($i % 3 === 0) $output .= 'Fizz';
    if ($i % 5 === 0) $output .= 'Buzz';
    echo $output ? $output : $i;
    echo "\n";
}
?>
```

**Copilot**はGPT4とほぼ同じ中身ですが参考サイトのリンクがついてきているためその分便利な印象です。

**Claude3**はほぼGPT4oと同じです。追加プロンプトを聴きいれてくれるかどうかとコードの内容に僅かな差がありますが誤差の範疇だと感じます。

## 最後に
普段はGeminiを使用しています。
GPT4oは回数制限あり、GPT3.5は情報が古い、CopilotはEdgeからでは無いと使いにくい、Claude3は普段使いするにはGemini以上の利点がない、というのが理由です。

ただGeminiだけというわけではなく回数上限まではGPT4oを使用したりCopilotとGeminiで比較しながら使用しています。
純粋なコードを出力して欲しかったり、ネットの情報に関係のない処理を行いたい場合はGPT3.5で十分なこともあります。

有料版ではまた違う結果になりそうですが、無料版では色々試せるので気にいるものを見つけたり、用途によって使い分けたり、同時に使ってみたりすることをお勧めします。