すごい今更感。
普通に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、気持ちの悪い解答お待ちしております。