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/2が1 <=> i+1が3の倍数) → "" (それ以外)
という技法を習得したので早速適応。
- 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))