なんじゃくにっき

プログラミングの話題中心。

Scalaで1行FizzBuzz

http://d.hatena.ne.jp/SumiTomohiko/20080408/1207635193
http://d.hatena.ne.jp/travelershouse/20100106/1262797626
 
ググると何人かScalaFizzBuzzしてる人はいるけど
Scalaに慣れるためってことで自分でも書いてみる。
 
 
とりあえず一発目。見やすくするため改行を入れておく。
Listを使った。rangeは1から101にしないと駄目な点に注意。


List.range(1,101).foreach{e=>println(if(e%15 == 0) "FizzBuzz"
else if(e%3 == 0) "Fizz"
else if(e%5 == 0) "Buzz"
else e)}
 
こっちはMAP版。

((1 to 100)map{e=>if(e%15 == 0) "FizzBuzz"
else if(e%3 == 0) "Fizz"
else if(e%5 == 0) "Buzz"
else e}).foreach(println)
 
最後に頑張って短くした版。手続き型なのでScalaっぽくなくてあまり面白みがない・・

for(e<-1 to 100)printf("%d\r%s%s\n",e,if(e%3<1)"Fizz"else"",if(e%5<1)"Buzz"else"")
Scalaだといくつか問題があってなかなか短くならない。
 
・ forループが(i=1;i<100;i++)みたいに書けない。
・ if文の条件式はBoolean型じゃないと駄目(これはJavaもだけど)
つまり『条件式の中身をInt型にして0かそれ以外で分岐』が出来ない。
三項演算子が ? : じゃなくて if elseと文字数が多い。
 
でもJavaと比べると
・ 対話型インタプリンタを使うとクラス宣言がいらない。
のでかなり短く出来る。
 

短くするための方法としては
・ e%3==0 を e%<1とすることで1字削除
・ elseの前後が文字列リテラルの場合空白を詰める(偶然見つけたけど吃驚した)
・ \rを使って行頭にカーソルを戻す(これは反則かも。環境によっては正しく出力されない)
等等。
 
 
Scalaでどれくらい短くなるのかなーって思ってコードゴルフしてるところをみてみたが、
マイナー言語のためかScalaでゴルフしてるサイトは見つけられなかった。残念。
Anarchy Golfでできるようになってる!