FizzBuzz問題をプログラミングしてみよう

弊社のエンジニア陣を筆頭に開催しているhogehoge会も第5回目を迎えました!!今回もリモートで開催です。

ちなみに過去の開催テーマは
第1回目は「リモートhogehoge会「リモート環境での困ったことの共有&俺スゲー環境自慢」
第2回目は「第2回 hogehoge会の実施 -アプリを作ってみよう-
第3回目はブログではなく別の場所で近日公開!!
第4回目は「第4回hogehoge会 -個人開発「川柳アプリ」の紹介-
のようになっております。

そして今回のお題は・・・・「FizzBuzz問題を日本語プログラミング『なでしこ』で書いてみよう!」
です。

それではいってみましょう!

FizzBuzz問題とは?

もともとは言葉遊びのゲームでしたが、現在では「プログラミングの経験が少なからずあるか」を知る手軽な問題となってます。
FizzBuzz問題では、プログラムは任意の自然数を与えられ、特定の値には特定の値を返します。
下記のような問題が一般的によく使われます。
「アルゴリズムは3で割り切れる場合は”Fizz”、5で割り切れる場合は”Buzz”、そして3と5で割り切れる場合は、”FizzBuzz”を出力。この条件以外では与えられた数値をそのまま出力します。」

FizzBuzz問題をみんなで書いてみようの会は第2回目のhogehoge会で開催し、盛り上がりました。

 

日本語プログラミング「なでしこ」って?

ほとんどのプログラミング言語の文法は英語をベースにしているが、なでしこは日本語をベースにしているひまわりの後継プログラミング言語として、より自然な記述を目標として0から開発され、2005年2月17日に、正式版が公開された。

なでしこは、オープンソースのプログラミング言語であり、ソースコードが公開されている。なでしこ(v1)の本体はDelphiで開発された。インタプリタ方式なので実行速度は遅いが、ひまわりと比べると、実行速度が10倍以上速くなっている。なでしこ(v3)は、JavaScriptに変換されて実行される。
Wikipediaより引用

なでしこは「なでしこ3簡易エディタ」というブラウザ版があるので、ブラウザから手軽にコードを試し書きしてみることができます。

例えば『「こんにちは」と表示』と打つと「こんにちは」と表示されます。

なでしこプログラミング_こんにちは画面

なでしこでは、助詞「と」「を」「が」「から」「まで」などで、単語の区切れを認識しています。つまり、上記のプログラムでは、『「こんにちは」|と|表示』と、区切って解析しています。

そして、なでしこのプログラムの構造は以下のような形式になっています。

引数+助詞、引数+助詞、 ... 関数。

『「こんにちは」と表示』という命令文で言えば、「こんにちは」が引数で、「表示」が関数となります。

だそうです。一見普通の日本語文に見えますが、ちゃんとプログラムの構造に分けられているんですね。

 

なでしこでFizzBuzzやってみよう

<

p class=”p1″>みっちー「というわけでなでしこでFizzBuzzを書いてみよう!」
ヤオさん「まず文法を理解するのが難しいですね」
シロー「書き慣れた言語で書きたくなる・・・!」

〜15分経過〜

皆さん各々日本語プログラミングを試してみました。正解の一例はこちらです。

iを1から30まで繰り返す
  もし、i%15=0ならば
    「fizzbuzz」を表示。
  違えば、もし、i%3=0ならば
    「fizz」を表示。
  違えば、もし、i%5=0ならば
    「buzz」を表示。
  違えば
    iを表示。
  ここまで。
ここまで。

ブラウザで実行してみると・・

なでしこ3簡易エディタ

おー!FizzBuzzができました!!

あべちゃん「日本語なので、読みやすいですね」
みずぽす「プログラミングの勉強にも良さそうです」

 

色々な手法でFizzBuzz

みっちー「他にも新しい手法でFizzBuzz問題が書けないかな?」
うるおじ「1行で書くっていうものがQiitaにあったよ。ちょっとやってみよーっと」

みっちー「ねーYOSHIKI、何か面白いFizzBuzz書いて〜。KQのダァシエリイェス!!で書いてよ」
YOSHIKI「俺今日は実況に徹するわ」
みっちー「え〜。僕は再帰関数でFizzBuzz書いてみようかな」

〜各自もくもくタイム〜

みっちー「あ、再帰関数で書けた〜 :-D(最初無限ループになっちゃったけど) 」

Swiftで再帰関数に挑戦

再帰処理とは、自分自身を呼び出す処理が書かれている関数を呼び出す事です。みっちーさんのコードでは「recursiveFizzbuzz()」が再帰関数にあたります。終了条件が間違っていたりすると永遠に処理が終わらず、無限ループに陥ったりする事も。

 


うるおじ「短い感じのいい感じのできた」

<?php $i=0;while($i++<100) echo (($i%3?'':"Fizz").($i%5?'':"Buzz")?:$i).' ';?>

PHPで1行コード!!実行してみると・・

PHPで1行FizzBuzzに挑戦みっちー「お〜、できてる。短いの面白いね」

 

ゆーさん「再帰デビュー 🙂 」
ゆーさんもPHPで再帰関数のFizzBuzzお披露目です。

<?php
function fizzbuzz($num) {
    if ($num > 1) {
        fizzbuzz($num -1);
    }    
    if ($num % 3 === 0 && $num % 5 === 0) {
        print "fizzbuzz" . "\n";
    } elseif ($num % 3 === 0 ) {
        print "fizz" . "\n";
    } elseif ($num % 5 === 0 ) {
        print "buzz" . "\n";
    } else {
        print $num . "\n";
    }
}
fizzbuzz(100);
?>

 

さらにもくもくタイムが続きます。
みっちー「Swiftで短くできるかな。改行しないといけないんだよな・・」

うるおじ「俺はさらにさっきのやつを短くしてみよう。あ、カッコを外すとだめだなー」
YOSHIKI 「なぜ1行でFizzBuzzを描こうとしているのか。私には理解できません。彼らはただの変態です(実況中)」

シンさん「できました。C#で書いてみました」

Func<int, string> fizzbuzz2 = n => n % 15 < 1 ? "FizzBuzz" : n % 5 < 1 ? "Fizz" : n % 3 < 1 ? "Buzz" : n.ToString();

みっちー「おー。paizaで実行してみよう。あれ?なんか怒られてる」
シン「using System; が必要でしたね」
C#で1行FizzBuzzに挑戦
みっちー「あ、通った!FizzBuzzできてますね」

 

みっちー「赤ちゃんJSで超短いコード書いて」
赤ちゃん「(チャット)マイクが入らない。もう書いたよ」
みっちー「さすが早いっ」

for(let i=1;i<101;i++) {console.log((i%3?'':'Fizz')+(i%5?'':'Buzz')||i)};

実行してみると・・・

JavaScriptで1行FizzBuzzに挑戦

FizzBuzzになっていますね!

 

おしまい

みっちー「1行で書くのも面白いね。でもFor文の中にConsole.logとか、まあ本番では使えないけど・・」
おじさん「一行コード、これでMR(Merge Request)出されたらぶち切れるね(笑)」
うるおじ「まあ、本番はね」
みっちー「今回はプログラミングで遊んでみようっていうテーマだったので、色々楽しめたのではないでしょうか 😀 参加してくれた皆さんも、ありがとうございました!」

という事で日本語プログラミングからはじまり、再帰で書いてみる、1行で書いてみる、、など、ゆる〜くプログラミングで遊んだ会となりました。
すぐに色々作って遊べるプログラミングは素敵ですね。

次回のhogehoge会もお楽しみに!