FIZZBUZZプログラムを書いてみる

 プログラミング界隈では「FIZZBUZZ問題」という非常に有名な問題がある。

 

ja.wikipedia.org

 

 この「FIZZBUZZ問題」とはコンピュータの画面(コンソール画面)に『FIZZBUZZゲーム』の結果を表示させるプログラム」を作る問題である。

 今日はこの「FIZZBUZZプログラム」を現在学習中の言語や現在活用中の言語を用いて書いてみる。

 

 最初に、元のFIZZBUZZゲームについて確認する。

 ゲームのルールは次のとおりである。

・最初のプレーヤーは「1」と発言する。

・次のプレーヤーは原則として直前のプレイヤーが発言した数字に1を加えた数字を発言する(直前のプレーヤーが1であれば「2」と発言する)。ただし、①その数字が3の倍数である場合はその数字の代わりに「FIZZ」と発言し、②その数字が5の倍数である場合はその数字の代わりに「BUZZ」と発言し、③その数字が3の倍数かつ5の倍数である場合はその数字の代わりに「FIZZBUZZ」と発言する。

・言い間違えたら脱落。

 ゲームではプレーヤーが数字・FIZZ・BUZZ・FIZZBUZZと発言する。

 他方、プログラミングのFIZZBUZZ問題ではプログラムを書いて実行することでそれらをコンソール画面などに表示させるわけである。

 

 というわけで、早速チャレンジ。

 最初はPERL言語で書いてみる。

 PERLは私が長年利用していたプログラミング言語である。

 よって、これで書けないとなるとお話にならない。

 

(以下、ソースコード

my $i = 1 ;
while ( $i < 101 ) {
    if ( ! ( $i % 15 ) ) { print "FIZZBUZZ," ; }
    elsif ( ! ( $i % 3 ) ) { print "FIZZ," ; }
    elsif ( ! ( $i % 5 ) ) { print "BUZZ," ; }
    else { print "$i," ; }
    if ( ! ( $i % 10 ) ) { print "\n" ; }
    $i += 1 ;
}

ソースコード終了)

 

 何も見ないでサクッと書けた。

 上のプログラムを実行した結果は次のとおりである。

 

f:id:Hiroringo:20210302230237j:plain

 

 教科書などを一切見ないで書き、無事に動いた。

 めでたしめでたし。

 当分の間、FIZZBUZZ問題に出会ったらPERLで書くことにしよう。

 

 もっとも、PERLで書けるのは当然である。

 次に、最近学習し始めた言語でチャレンジする。

 まずはRUBYで。

 

(以下、ソースコード

def fizzbuzzoutput ( x )
    if ( x % 15 == 0 ) then
        print "FIZZBUZZ!!"
    elsif ( x % 5 == 0 ) then
        print "BUZZ!"
    elsif ( x % 3 == 0 ) then
        print "FIZZ!"
    else
        print x
    end
end

for i in 1..100 do
    fizzbuzzoutput ( i )
    print " , "
    if ( i % 10 == 0 ) then
        print "\n"
    end
end

ソースコード終了)

 

 タグ下げが微妙だがこんな感じか。

 上のプログラムの実行結果はこちら。

 

f:id:Hiroringo:20210302230822j:plain

RUBYで書いたFIZZBUZZプログラム

 ちゃんと動くプログラムが書けた。

 ただ、覚えていない部分があって、その点は教科書等を見た。

「コンソール出力・if文・ループ・関数」レベルのことについて何かを参照しないとプログラムが書けないというのは少々まずい。

 暗記するための時間を取らないとダメか。

 

 次はPYTHONで書いてみる。

 

(以下、ソースコード

i = 1
while i < 101 :
    if ( not ( i % 15 ) ) :
        print ( "FIZZBUZZ!! , " , end='' )
    elif ( not ( i % 3 ) ) :
        print ( "FIZZ! , " , end='' )
    elif ( not ( i % 5 ) ) :
        print ( "BUZZ! , " , end='' )
    else :
        print ( str(i) + " , " , end='' )
    if ( not ( i % 10 ) ) :
        print ( "" )  i += 1 
ソースコード終了)

 

 上のプログラムの実行結果はこんな感じ。

 

f:id:Hiroringo:20210302232115j:plain

pythonで書いたFIZZBUZZプログラム

 これもちゃんと動いた。

 ただ、こちらも「何も見ないで書く」ということはできず。

 RUBY同様、暗記のための何かをすべきか。

 

 最後はC++で書いてみる。

 C++も長年私が利用している言語である。

 

ソースコード

#include <iostream>
using namespace std;

int main ( ) {

    for ( int i = 1 ; i < 101 ; i++ ) {
        if ( ! ( i % 15 ) ) { cout << "FIZZBUZZ!! , " ; }
        else if ( ! ( i % 3 ) ) { cout << "FIZZ! , " ; }
        else if ( ! ( i % 5 ) ) { cout << "BUZZ! , " ; }
        else { cout << i << " , " ; }
        if ( ! ( i % 10 ) ) { cout << "\n" ; } }

    return 0 ;

}

ソースコード終了)

 

 プログラムをコンパイルして実行した結果はこんな感じ。

 

f:id:Hiroringo:20210302233122j:plain

CPPで書いたFIZZBUZZプログラム

 これもちゃんと書けたかな。

 めでたしめでたし。

 

 さて。

 今回は「プログラムを書く」ことが目的であり、その方法にこだわりはなかった。

 そのため、どれも似たようなプログラムになった。

 

 もっとも、ウィキペディアの記事によると、色々な「縛り」があるらしい。

 

「制限時間2分以内」「剰余(%記号等)を用いない」「1行でできる限り短く(ワンライナー)」等の縛りでゲーム条件を満たすコード記述の腕試しをする者が続出した。


 最初の「制限時間2分以内」についてはPERLやC++であれば書けるだろうが、他の言語だと怪しい。

 ちゃんと記憶のための時間を取らないと。

 

 次に、「剰余記号(%記号等)を用いない」についてはどうやるのだろう。
 ちょっと頭を使う必要がありそうだ。

 さらに、「1行でできる限り短く(ワンライナー)」については何をすればいいか今の段階では想像ができない(多分3項演算子を使うのだろうけど)。

 これらについても近々挑戦してみようかな。