RでFizzBuzz問題を高速化
「裏 RjpWiki」で「R らしく FizzBuzz」と言うエントリーがあるのですが、ワンライナーですっきりしていますが、速度的にちょっと彼らしくない書き方になっています。
ifelse()を減らせば、もっと速度が改善しますよ。手元の計測では裏 RjpWiki版が4.96秒、ifelse()削減版が2.09秒でした。
### 100万回演算 ###
i <- 1:1000000### 裏 RjpWiki版 ###
gc(); gc()
system.time({
r1 <- ifelse(i %% 15 == 0, "FizzBuzz", ifelse(i %% 3 == 0, "Fizz", ifelse(i %% 5 == 0, "Buzz", i)))
})### ifelse関数を減らした版 ###
gc(); gc()
system.time({
l <- c("", "Fizz", "Buzz", "FizzBuzz")
ii <- (0==i%%5)*2 + (0==i%%3)*1 + 1
r2 <- ifelse(1<ii, l[ii], i)
})### 計算結果が同一なのを確認 ###
all(r1==r2)