弊社のエンジニア陣を筆頭に開催している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を表示。 ここまで。 ここまで。
ブラウザで実行してみると・・
おー!FizzBuzzができました!!
あべちゃん「日本語なので、読みやすいですね」
みずぽす「プログラミングの勉強にも良さそうです」
色々な手法でFizzBuzz
みっちー「他にも新しい手法でFizzBuzz問題が書けないかな?」
うるおじ「1行で書くっていうものがQiitaにあったよ。ちょっとやってみよーっと」
みっちー「ねーYOSHIKI、何か面白いFizzBuzz書いて〜。KQのダァシエリイェス!!で書いてよ」
YOSHIKI「俺今日は実況に徹するわ」
みっちー「え〜。僕は再帰関数でFizzBuzz書いてみようかな」
〜各自もくもくタイム〜
みっちー「あ、再帰関数で書けた〜 :-D(最初無限ループになっちゃったけど) 」
再帰処理とは、自分自身を呼び出す処理が書かれている関数を呼び出す事です。みっちーさんのコードでは「recursiveFizzbuzz()」が再帰関数にあたります。終了条件が間違っていたりすると永遠に処理が終わらず、無限ループに陥ったりする事も。
うるおじ「短い感じのいい感じのできた」
<?php $i=0;while($i++<100) echo (($i%3?'':"Fizz").($i%5?'':"Buzz")?:$i).' ';?>
PHPで1行コード!!実行してみると・・
みっちー「お〜、できてる。短いの面白いね」
ゆーさん「再帰デビュー 」
ゆーさんも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; が必要でしたね」
みっちー「あ、通った!FizzBuzzできてますね」
みっちー「赤ちゃんJSで超短いコード書いて」
赤ちゃん「(チャット)マイクが入らない。もう書いたよ」
みっちー「さすが早いっ」
for(let i=1;i<101;i++) {console.log((i%3?'':'Fizz')+(i%5?'':'Buzz')||i)};
実行してみると・・・
FizzBuzzになっていますね!
おしまい
みっちー「1行で書くのも面白いね。でもFor文の中にConsole.logとか、まあ本番では使えないけど・・」
おじさん「一行コード、これでMR(Merge Request)出されたらぶち切れるね(笑)」
うるおじ「まあ、本番はね」
みっちー「今回はプログラミングで遊んでみようっていうテーマだったので、色々楽しめたのではないでしょうか 参加してくれた皆さんも、ありがとうございました!」
という事で日本語プログラミングからはじまり、再帰で書いてみる、1行で書いてみる、、など、ゆる〜くプログラミングで遊んだ会となりました。
すぐに色々作って遊べるプログラミングは素敵ですね。
次回のhogehoge会もお楽しみに!