PythonでFizzBuzz
PythonのFizzBuzzワンライナーってどんなだったかなと思ってちょっと調べた。
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")
catでsep="" の方が更に一文字短かいんですね.奥深しR.
— atusy (@Atsushi776) March 12, 2019
for(i in 1:100)cat(i,"\r",if(!i%%3)"Fizz",if(!i%%5)"Buzz","\n",sep="")
過去の自分の記事見たり@Atsushi776さんの案見たりしながら考えたらもっと短く出来た。
for(i in 1:100)cat(i,"\r","Fizz"[!i%%3],"Buzz"[!i%%5],"\n",sep="")