Fizz-Buzz問題

元ネタは「どうしてプログラマに・・・プログラムが書けないのか?」なのですが、はてなブックマークRjpwikiでも話題になっていました

矢野が統計解析言語Rで書いた場合:


fizzbuzz <- function(loopMax=100)
{
for(jj in 1:loopMax){
if ( (jj%%3==0) && (jj%%5==0)){
cat("FizzBuzz\n") #old code for check : cat(jj,"FizzBuzz\n")
} else if(jj%%3==0){
cat("Fizz\n") #old code for check : cat(jj,"Fizz\n")
} else if(jj%%5==0){
cat("Buzz\n") # old code for check: cat(jj, "Buzz\n")
} else {
cat(jj,"\n")
}
}
}
え?なんでこんなカッコ悪いプログラムを書くかって?半年経ってからも読んですぐに分かるからです。

[補足] マイナー言語によるFizzBuzz問題解集(永字八法)
永字八法さんによるマイナー言語でのプログラム集。Lispなどの「メジャー」な言語に混じって、どマイナーなRも載せていただいています。
http://d.hatena.ne.jp/eiji8pou/20070509/1178718424

以下、Fizz-Buzz問題とは直接は関係ない余談です。
[余談]
こんな風に考えるのは矢野だけかもしれませんが、何かアルゴリズムをプログラムにする場合、(1) 最初は分かりやすくて確実に動くプログラムを書いて、(2) さらに「プログラムの処理速度が求められる」などの事情があればそれにあわせて後で直せばいい、と思います。

矢野は3年ほど「電話会社でフレームリレー交換機を開発していた」という(ちょっと変わった)経験があるのですが、その時のいろいろな経験から、このやり方が(長い目で見れば)一番確実で効率的なのではないかと思うようになりました(ただ、これは人によって意見が異なるのではないかと思います)。

これだけだと「偉そうに書いているけど、実際には単に頭が悪くてプログラミングテクニックが使えないだけなんじゃないか?」と思われるかもしれないので、Rっぽい(?)テクニックを使ったプログラムも書いておきます。


fizzbuzz2 <- function(loopMax=100)
{
numbers <- 1:loopMax
index <- 1:loopMax
numbers[(index%%3==0)&(index%%5==0)] <- "FizzBuzz"
numbers[index%%3==0&(!(index%%5==0))] <- "Fizz"
numbers[(!(index%%3==0))&index%%5==0] <- "Buzz"
return(numbers)
}
二つ目のプログラムではRっぽさを出すためにわざとforループやif文を駆逐してみました*1

場合によっては「このようなテクニックが使えること」が必要なことはあるのですが、「常に必要という訳ではない」と思っています。

*1:これはRが「ベクトル化言語」だから出来るテクニックですが、実際にやっていることをよく見るとforループやif文に当たる処理がなくなったわけではないことが分かります。「見かけ上、出てこない」だけです。