FizzBuzz CodeGolf in Scala extends noire722

コードゴルフ的なお話。

FizzBuzz in Scala - cignoir の日記
を見て、なんとかscalaちゃんでもうちょっとがんばれないかとやってみた。


基本構文はそのまま丸パクリ。

  • 87bytes

for(i<-1 to 100)println((if(i%3>0)""else"Fizz")+(if(i%5>0)if(i%3>0)i else""else"Buzz"))


やったこととしては、"FizzBuzz"の表記を無くし、
前半("Fizz"部分)と後半("Buzz"部分)とに分けて"+"で文字列結合。
2bytes減ったよ、やったねscalaちゃん!


しかし依然人権がないのだった・・・。


パッと見て、()やelseが多い気はする。
まだscalaの構文がよくわかってないのでなんともだけども、もうちょいなんとかしたいですね!


(追記)

id:Dekosuke の助言により、

"Fizz"*(i%3/2)  → "Fizz" (i%3/21 <=> i+13の倍数)
                → ""     (それ以外)

という技法を習得したので早速適応。

  • 77bytes

for(i<-0 to 99)println(if(i%3<2&&i%5<4)i+1 else"Fizz"*(i%3/2)+"Buzz"*(i%5/4))

ポイントは、i の値を1つ小さくしてずらすことで、剰余判定を楽にしているところ。


さらに、id:noire722 からの、「最初のif文中の && は & でよくないか」というのを反映し、

  • 76bytes

for(i<-0 to 99)println(if(i%3<2&i%5<4)i+1 else"Fizz"*(i%3/2)+"Buzz"*(i%5/4))

みんなの力を合わせれば短くなるもんですね。
まだ何か削れないかな・・・。

(さらに追記)

以前縮めて登録していたものを発掘したのでぺたぺた。
ただ、トップは70bytesだったりであと一息が遠い。

  • 73bytes

for(i<-1 to 100)println(if(i%3*i%5>0)i else"Fizz"*(1-i%3)+"Buzz"*(1-i%5))