RでFizzBuzz

すごい今更感。

普通にFizzBuzz

まず普通にやるならこうではないだろうか。

# 正攻法?
for(i in 1:100){
  if(!i%%3) cat("Fizz")
  if(!i%%5) cat("Buzz")
  if(i%%3 && i%%5) cat(i)
  cat("\n")
}

15で割ったり3割りや5割りを2度繰り返すのはちょっと見苦しいので、

# 15で割らない(書いて消す)
for(i in 1:100){
  cat(i,"\r")
  if(!i%%3) cat("Fizz")
  if(!i%%5) cat("Buzz")
  cat("\n")
}

(このやり方は奥村先生のところで見付けた:FizzBuzz問題 | Okumura's Blog)
ただMacのRコンソールではまともに出力されない。WindowsのRguiでもダメかも。
ESSではいけた。なぜかわからないけど桁数が5桁以上になってもOKだった。

ワンライナーFizzBuzz

そんでまあRだからベクトルでやれやという話になる。あとやっぱFizzBuzzなのでワンライナーの縛りくらい入れろやという話になるのは当然の流れだろう。
ベクトルで出力していいのなら話は簡単で、ベクトルに対する条件判定ができるifelseを使えば良い。

# ベクトルで出力
ifelse(!(i=1:100)%%15,"FizzBuzz",ifelse(!i%%3,"Fizz",ifelse(!i%%5,"Buzz",i)))

やっぱり1行ごとに改行して表示しなければFizzBuzzではないだろう、ということになればcatで包む。

# cat使用
cat(ifelse(!(i=1:100)%%15,"FizzBuzz\n",ifelse(!i%%3,"Fizz\n",ifelse(!i%%5,"Buzz\n",paste(i,"\n",sep="")))))

for使ってしまうけど書いて消す法を用いれば15で割らないワンライナーも書ける。

# 15で割らない(書いて消す)
for(i in 1:100)cat(paste(i,"\r",if(!i%%3){"Fizz"},if(!i%%5){"Buzz"},"\n",sep=""))

もっと短い、Elegant、気持ちの悪い解答お待ちしております。