😎

FizzBuzz問題をさまざまな言語で解く。

2024/06/28に公開

Zenn記事:色々な言語のFizz Buzz問題
この記事に触発されたので、FizzBizz問題の備忘録を作ります(何番煎じ?)。
あとはプログラム言語の仕様を調べたいのと、名前を思い出せる言語はどのくらいあるかを知りたい欲。

FizzBuzz問題とは?

Wiki記事:Fizz Buzz
英語圏で遊ばれる言葉遊びである。

プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの発言した数字に1を足した数字を発言していく。ただし、3の倍数の場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、5の倍数の場合は「Buzz」、3の倍数かつ5の倍数の場合(すなわち15の倍数の場合)は「Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。

つまりは、一から数え上げていき、三の倍数なら「Fizz」、五の倍数なら「Buzz」、両方の倍数(十五の倍数)なら「Fizz Buzz」、それ以外なら直前の数値に一を足して発言するということのようで。

これをコンピュータで再現しようというのがFizzBizz問題ということです。
また、プログラマーの技量の測定としても使えるもよう。

どうしてプログラマに・・・プログラムが書けないのか?

私と同様、この著者は、プログラミングの仕事への応募者200人中199人はコードがまったく書けないということで苦労している。繰り返すが、彼らはどんなコードも書けないのだ。

【プログラムのいろはの「い」】第1回:14年目のFizzBuzz問題”の問題”

どうすれば人間はプログラムを書けるようになるのか?

Qiita記事のFizzBuzz問題に書かれているが、制約の件を考えていくと多くの書き方が生み出される。

プログラミングの初歩的な問題で扱われることが多いですが、使える予約語や演算子、関数やオブジェクトが制限されると、とたんに難易度が上がります。

また、Code Golfと呼ばれるとにかくコードを短くするコンテストがある。こちらもWikipediaのコードゴルフ記事から引用する。

コードゴルフはコンピュータプログラミング・コンテストの一種。参加者は与えられたアルゴリズムを、可能な限りもっとも短いソースコードで記述することを競う。バイナリサイズではなく、ソースコードの文字数がスコアとなる。

詳しくはこちらの記事が参考になる。
https://qiita.com/ymg_aq/items/b8e5d26035180bc8797e

今回の記事はそれらも考えながら紹介していく。

具体的に知りたいのであれば最終鬼畜FizzBuzz大全を読むことをおすすめする。
それから、ここにないコードは下のFizzBuzz記事のおすすめまとめにある可能性がある。

コード規約

最初のコードはifとforのみで条件分岐と繰り返しを実装する。
1から100まで実行。分岐後はFizzBuzz、Fizz、Buzz、数字のいずれかを表記する。
それ以降のコードは自由に表現してもよい。

コード

C

C
#include<stdio.h>
int main(void)
{
    for(int i=1;i<101;i++){
        if(i%15==0){
            printf("FizzBuzz\n");
        }
        else if(i%3==0){
            printf("Fizz\n");
        }
        else if(i%5==0){
            printf("Buzz\n");
        }
        else{
            printf("%d\n",i);
        }
    }
}

昔から存在し、今も前線で使われている言語(特に組み込み系)。
下のはCode Golfで有名なコードです。

C
main(i){for(;i<101;puts(i++%5?"":"Buzz"))printf(i%3?i%5?"%d":0:"Fizz",i);}

C言語のCode Golfはこちらの記事。すごく参考になる。
https://qiita.com/smicle/items/cf48853177e5ffdc574b
ここに先ほどのコードでreturn 0が入っていない理由も書いてあります。
ただ、clでのコンパイルだとうまく実行されませんでした。

C++

C++
#include <iostream>
int main() {
    for(int i = 1; i < 101; i++) {
        if(i % 15 == 0){
            std::cout << "FizzBuzz" << "\n";
        }
        else if(i % 3 == 0){
            std::cout << "Fizz" << "\n";
        }
        else if(i % 5 == 0){
            std::cout << "Buzz" << "\n";
        }
        else{
            std::cout << i << "\n";
        }
    }
    return 0;
}

ポインタの扱いがクソ難しいで有名なシープラプラ。
ゲーム業界ではその速度から現役でも使われる言語。Unreal Engineで使用できる言語です。
ちなみに、C++はC言語の要素を使えるので、先ほどにあったC言語のコードと同じでも可能。
つまり、C++はC言語のコードでCode Golfができます。

(. 余_談 .)
C++は事あるごとにジョークが生まれる言語です。以下はToggeterでまとめられていた内容です。
https://togetter.com/li/2155846
https://togetter.com/li/2071269
https://togetter.com/li/2096930
自分の足を打ち抜く系のジョークもこれが一番強力です。
https://mixi.jp/view_bbs.pl?comm_id=1772737&id=28308992
https://hp.vector.co.jp/authors/VA000092/jokes/

  • C言語

自分の足を撃て。

  • C++

間違って自分自身のインスタンスを一ダースも作ってしまい、全部の足を撃つことになる。
救急治療は困難である、なぜなら、どれが本物の自分でどれがビットワイズコピーで、どれが単なるポインタのくせに「ここだよ助けてよ~」と叫んでいるのか、さっぱり分からないからである。

C#

C#
using System;
class fizzbuzz{
    public static void Main(){
        for (int i = 1; i < 101; i++)
        {
            if (i % 15 == 0) {
                Console.WriteLine("FizzBuzz");
            }
            else if (i % 5 == 0) {
                Console.WriteLine("Buzz");
            }
            else if (i % 3 == 0) {
                Console.WriteLine("Fizz");
            }
            else {
                Console.WriteLine(i);
            }
        }
    }
}

C言語としての雰囲気がところ変わる。
C++ベースとし、Javaなどのオブジェクト指向を分かりやすくしたプログラム言語である。
ちなみに、UnityやGodotで使える言語でもある。

FizzBuzzを使いコードの読みやすさ問題を解いている記事。
https://qiita.com/yosenabe721/items/1f67b8ced38ff7cc0352

D

D
import std.stdio;
void main(){
    for(int i = 1;i<101;i++){
        if(i % 15 == 0){
            writeln("FizzBuzz");
        }else if(i % 3 == 0){
           writeln("Fizz");
        }else if(i % 5 == 0){
            writeln("Buzz");
        }else{
            writeln(i);
        }
    }
}

C++をベースにした言語。C++の特徴である高いパフォーマンス性能を近いところまで再現し、人間に読みやすいようにしているとのこと。
ポインタ操作を行えるが、メモリ安全性を備えているという不思議な言語である。
また、C言語のコードを使えるという仕様でもある(#include<stdui.h>import std.stdioに変えるでけでよいそうだ)。

C言語でD言語
import std.stdio;
void main(){
    for(int i = 1;i<101;i++){
        if(i % 15 == 0){
            printf("FizzBuzz\n");
        }else if(i % 3 == 0){
            printf("Fizz\n");
        }else if(i % 5 == 0){
            printf("Buzz\n");
        }else{
            printf("%d\n",i);
        }
    }
}

https://qiita.com/kubo39/items/01f5ca9efae124f7441a

D言語は実用的な言語を目指して開発され、メモリ安全や低レベルへのアクセスのような相反するような機能を同時に提供している汎用言語
C++の構文的な失敗をふまえて人間にも機械にも優しい構文設計となっている
メモリ安全性を実現するために様々な手法を使うことができ、自身の責任でもってそれを使わないことも可能である

C言語をベースにしているだけあって、比較的学習しやすかった。
RustやNimより古い言語なので、比較的レトロな書き方ではある。しかし、現在の言語にも通じる現代的な書き方も備えている印象だった。
特にwritelnでの変数表示は意外なものだった。

D言語を知りたいならこの記事を読むのが吉。
https://qiita.com/cedretaber/items/90b7b34ee710eb5cc965
https://postd.cc/d-for-the-win/

上の記事を参考にしていたら、Rustのmatchによく似た書き方でFizzBuzzを解く書き方が載っていた。

[D言語をご紹介したい]より
import std.stdio;
import std.range: iota;
import std.algorithm: map, joiner;
import std.conv : to;

string fizzBuzz()
{
    return 1.iota(101).map!(i =>
        i%15 == 0 ? "FizzBuzz!"
        : i%5 == 0 ? "Buzz!"
        : i%3 == 0 ? "Fizz!"
        : i.to!string
    ).joiner("\n").to!string;
}

void main()
{
    writeln(fizzBuzz());
}

Java

Java
public class fizzbuzz{
    public static void main(String[] args){
        for (int i=1; i < 101; i++) {
            if (i%15==0) {
                System.out.println("FizzBuzz");
            } else if (i%3==0) {
                System.out.println("Fizz");
            } else if (i%5==0) {
                System.out.println("Buzz");
            } else {
                System.out.println(i);
            }
        }
    }
}

かの有名なMinecraftでよく聞くJava版のJava。
whileでの実装はこちらの記事。
https://qiita.com/showy/items/198b73aff56d834f892a
JavaのCode Golfはこちらの記事。
https://zenn.dev/e99h2121/articles/c605746a858d6b

Nim

Nim
for i in 1..100:
    if i mod 15 == 0:
        echo "FizzBuzz"
    elif i mod 3 == 0:
        echo "Fizz"
    elif i mod 5 == 0:
        echo "Buzz"
    else:
        echo i

Pythonに似ている言語(適当)。

ほかの人やっているのかなと思って調べていたら、この記事に共感できる一言がありました。
https://qiita.com/mechten/items/333b9697c03561fb6158

人類は%かmodか統一すべき...

Nimのすばらしさを説明してくれている記事。
https://zenn.dev/dumblepy/articles/b475b3b4f7d0da

Rust

Rust
fn main() {
    for i in 1..101 {
        if i % 15 == 0 {
            println!("FizzBuzz");
        } else if i % 3 == 0 {
            println!("Fizz");
        } else if i % 5 == 0 {
            println!("Buzz");
        } else {
            println!("{}", i);
        }
    }
}

他のオブジェクト指向の言語に比べてかなりシンプルになった感じがする。

また、Rustには多くの表現があり、この記事ではRustの特徴をしっかりと捉えながらFizzBuzz問題を解いている。Rustの分岐を学びたいなら非常におすすめ。
https://qiita.com/hinastory/items/543ae9749c8bccb9afbc#fnref10
RustのCode Golfはこちらの記事。
https://qiita.com/es__135/items/6fbf488d94393a7ceee3
なお、現在は103文字。どうなってるの???
http://golf.shinh.org/p.rb?FizzBuzz

Mojo

Mojo
def main():
    for i in range(1,101):
        if i % 15 == 0:
            print("FizzBuzz")
        elif i % 3 == 0:
            print("Fizz")
        elif i % 5 == 0:
            print("Buzz")
        else:
            print(i)

公式のURLはこちら。
https://www.modular.com/max/mojo
話題の言語。
Pythonと高い互換性を持ち、高速化ができると言われている。

Pythonとの比較を行っている記事はこちらを。
https://zenn.dev/minedia/articles/70fd47d9a229d5
https://qiita.com/YutaroOgawa2/items/ce6bf46eebc901f68dde

Mojo
fn parameterizedFizzBuzz[n: Int, counter: Int]():
    @parameter
    if counter > n:
        return
    else:
        if counter % 15 == 0:
            print("FizzBuzz")
        elif counter % 3 == 0:
            print("Fizz")
        elif counter % 5 == 0:
            print("Buzz")
        else:
            print(counter)
        parameterizedFizzBuzz[n, counter + 1]()

こちらを参考に。
https://ikesyo.hatenablog.com/entry/2023/05/07/160052
こちらがMojoの特徴を生かし、高速化を行う時のコードだそうで。
fnを使う場合、しっかりとした戻り値が必要みたい。
https://zenn.dev/helloyuki/scraps/70e4bcdef0bc6f

ちなみに私の環境はWindows環境なのでMojoはまだ使えません。ちくしょーっ。まぁ、WSL2を使えばいい話なんですがね。

BASIC

BASIC
FOR I = 1 TO 100
    IF I MOD 15 = 0 THEN
        PRINT "FizzBuzz"
    ELSE IF I MOD 3 = 0 THEN
        PRINT "Fizz"
    ELSE IF I MOD 5 = 0 THEN
        PRINT "Buzz"
    ELSE
        PRINT I
    END IF
NEXT I

BASICは方言が多い言語です。ので下のサイトでコードを眺めるのも一興。
https://rosettacode.org/wiki/FizzBuzz/Basic

BASICといえばプチコンに採用されているSmileBASICを思い出します。
ところで、ZennもQiitaもBASICのシンタックスハイライトに対応しているんですね。とんでもねぇ。

SmallBasic

SmallBasic
For i = 1 to 100
  If (i % 15 == 0) Then
    Print "FizzBuzz"
  Elseif (i % 3 == 0) Then
    Print "Fizz"
  Elseif (i % 5 == 0) Then
    Print "Buzz"
  Else
    Print i
  Endif
Endfor

Small Basicでlet’sプログラミング: もっと思いどおりにパソコンを使おう!
カンタン。タノシイ。カッコイイ。小学生からのプログラミング Small Basicで遊ぼう!!
この本が家にあったのでついでに。動作環境がないので動作確認はしてないけど、まぁ動くでしょう。
SmallBasicのシンタックスハイライトはないので、代わりにBasicを使用。

VisualBasic

VisualBasic
Class fizzbuzz
  Public Shared Sub Main()
        For i As Integer = 1 To 100
            If i mod 15 = 0 Then
                Console.WriteLine("FizzBuzz")
            ElseIf i mod 5 = 0 Then
                Console.WriteLine("Buzz")
            ElseIf i mod 3 = 0 Then
                Console.WriteLine("Fizz")
            Else
                Console.WriteLine(i)
            End If
        Next
    End Sub
End Class

調べても調べてもなかなか情報が出てこないですねこの言語。使わないからだいたい忘れています。
開発したいならMicrosoft公式ドキュメントを読み解きましょうっ。
https://learn.microsoft.com/ja-jp/visualstudio/get-started/visual-basic/?view=vs-2022

「visual studio Visual Basic fizzbuzz」でようやく二つという感じでした。
https://jyuch.hatenablog.com/entry/2015/11/23/220000
https://gist.github.com/sidjayisaok/929d6b84afc29274be7708538e0a43e7

COBOL

COBOL
IDENTIFICATION DIVISION.
PROGRAM-ID. FIZZBUZZ.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 I  PIC 9(3).
PROCEDURE DIVISION.
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 100
      EVALUATE FUNCTION MOD(I 3) = ZERO
          ALSO FUNCTION MOD(I 5) = ZERO
      WHEN TRUE  ALSO TRUE
        DISPLAY 'FIZZBUZZ'
      WHEN TRUE  ALSO FALSE
        DISPLAY 'FIZZ'
      WHEN FALSE ALSO TRUE
        DISPLAY 'BUZZ'
      WHEN OTHER
        DISPLAY I(3 - FUNCTION INTEGER(FUNCTION LOG10(I)):)
      END-EVALUATE
    END-PERFORM.
    STOP RUN.

Wikipdiaから参照。COBOLも方言が多い言語です。

COBOLでFizzBuzzを書いている人達がいましたので貼り付け。コードは記事のほうがそうとう読みやすい。
https://qiita.com/saba1024/items/8b54b0348da6bdee5ca9
https://qiita.com/panda-chibi/items/f03031206809fe60e738

COBOLが悪いと言っている人は、COBOLを理解していない。 しかし、これから学ぶ言語ではない。
COBOLは「古い」のか?令和の時代にCOBOLの“いま”を語る
Cobolの現状:なぜ「オワコン」と言われるのか?

まぁ、言われたところで学習コストがな・・・、相も変わらず読みずらい言語だ。
これもシンタックスハイライト対応と。しかもVScodeのmarkdownにも対応。
ついでにpaiza.ioで実行できる言語でもある。とんでもねぇけどBASICはないのか。

Bash

Bash
for ((i = 1; i < 101; i++))
do
    if [ $(($i%15)) -eq 0 ]; then
        echo 'fizzbuzz'
    elif [ $(($i%3)) -eq 0 ]; then
        echo 'fizz'
    elif [ $(($i%5)) -eq 0 ]; then
        echo 'buzz'
    else
        echo $i
    fi
done

Bashの動きを考えたいならこの記事が良さげ?
https://tomowarkar.github.io/blog/posts/bash_fizzbuzz/

BashのCode Golf

Windowsバッチファイル

Windowsバッチファイル
@ECHO OFF & CLS
SET I=0
:LOOP
  SET /A I=I+1, F=I%%3, B=I%%5, N=!(F*B)
  IF %F% == 0 SET /P X=Fizz<NUL
  IF %B% == 0 SET /P X=Buzz<NUL
  IF %N% == 0 SET /P X="%I%"<NUL
  ECHO;
IF %I% LSS 100 GOTO :LOOP

こちらの記事から参照。
https://qiita.com/ht_deko/items/5cdf2ec481c9c08ba073
Windows版のBash。
かなり面倒くさい言語、FizzBuzzも作りたくない。

PowerShell

PowerShell
for($i=1;$i -lt 101;$i++)
{
    if($i % 15 -eq 0){
        echo FizzBuzz
    }
    elseif($i % 3 -eq 0){
        echo Fizz
    }
    elseif($i % 5 -eq 0){
        echo Buzz
    }
    else{
        echo $i
    }
}

switch文だとこうなる。

switch (1..100) {
{$_ % 15 -eq 0} {'FizzBuzz'; continue}
{$_ %  3 -eq 0} {'Fizz';     continue}
{$_ %  5 -eq 0} {'Buzz';     continue}
default         {$_}
}

PowerShellのCode Golfはこちらの記事。
https://qiita.com/SilkyFowl/items/49d175a495c5c43a15b9

Lisp

Lisp
(dotimes (i 100)                     ; マクロ. (dotimes (カウンタ変数 繰り返し数 dotimesの返り値) E0 E1 ...)
  (let (num)                         ; (let (V0 V1 V2 ...) E0 E1 E2 ...) 局所変数を定義する
    (setq num (+ i 1))               ; num に i + 1 を代入
    (if (= 0 (mod num 3))            ; Fizzを判断
      (format t "Fizz")              ; Fizzを出力
      nil)                           ; else節(なにもしない)
    (if (= 0 (mod num 5))            ; Buzzを判断
      (format t "Buzz")              ; Buzzを出力
      nil)                           ; else節(なにもしない)
    (if (and (not (= 0 (mod num 5))) ; FizzでもBuzzでもないのを判断
             (not (= 0 (mod num 3))));
      (format t "~a" num))           ; 数字を出力
    (format t " " )))                ; すきま

こちらの記事から参照。
https://qiita.com/oieioi/items/e4eaa78a4894ef549a23
ほかの解法としてこんなのも。
https://vipprog.net/wiki/?練習問題/解答例/FizzBuzz/lisp.html

(defun FizzBuzz (n)
  (if (> n 0)
      (progn
        (print (FizzBuzz (- n 1)))
        (if (= (mod n 15) 0)
            'FizzBuzz
          (if (= (mod n 5) 0)
              'Buzz
            (if (= (mod n 3) 0)
                'Fizz
              n))))
    0))

http://blog.adjust-work.com/1333/

(dotimes (i 100)
  (cond 
    ; 15の倍数(3の倍数かつ5の倍数)
    ((equal (mod (+ 1 i) 15) 0) (format t "FizzBuzz~%")) ; modはPHPの%演算子に相当
    ; printではなく表示の調整が効くformatを利用。改行しないと見づらかったため。~% で改行
    ; 3の倍数
    ((equal (mod (+ 1 i) 3)  0) (format t "Fizz~%"))
    ; 5の倍数
    ((equal (mod (+ 1 i) 5)  0) (format t "Buzz~%"))
    ; 条件にヒットしない場合
    (t (format t "~A~%" (+ 1 i)))                        ; ~Aでパラメータを引き渡す事を指定
  )
)

こちらもかなり昔から存在する言語。
https://qiita.com/tutinoco/items/1ee5fec8864c6fdb4281
Lispも方言が多くある言語。Wikipediaに載っている分で20個以上。
https://scrapbox.io/mrsekut-p/Lisp方言

Lispは神の言語と呼ばれているようで。こちらの記事が分かりやすかった。
https://muuumin.net/why-lisp-god-language/

C、C++、Perl、Fortran、Java、COBOL、APLが引き合いに出され、神はこれらの言語を全て知っているが、その上でLispを選んだ、Lispで世界の全てを作った。なぜなら神には締め切りがあって6日間で世界を作らなければならなかったから、というのが要旨だ。

https://howitworks.hatenablog.jp/entry/2017/10/25/112854

そういう意味でLispが神の言語というよりは、Lispを自由に扱えるようになったプログラマが神の域に近づくというのが正解のような気がします。

LispのCode Golfはこちらの記事。
https://qiita.com/artoshimitsu/items/56fb2c00ab1cfa901173

Perl

Perl
for($i = 1;$i < 101;$i++){
    if($i % 15 == 0){
        print "FizzBuzz\n";
    }
    elsif($i % 3 == 0){
        print "Fizz\n";
    }
    elsif($i % 5 == 0){
        print "Buzz\n";
    }
    else{
        print $i,"\n"
    }
}

1995年11月20日第九版発行の『Perlプログラミング』があったので参考に。
Pythonが影響を受けた言語とのこと。print ""elsifが分かりやすいかも。
Pythonがリストで回せるように、Perlにもforeachという配列を使う繰り返し処
理がある。
https://qiita.com/mechten/items/650093e823bb993f77a6

foreachの使用
foreach $i ((1..100)) {
  if ($i % 15 == 0) {
    print "FizzBuzz\n";
  } elsif($i % 3 == 0) {
    print "Fizz\n";
  } elsif($i % 5 == 0) {
    print "Buzz\n";
  } else {
    print "$i\n";
  }
}

PerlのCode Golfはこちらの記事。
https://techblog.kayac.com/2020/12/09/120747

Scala

Scala
for(i <- 1 to 100) {
  if(i % 3 == 0 && i % 5 == 0) {
    println("FizzBuzz")
  }else if (i % 3 == 0) {
    println("Fizz")
  }else if (i % 5 == 0) {
    println("Buzz")
  }else {
    println(i)
  }
}

こちらを参考に。
https://qiita.com/nesheep5/items/02cb0b6d1f6dcbe90149

for(i<-1 to 100)println{var s="";if(i%3==0)s="Fizz";if(i%5==0)s+="Buzz";if(s=="")i else s}

ScalaのCode Golf。
下のURLでF3を押してScala, 90 bytesと入力すると見れます。
https://codegolf.stackexchange.com/questions/58615/1-2-fizz-4-buzz?page=10&tab=scoredesc

Lua

Lua
for i = 1,100 do
    if i % 15 == 0 then
        print("FizzBuzz")
    elseif i % 3 == 0 then
        print("Fizz")
    elseif i % 5 == 0 then
        print("Buzz")
    else
        print(i)
    end
end

こちらを参考に。
https://qiita.com/aike@github/items/2023bbeb21094af6795e
独特な記法が多い印象。
ゲームエンジンをいろいろ調べているときに、Luaを使用するエンジンが多い印象だった言語。

R

R
for(i in 1:100){
    if(i%%15==0){
        print("FizzBuzz")
    }
    else if(i%%3==0){
        print("Fizz")
    }
    else if(i%%5==0){
        print("Buzz")
    }
    else{
        print(i)
    }
}

統計解析向けの言語。
学ぶならこちらのサイトがよさげ。
https://home.hirosaki-u.ac.jp/jupyter/r/
https://www.library.osaka-u.ac.jp/doc/TA_2014_01.pdf
いろいろなFizzBuzzの解き方をまとめている記事。
https://uncorrelated.hatenablog.com/entry/20120218/1329564291

Ruby

Ruby
for i in 1..100
    if i%15==0
        puts "FizzBuzz!"
    elsif i%3==0
        puts "Fizz!"
    elsif i%5==0 
        puts "Buzz!"
    else
        puts i
    end
end

初めてのRuby』を参考に。

ただ、今回の記事のために学習したところ、確かに打つのが楽しい言語ではある、かなぁ。
ちなみにRubyの作者であるまつもとゆきひろ氏は、Quoraという質問サイトでよく見かける。
https://jp.quora.com/profile/Yukihiro-Matsumoto

RubyのCode Golfはこちらの記事。
https://qiita.com/zakuroishikuro/items/151167640fcd909d0c47

JavaSprict

JavaScript
for(let i = 1; i <= 100; i++){
    if (i % 15 === 0){
        console.log("FizzBuzz");
    } else if (i % 5 == 0) {
        console.log("Buzz");
    } else if (i % 3 == 0) {
        console.log("Fizz");
    } else {
        console.log( i );
    }
}

JavaScriptのCode Golfはこちらの記事。
https://qiita.com/obake_fe/items/041715068665dc94aac4

Go

Go
package main
import "fmt"
func main(){
    for i := 1; i < 101 ; i++ {
        if i % 15 == 0 {
            fmt.Println("FizzBuzz")
        } else if i % 3 == 0 {
            fmt.Println("Fizz")
        } else if i % 5 == 0 {
            fmt.Println("Buzz")
        } else {
            fmt.Println(i)
        }
    }
}

Googleが開発した言語。標準ライブラリが非常に充実している言語とも。
https://qiita.com/dalance/items/5816618a308e0058136b
この記事ではRustの標準ライブラリは小さいのかを検証しているが、おまけのほうでC++、Go、Python、Rust、Scalaの標準ライブラリのソースコード行数を検証している。

「Goの標準ライブラリはすごく充実している」という印象とも一致します。

Python3

Python3
for i in range(1,101):
    if i % 15 == 0:
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)

他の言語に比べて簡略的である。これが愛される理由だろうか。
ちなみに変数名は日本語にすることも可能。なでしこっぽくできる。

Python3
for 変数 in range(1,101):
    if 変数 % 15 == 0:
        print("FizzBuzz")
    elif 変数 % 3 == 0:
        print("Fizz")
    elif 変数 % 5 == 0:
        print("Buzz")
    else:
        print(変数)

Python3のCode Golf

Python2

Python2
for i in range(1,101):
    if i % 15 == 0:
        print "FizzBuzz"
    elif i % 3 == 0:
        print "Fizz"
    elif i % 5 == 0:
        print "Buzz"
    else:
        print i

printの構文はpython3とどっちのほうがいいのだろうか?
Python2のCode Golf

Swift

Swift
for n in 1...100 {
    if n % 15 == 0 {
        print("FizzBuzz");
    }else if n % 5 == 0 {
        print("Buzz")
    }else if n % 3 == 0 {
        print("Fizz")
    }else{
        print(n)
    }
}

MacとiOSのアプリで使われている言語。
詳しい説明はAppleの公式サイトで。
https://www.apple.com/jp/swift/
いろんな方法でFizzBuzzを解いている記事。
https://qiita.com/dondoko-susumu/items/946c7155e70648125321
https://okuzawats.com/blog/swift-fizzbuzz/
FizzBuzzをいろいろな方法で解いている記事。
https://qiita.com/dondoko-susumu/items/946c7155e70648125321

Code Golf
for i in 1...100{print(i%15<1 ?"FizzBuzz":i%3<1 ?"Fizz":i%5<1 ?"Buzz":"\(i)")}

Swift, 77 bytesより引用。

GDScript

GDScript
func _ready():
    for i in range(1,101):
        if i % 15 == 0:
            print("FizzBuzz")
        elif i % 3 == 0:
            print("Fizz")
        elif i % 5 == 0:
            print("Buzz")
        else:
            print(i)

Godotで使える専用言語GDScript。
Pythonをベースにしている言語、これのシンタックスハイライトも代わりにpythonで行っています。
C#を使うのとGDScriptを使うの、どっちがいいのだろうか?

なでしこ3

なでしこ3
Nを1から100まで繰り返す
  もし、N%15=0ならば「FizzBuzz」と表示。
  違えば、もし、N%3=0ならば「Fizz」と表示。
  違えば、もし、N%5=0ならば「Buzz」と表示。
  違えば、Nを表示。
ここまで。

公式のFizzBuzz問題から(N%3=0)かつ(N%5=0)N%15=0に変更し引用。
https://nadesi.com/doc3/index.php?try_in_browser
日本語でプログラムのコードを作れる言語。
Scratchで教えるかなでしこで教えるかの派閥がありそう。あるのかな?
ちなみに、お嬢様言葉でコーディングを行う記事がありましたわ~。
https://qiita.com/snowdrops89/items/336a223e6ea052ef9688

Scratch


MITのScratch。せっかく、小学生からはじめるわくわくプログラミングにFizzBuzzがあるなら打ってしまえと。コードの形は違いますが。
一秒表示するコメント表示でFizzBuzzとFizzとBuzzと数値を表現しています。

APL(A Programming Language)

{⍵∨3|⍵:⍵∨5|⍵:'FizzBuzz' ⋄ 3|⍵:'Fizz' ⋄ 5|⍵:'Buzz' ⋄ ⍕⍵}¨1+⍳100

{⍵∨3|⍵:'FizzBuzz'⋄3|⍵:'Fizz'⋄5|⍵:'Buzz'⋄⍕⍵}¨1+⍳100

{⍵∨'Fizz'∧3|⍨⍵:'Buzz'∧5|⍨⍵:,⍕⍵}¨1+⍳100

ChatGPTで出力したコードです。なので動かんかもしれない。実行環境がないので動作チェックも不可能。
1960年くらいの言語。数学の表記法に影響を受けているだけあって、かなーり独特な記法を行う。
プログラムの動きはなんとなく分かったのだが、ネットで調べてもAPLの情報がまったくないからどうしようもねぇ。
ちなみに、AIチャットでほかにないかと聞いたら出てきた言語。今も使われているのだろうか?

Hexagony

Hexagony
       = ? 3 } ) "
      . \ > % ' 5 ?
     \ F \ B ; u ; "
    } " / ; d ' % < >
   \ g 4 / ! { { \ } . 
  % < @ . > " ' . < > ,
   } / $ { ; ; z ; i ;
    z ; ; $ / < > ? {
     $ / " . / _ . .
      . . . . . . .
       . . . . . .

Befungeが長方形なら、Hexagonyは六角形にコードを配置する言語・・・なのだが訳が分からない。
ちなみに上記のコードはCode Golfのコードを六角形にしたようだが、よく分からない。下の記事に詳しい説明があるのでそちらを参考にすること。
HexagonyのCode Golf記事
上の記事に貼られているURLと同じ、別の作者の丁寧な説明URL:Hexagony, 91 bytes
なお、AtCoder に登録したら解くべき精選過去問 10 問を Hexagony で解いてみた(言語解説編)という記事があるので、言語仕様を知りたいならこちらを。
https://taq.hatenadiary.jp/entry/2024/03/09/103000

Chef

Chef
Curry Chicken Soup for FizzBuzz

    Take 100 slices of Chicken
    Bake the Chicken at 350 degrees for 25 minutes
    Mix in 1 cup of Fizz
    Mix in 1 cup of Buzz
    
    Pour the soup into 100 bowls
    
    Go to the kitchen and start cooking
    
    Take the first bowl
    If the contents of the bowl is divisible by 3 and 5
        Say FizzBuzz
    Else If the contents of the bowl is divisible by 3
        Say Fizz
    Else If the contents of the bowl is divisible by 5  
        Say Buzz
    Else
        Say the contents of the bowl
    Take the next bowl
    If there are no more bowls
        Stop cooking
Serve the soup when done

ChatGPTで出力したコードです。なので動かん(検証済み)。
https://esolangs.org/wiki/Chef
Hello Worldとフィボナッチ数列を出力するコードはありました。そして言語仕様を分かりやすくまとめてくれていました。先行者に感謝。
https://taq.hatenadiary.jp/entry/2024/03/09/103000
修正する気力があれば修正したい。

Ook!

Ook!
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook? Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook? Ook! Ook. Ook. Ook? Ook. Ook! Ook? Ook! Ook? Ook! Ook! Ook? Ook! Ook. Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook? Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook? Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook! Ook. Ook. Ook? Ook. Ook! Ook? Ook! Ook? Ook! Ook! Ook? Ook! Ook. Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook. Ook? Ook? Ook! Ook. Ook? Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook? Ook! Ook! Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook? Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook? Ook? Ook! Ook? Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook. Ook? Ook. Ook! Ook? Ook! Ook? Ook! Ook! Ook? Ook! Ook. Ook? Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook? Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook! Ook. Ook? Ook. Ook? Ook! Ook! Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook. Ook? Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook? Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook. Ook. Ook? Ook. Ook! Ook? Ook! Ook? Ook! Ook! Ook? Ook! Ook. Ook? Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook? Ook! Ook. Ook. Ook? Ook! Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook. Ook. Ook. Ook? Ook. Ook! Ook? Ook! Ook? Ook! Ook! Ook? Ook! Ook. Ook? Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook? Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook? Ook. Ook? Ook! Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook! Ook? Ook! 

Brainfuckのコードを置き換えた言語。チンパンジーでも読める言語が売りなそうで。
このコードはBrainfuckのコードをそのまま置き換えています。多分動く、はず。
Ook!とはどういう言語は詳しく知りたいなら下記の記事を読んでください。記事の場所を知っている人は驚くかもしれません。
https://web.quizknock.com/ook
ちなみに、下の上記以外の他言語にBrainfuckのURLがあります。そこから参照しています。別の派生もなかなかに面白いです。

GolfScript

GolfScriptabout
100,{)..3%!'Fizz'*\5%!'Buzz'*+\or}%n*

Code Golfのために作られた言語。言語の仕様上どうやっても同じになるのでこちらからそのままコピペ参照。
GolfScriptのCode Golf記事

gs2

gs2
f

Code Golf専用のプログラム言語。
仕組みとしては、内部関数を呼び出すためのコードです。
gs2のCode Golf記事
gf2のGithub。言語仕様はこちら。
https://github.com/nooodl/gs2

上記以外の他言語

FizzBuzzを1byteで実装する
Zig:多言語FizzBuzzチャレンジ4日目:Zig
SmailBasic:プチコン3号 SmileBASIC コミュニティ
ActiveBasic:時代遅れひとりFizzBuzz祭り ActiveBasic編
FizzBuzz:プログラミング言語 FizzBuzz
FizzBuzzLang:FizzBuzzを書くためだけに作った言語、FizzBuzzLang
Brainfuck:FizzBuzz を Brainfuck で書いてみた
Whitespace:WhitespaceでFizzBuzz(207bytes)
Befunge:BefungeでFizzBuzz[追記あり]
TrumpScript:トランプ氏をイメージしたプログラミング言語 TrumpScriptでFizzBuzz
Shakespeare:FizzBuzzShakespeare
Vim:vimでfizzbuzzをやってみた

FizzBuzzではなくHelloWorldだが気にするな

Ikura:プログラミング言語「Ikura」を作ってみた。
コミュ障プログラミング言語:コミュ障プログラミング言語で遊んでみた(公式サイトはリンク切れ)
Nyaruko:名状しがたいプログラミング言語のようなもの Nyaruko
これらはすべてBrainfuckの置き換えです。面白いことできるね。

コードの説明

実際のところ、全ての言語で最初のコードはfor文とif文で説明できるように選んでいる(gs2とかは例外中の例外)。

#include<stdio.h>
int main(void)
{
    for(int i=1;i<101;i++){
        if(i%15==0){
            printf("FizzBuzz\n");
        }
        else if(i%3==0){
            printf("Fizz\n");
        }
        else if(i%5==0){
            printf("Buzz\n");
        }
        else{
            printf("%d\n",i);
        }
    }
}

コードの通り、C言語で説明をする。

C
#include<stdio.h>

関数の定義。これがなければprintfscanfも使えない。
おなじまいとよく言われているが、指定先にあるプログラムファイルの関数を読みだしているだけである。別の言語に置き換えるとPythonのimportやC#のusingにあたる。
最近の言語は<stdio.h>に類似する関数が最初から入っていることが多くなった印象がある。小さいメモリから脱却して、より多くのメモリを使用できるから最初から読み込ませようということかな。


C
void main(){}

システムの呼び出しでmain関数を実行する。
実際のところ、プログラムの実行を行ったときに最初に呼び出される場所と考えてよい。エントリーポイントと呼ばれている。

インタプリタ言語でもmainを呼び出してはいるのだが(後述)、動作の基本上、上からコードを読んでいくという流れになっている。

例として、Pythonの実行では、コードの実行時に__name__という変数に__main__が入る。そもそも__name__はモジュールの名前が入るが、自分自身を実行している場合には、__main__が入るという仕様になっている。
したがって、Pythonに準するmainはこのような形になる。

Python
if __name__ == "__main__":
    pass

そのため、これの後ろに関数を設置したとしてもモジュールとして読み込まない限りは読み込んでくれないようである。


C
for(int i=1;i<101;i++)

繰り返し処理を行う文。今回はforを使用したが、他にはWhileや再帰関数など様々な手法が存在する(C言語にはGOTO文というものがあってだな)。
C言語のように型を明記するのもあれば、Pythonのように暗記するのもある。

Python
for i in range(1,101,1)

しかしながら、for()の中もrange()の中も順番は変わらず、同じ感覚で使えるのはありがたい。

BASIC
FOR I = 1 TO 100

BASICではその値まで繰り返すとのことなので、101ではなく100を代入する。なぜこっちの仕様にならなかったのだろうか。


C
if(i % 15 == 0){}

演算に用いる記号は昔から変わらない。
実際、Perlの入力に用いた本が1995年出版だったが演算子に違いはなかった。
今回は商の余りを返す演算子%を使用している。


C
else if(i % 3 == 0){}

elseifを組み合わせる条件式。先ほどのifが条件に合わなければ順に処理していく。

Python
elif i%3==0
Ruby
elsif i%3==0

Pythonはまだ分かる。だが、Rubyのelsifはなんなんだ。なんでこうなった?


C
else{}

先ほどのif及びelse ifにも条件が一致しなかった場合、どれにも該当しない場合に実行する。

なお、elseがないとこのような動作になる。

さきほどの処理(Python)
i = 15
if i % 15 == 0:
    print("FizzBuzz")
elif i % 3 == 0:
    print("Fizz")
elif i % 5 == 0:
    print("Buzz")

#出力結果
#FizzBuzz
すべて新規のifで処理(Python)
i = 15
if i % 15 == 0:
    print("FizzBuzz")
if i % 3 == 0:
    print("Fizz")
if i % 5 == 0:
    print("Buzz")

#出力結果
#FizzBuzz
#Fizz
#Buzz

ifの処理は上から順に一致するか確認していき、一致したところで処理を行いifの外へ出るという動作をしている。
そのため、ifを分断すると、すべての条件に一致するため、三つの文字列が出力されてしまう。


C
printf("FizzBuzz");

ターミナルに文字列を出力する。これを標準出力と呼ぶ。
最近の言語ではそのままprintで入力する言語が多くなってきた。

Rustのprintln!、エクスクラメーションマークはなぜあるのでしょうかねぇ。マクロだとしてもねぇ。めんどうなのよ。


これらを組み合わせると先ほどのFizzBuzzのコードが完成する。
お疲れさまでした。


また、先ほどのコードでは15の場合はFizzBuzzと表記したが、別にFizzとBuzzを両方出力すればいいのである。Code Golfもそんな動きだしね。

python3
for i in range(1,101):
    if i % 3 == 0:
        print("Fizz",end="")
    if i % 5 == 0:
        print("Buzz",end="")
    if not i % 3 == 0 and not i % 5 == 0:
        print(i,end="")
    print()

人工知能で遊ぼう

ChatGPTにコードを入れてどの言語かを聞くという遊びをToggeterで見ました。記事の内容は別の言語に変換ですが。

https://togetter.com/li/2366908

ということでいろいろやってみましょう。

Python2

  • Copilot

「このコードはPythonのコードです。このコードは有名なプログラミングの問題、FizzBuzzを解くものです。1から100までの数字を順に出力し、その数が3で割り切れる場合は"Fizz"、5で割り切れる場合は"Buzz"、15で割り切れる場合は"FizzBuzz"と出力します。それ以外の数はそのまま出力します。この問題はプログラミングの基本的な制御構造を理解しているかを確認するためによく使われます。このコードはPython 2のバージョンで書かれています。Python 3では、print関数を使う際には括弧が必要です。例えば、print("FizzBuzz")のようになります。この違いはPython 2とPython 3の間の主な違いの一つです。この問題を解くことで、プログラミングの基本的な概念を理解していることが確認できます。この問題は、プログラミングの初心者にとっては良い練習問題になります。また、経験豊富なプログラマーにとっては、新しい言語を学ぶ際の良いスタート地点にもなります。」

しっかりPython2と認識していますね。優秀。

COBOL

  • リートンのさむら
COBOL
IDENTIFICATION DIVISION.
PROGRAM-ID. FIZZBUZZ.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 COUNTER PIC 99 VALUE 1.

PROCEDURE DIVISION.
MAIN-ROUTINE.
PERFORM VARYING COUNTER FROM 1 BY 1 UNTIL COUNTER > 100
IF COUNTER DIVIDED BY 15 = 0 THEN
DISPLAY 'FizzBuzz'
ELSE
IF COUNTER DIVIDED BY 3 = 0 THEN
DISPLAY 'Fizz'
ELSE
IF COUNTER DIVIDED BY 5 = 0 THEN
DISPLAY 'Buzz'
ELSE
DISPLAY COUNTER
END-IF
END-IF
END-IF
END-PERFORM.
STOP RUN.

さすがに酷だったか?と思ったら比較的綺麗に出力。
しかしさすがにエラー。

Main.cob: 25: warning: line not terminated by a newline
Main.cob: in paragraph 'MAIN-ROUTINE':
Main.cob: 11: error: 'DIVIDED' is not defined
Main.cob: 11: error: invalid expression
Main.cob: 11: error: syntax error, unexpected BY
Main.cob: 14: error: 'DIVIDED' is not defined
Main.cob: 14: error: invalid expression
Main.cob: 14: error: syntax error, unexpected BY
Main.cob: 17: error: 'DIVIDED' is not defined
Main.cob: 17: error: invalid expression
Main.cob: 17: error: syntax error, unexpected BY

エラーの内容を投げたのだが、さすがに無理そうです。

COBOL
IDENTIFICATION DIVISION.
PROGRAM-ID. FIZZBUZZ.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 COUNTER PIC 99 VALUE 1.
01 REMAINDER PIC 99.

PROCEDURE DIVISION.
MAIN-ROUTINE.
PERFORM VARYING COUNTER FROM 1 BY 1 UNTIL COUNTER > 100
DIVIDE COUNTER BY 15 GIVING REMAINDER REMAINDER
IF REMAINDER = 0
DISPLAY 'FizzBuzz'
ELSE
DIVIDE COUNTER BY 3 GIVING REMAINDER REMAINDER
IF REMAINDER = 0

DISPLAY 'Fizz'
ELSE
DIVIDE COUNTER BY 5 GIVING REMAINDER REMAINDER
IF REMAINDER = 0
DISPLAY 'Buzz'
ELSE
DISPLAY COUNTER
END-IF
END-IF
END-IF
END-PERFORM
STOP RUN.

エラー起きました。当たり前ですね。COBOL、恐るべし子っ!

「COBOLで15引く7を実行するコードを作成してください。」とか単純的なコードであれば可能でした。

COBOL
   IDENTIFICATION DIVISION.
   PROGRAM-ID. SUBTRACT-NUMBERS.

   DATA DIVISION.
       WORKING-STORAGE SECTION.
       77 NUM1 PIC 9(2) VALUE 15.
       77 NUM2 PIC 9(2) VALUE 7. 
       77 RESULT PIC 9(2).

   PROCEDURE DIVISION.
       SUBTRACT NUM2 FROM NUM1 GIVING RESULT.
       DISPLAY 'RESULT: ' RESULT.
       STOP RUN.

そもそもCOBOLの出力が可能な時点で十分にすごいのよ・・・。

Python3

  • リートンのさむら
Python
for i in range(1, 101):
    if i % 3 == 0 and i % 5 == 0:
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)

暗記PowerShell -> Rust

可能。めっちゃきれいなコードだった。

Rust
for i in 1..=100 {
    if i % 3 == 0 && i % 5 == 0 {
        println!("FizzBuzz");
    } else if i % 3 == 0 {
        println!("Fizz");
    } else if i % 5 == 0 {
        println!("Buzz");
    } else {
        println!("{}", i);
    }
}

なぜPowerShellと判断したのでしょうか?理由を聞かせてください。

  • さむら

そうですな、私がPowerShellと判断した理由を説明させていただきます。
提示されたコードの構文から、以下の点でPowerShellスクリプトであると考えました。
変数の前にがついている (i)
比較演算子が-ltや-eqと、通常の<や==ではない
echoが出力の手段として使われている
ブロックの開始と終了がカッコ{}ではなく、改行で区切られている

Scala -> Java

可能。

Java
for (int i = 1; i <= 100; i++) {
    if (i % 3 == 0 && i % 5 == 0) {
        System.out.println("FizzBuzz");
    } else if (i % 3 == 0) {
        System.out.println("Fizz");
    } else if (i % 5 == 0) {
        System.out.println("Buzz");
    } else {
        System.out.println(i);
    }
}

なぜScalaだと判断できたの?

  • さむら

for(i <- 1 to 100) の構文 - これは Scala のレンジ記法に似ていると感じました
println() の使用 - Scala でよく使われる関数です
条件分岐の構造 - if-else if-else の形式が Scala らしいと思いました

かんそー

人工知能で遊ぶの結構面白い。

あとがき

FizzBuzz問題は順次、分岐、反復の基本を押さえて始めてできるプログラムのため、初心者向けであり技量の基準と言われていると。そう聞かれたらなるほど納得はする。が、しかしな、少なくともPythonで割り算の処理したときに出力がfloatになる現象での基準、てめーはダメだ。
ちなみにこの記事を打っている時、小学生からはじめるわくわくプログラミングという昔販売されていた小学生用のScratch本なのだが、「算数」の項目で出題されていた(3.0対応の最新版にあるかどうかは知らない)のを思い出した。
それほどまでにFizzBuzzは有名な問題なのだろうか(有名です)。
ちなみに昔、「いろんな言語でプログラムができるかを聞くのであれば、FizzBuzz問題をいくつのコードで実装できるかを聞け」と教わったことがあります。
いちおう「ここはどのような処理をしているのかを聞くのも重要だ」も言われたが・・・どうなんだろうか。他のコードでは「偶数奇数判定」「素数判定」「フィボナッチ数列」「結果を配列にして複数出力」と言われました。

今まで入力してきたコードを適当に振り返れるだけ振り返っていきましょう。
C言語は今まで長く触れてきた言語かなと。いままでminGWでコンパイルしてきましたが、WSLやclでのコンパイルができるようになってずいぶんと楽になった印象(今はclでやってます)。
C++。すごくむずかしいと思ったけど、慣れれば案外難しくない言語。おそらく、アップデートで使いづらかった部分が改善されているのかもしれない。昔はそうとう読めたものじゃなかったと聞くしね。
それでも、多重継承だったりポインタ操作だったり、意味わからん手法が沢山あるからやっぱり嫌いな言語。
C#。UnityだったりGodotだったりで出番があります。学ぶことはないと思ってたのに。ちなみに、Windowsであれば.NETを使ってコンパイルできます。
Rust。気に入っている言語です。プログラムの第二言語ではなく第一言語にしたいくらいです。( ^ω^)・・・Code Golf、やってみようかな。AtCoderが先か。
D言語。この記事の作成中に見つけた言語です。Rustとはまた違った面白さがありそうですね。しかも今までのC言語の資産(知識やコード)が使えるのはとても強い、学びやすかったのもよかったので、Rustと同時に学習をしていきたい言語。
ちなみに、AtCoderでD言語の使い手がまったくいなさそうだったので、D言語でやっていくのもありそう。
Nim。どこかで知った言語。Pythonの実行速度が遅いからいろいろ調べたような記憶。ファイル操作らへんまでやって投げているからあまり響かなかった言語かなぁ。
Mojo。最近注目を浴びている言語。D言語がC言語と高い互換性を持つように、MojoはPythonと高い互換性を持っている言語です。なので、機械学習の界隈ではいろいろ研究されているそうです。MacとLinuxはあるのですが・・・Windows版来ないかなぁ。
Java。嫌いです。以上。でもMinecraftのJava版は好きです。
JavaSprictは一番嫌いな言語です(自己紹介)。一応ちょいとはできますがね。
BASIC。昔の言語。
派生としてプチコン専用のSmailBasicがあるみたいですが、あれ使った人に聞きたいです。使いやすかったですか、あれ。
昔の数学の教科書を読んでいると、たまーに後ろのほうにあるんですよね、BASICのコード。図書館にでも行けばもっと多くのコードが見つかるでしょうか。まとめてみたい。
SmallBasic。何気に三番目に触れた言語です。本に3Dグラフィックの内容とかあったけど小学生だとなんとなくしか理解できていませんでした。今だったら分かる。
VisualBasic。Visual StdioでWindowsアプリケーションを作る時に使いました。まぁ、使いやすかったです。思う部分はありますが、それでもJavaよりかは最高に使いやすかったです。
COBOL。銀行のシステムで使われていると聞く恐ろしい言語。実際のところ、昔の書き方がアレなだけで、言語仕様は・・・方言も悪さをしていそうだ。
今後学びたいという感じではありますが、いかんせん教材がない。こういうところもCOBOLの難読化につながる要因なのかもしれない。
いちおう大学の図書館にCOBOL関連の本があるので暇ができたら読んでみたい。
Bash。WSLを使う前にLinuxを使っていたので使えますが、だいたい忘れています。このコードを打つ時も昔使った資料集を使いました。
Windowsバッチファイル。二番目に学んだ言語。PowerShellを使う前はこれを使っていましたが、いかんせん難しい印象しかありません。
PowerShell。Pythonを使う前はこれをインタプリタ言語の主力として使っていました。今でもちょっとした処理をしたいときやWindows特有のことをしたいときは使います。
Perl。名前だけ知っている形でしたが、今回の記事を書くにあたって、かなりさらっと読みました。パット見た感じ、Pythonの理念というよりか思想のもとになった書き方がいくつか見受けられた感じでした。
変数名の前に$をつける構文はBashやBatに近いものが、for文の作りがC言語系統であることからも、当時ではかなり革新的だったかと思うところが節節に見受けられました。
こう鑑みると、言語仕様が昔から変わらないのはなんて幸せなことだろうか。
Lua。昔のゲームエンジンを見ていると、どうもLuaを指定している感じだったのが印象的だった言語です。C++に代わる言語として使われていたのでしょうか。
Python。この言語に初めて触れた時は扱いずらい言語でした。が、使っていくごとに利便さを感じ、今では結構使う言語になっています。Pythonを使い始めて、printの中にif文を入れたりfor文を一行にまとめたり、結構独特な構文が多いですが、意外と分かるもんだ。
しかし、言いたいことがあります。・・・elifよ、おお、なぜそなたはelifなのだ?それはね?それはー?それはね?それはー?Perlとかに影響受けたから。
Swift。正直iOSのアプリを開発したことがないので、どういう言語なのかが良く分からない。でも、Macを使う機会は今後そんなにないだろうし、覚えなくてもいいか(おい)。
GDSprict。Godot専門の言語です。Pythonのように作れるのが思いのほか便利なので、C#よりかはこっちが出番多いかな。
なでしこ。日本語でコードを打つのは小説を打つ感覚に似ていて少しだけ楽しかった。でも、二分三秒くらいで飽きた。しかし、教育現場で使える言語だろうか?今だったら日本語で変数を作れるPythonでいいのかもしれない。
Scratch。言語と言っていいのか分かりませんが、最初に学んだ言語です。
正直、教育現場ではこれを使っとけばいいのです。小学校のころから無駄にコードを打たせないで、プログラムの仕組みから段階的に学ばせればいいのです(急な自己語り)。
gf2。発想が面白い。というよりCode Golfという内容を知るきっかけになった言語でもある。Code Golf的なコードをいろいろ考えていきたい。
ChatGPTで出力したコードはいつか自ら修正したほうがいいかな。
ちなみに人工知能に「他の言語なんかある?」と聞いたところ、APLが出力されました。あとはChuckNorris、Shakespeare Programming Language、Chef、Befunge、TrumpScriptとネタ言語が出てきて愉快でした。ほかはWhitewhite(!?)です。Whitespaceの誤字です。実行できなかったので、コードは間違っていました。
とりあえず、APL、Chefの二つはChatGPTの出力なのでほぼ動かないかと思われます。お気を付けて。

今までに学習した言語はC、C++、C#、BASIC、SmallBasic、VisualBasic、Bash、PowerShell、Java、JavaSprict、Python3、GDSprict、Rustですが、しっかりと使えるのは、PowerShell、C、Python、Rust((; ・`д・´)<Rustは学習中でしょうがっ)といったあたりでしょうか。
こう見ると一貫性がなさそうですが、オブジェクト指向より関数型言語のほうが性に合っているというよりか、結構得意な印象が見えたような気がしなくもないです。
今は課題で使うPythonと、趣味のRustとD言語、ゲーム開発でのGDSprictとC#を中心に学んだほうがよさそうかな。COBOLもやってはみたいですが、Rustより学習コスト高くないか。
昔のプログラミング本を読んでいくと、言語仕様の思想が書かれていることが多かったという感じがする。それとも最近の入門向けはそこまで書かないのだろうか。
それから、基礎的な内容は変わらずに残っているのがよーく分かりました。分かりましたけど、Python2とPython3、それからPerlの仕様変更結構大きくないですかね。
それからFizzBuzzを調べていると、ズンドコキヨシというなんとも愉快なコードがありました。ので、今度はなにかの言語で練習として作ってみます。下記の記事で言語別にまとめてくれています。
https://qiita.com/shunsugai@github/items/971a15461de29563bf90

ちなみにこの記事の文字数、4万文字だそうです。なんだこの数値は。そりゃ執筆も校正も途中で力尽きるわ。
こんな記事を打つならAtCoderやっときゃよかったかな。

FizzBuzz記事のおすすめまとめ

多言語FizzBuzz Advent Calendar 2022
1, 2, Fizz, 4, Buzz
fizzbuzz-polyglot

FizzBuzz関連でおすすめな記事

FizzBuzz Zero ―― 人類の知識なしでFizzBuzzをマスターする
逆FizzBuzz問題 (Inverse FizzBuzz)

FizzBuzzとは関係ないがこの記事と関連してそうな記事

https://qiita.com/kotauchisunsun/items/c8b6484c98557da44893

Discussion