RでFizzBuzz

PythonFizzBuzz

PythonFizzBuzzワンライナーってどんなだったかなと思ってちょっと調べた。

for i in range(100):print(i%3//2*"Fizz"+i%5//4*"Buzz"or-~i)

最後の-~って何だと思ったら~はビット反転だった。2の補数、はるか昔に基本情報でやった記憶がうっすらと…

(参考: FizzBuzzを1byteで実装する - Qiita

RでFizzBuzz

Pythonの方法を真似ればRでもFizzBuzz短く書けるのでは…?と思ってやってみた。

cat(ifelse(""==(.=paste0(ifelse((i=0:99)%%3%/%2,"Fizz",""),ifelse(i%%5%/%4,"Buzz",""))),i+1,.),sep="\n")

少し考えて気付いたが、判定にifelse使ってるし別にTRUEのときに文字列を吐く事にこだわる必要は無い。

cat(ifelse(""==(.=paste0(ifelse((i=1:100)%%3,"","Fizz"),ifelse(i%%5,"","Buzz"))),i,.),sep="\n")

もう少し考えて気付いたが、そういえば関数も代入可能だった。代入と同時に使っても良かろう、で、こうなった。

cat((f=ifelse)(""==(.=paste0(f((i=1:100)%%3,"","Fizz"),f(i%%5,"","Buzz"))),i,.),sep="\n")

もっと短くならないかな…


普通に分けて書いたほうが短かった…

i=j=1:100;i[j%%3==0]="Fizz";i[j%%5==0]="Buzz";i[j%%15==0]="FizzBuzz";cat(i,sep="\n")

まだいけるぞ。もう無理か?

i=j=1:100;i[!j%%3]="Fizz";i[!j%%5]="Buzz";i[!j%%15]="FizzBuzz";cat(i,sep="\n")

過去の自分の記事見たり@Atsushi776さんの案見たりしながら考えたらもっと短く出来た。

for(i in 1:100)cat(i,"\r","Fizz"[!i%%3],"Buzz"[!i%%5],"\n",sep="")