Scalaの勉強をはじめたので、とりあえず簡単なパーサーを作ってみてます。
http://d.hatena.ne.jp/nowokay/20111109#1320815540
前回、関数呼出しのチェーンができるようにしました。
http://d.hatena.ne.jp/nowokay/20111117#1321499255
ここらで、ちょっと、プログラマの実力をはかる試金石という噂のFizzBuzzを書いて、ぼくもScalaプログラマへの道に足を踏み入れましたよってことを認めてもらわねばなりません。
FizzBuzzは、「1からnまでの数字を出力、ただし3で割り切れるときはfizz、5で割り切れるときはbuzz、3と5の両方で割り切れるときはfizzbuzzを数字の代わりに出力」という問題です。
まず、FizzBuzzでは割り算の余りの計算が必要になるのですが、今回剰余演算子が使えません。
ということで、mod関数を書いてみます。
def mod(x, y) ={ if(x < y){ x }else{ mod(x - y, y) } };
そうするとFizzBuzzが次のように書けます
def fizzbuzz(x) ={ def impl(y)={ if(y < x + 1){ if(mod(y,3) < 1){ if(mod(y,5) < 1){ println("fizzbuzz") }else{ println("fizz") } }else if(mod(y,5)< 1){ println("buzz") }else{ println(y) }; impl(y + 1) }else{ 0 } }; impl(1) }; fizzbuzz(20);
実行してみるとこういう感じで、ちゃんとFizzBuzzしてます!
1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz 16 17 fizz 19 buzz
わーい、ぼくにもScalaでFizzBuzzが(動く言語が)書けました!
ソースはこれ。
https://gist.github.com/1345875/3d29cd7b78c6b6d359b5607568e48653e5a8757c