こんにちは、VOYAGE GROUPの水越(@Akiyah)です。
いま話題のFizzBuzz問題をデータ解析環境「R」で書いてみました。
メインの参考ページはここです。
FizzBuzz問題を使って社内プログラミングコンテストを開催してみた - ITは芸術だ
このファイルをfizzbuzz.rというファイルに保存して、Rscriptコマンドで実行します。(この記事書くまでRファイルをコマンドラインから実行する方法を知りませんでした! Rでは環境に入って作業するのが普通なのです。)
さて、Rらしく変更してみます。
ちょっと解説しますね。Rのベクトル(配列みたいなものです)はまとめて演算したり、条件を判断して新しいベクトルを作ることができます。下記はRコマンドでRの実行環境に移動して試しています。
参考
・The R Project for Statistical Computing
・FizzBuzz問題を使って社内プログラミングコンテストを開催してみた - ITは芸術だ
・FizzBuzz問題をJavaScriptで - jsdo.it - Share JavaScript, HTML5 and CSS
・Fizz-Buzz問題 初級Q&A アーカイブ(7) - RjpWiki
いま話題のFizzBuzz問題をデータ解析環境「R」で書いてみました。
メインの参考ページはここです。
FizzBuzz問題を使って社内プログラミングコンテストを開催してみた - ITは芸術だ
仕様まずは上記のページで紹介されているperl版をほぼそのままRに移植してみます。
・1から順番に数をコマンドプロンプト/ターミナルに表示する。
・その数が3で割り切れるなら"Fizz“
・5で割り切れるなら"Buzz“
・両方で割り切れるなら"FizzBuzz"と表示する。
Rというなじみのない言語ですが、コードはいたって普通ですね。<-は代入で、catは画面表示する関数です。args <- commandArgs()endval <- args[6]for (i in 1:endval) {fizz = i %% 3buzz = i %% 5if (fizz == 0 && buzz == 0) {cat("FizzBuzz")}else if (fizz == 0) {cat("Fizz")}else if (buzz == 0) {cat("Buzz")}else {cat(i)}cat("\n")}
このファイルをfizzbuzz.rというファイルに保存して、Rscriptコマンドで実行します。(この記事書くまでRファイルをコマンドラインから実行する方法を知りませんでした! Rでは環境に入って作業するのが普通なのです。)
$ Rscript fizzbuzz.r 20 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzzもとのperl版からほとんど変えずに動きました。よかったよかった。
さて、Rらしく変更してみます。
だいぶ短くなりましたね。実行結果はまったく同じです。args <- commandArgs()endval <- args[6] i <- 1:endval x <- i x[i%%3==0] <- "Fizz" x[i%%5==0] <- "Buzz" x[i%%3==0 & i%%5==0] <- "FizzBuzz" cat(paste(x, collapse="\n")) cat("\n")
ちょっと解説しますね。Rのベクトル(配列みたいなものです)はまとめて演算したり、条件を判断して新しいベクトルを作ることができます。下記はRコマンドでRの実行環境に移動して試しています。
> i <- 1:20 > i [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 > i%%3 [1] 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 > i%%3==0 [1] FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE [13] FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSEそしてベクトルの[ ](インデックス)にベクトルを入れたり、それをつかって<-でまとめて値を変更したりできるのです。
> x <- 1:20 > x[i%%3==0] [1] 3 6 9 12 15 18 > x[i%%3==0] <- "Fizz" > x [1] "1" "2" "Fizz" "4" "5" "Fizz" "7" "8" "Fizz" "10" [11] "11" "Fizz" "13" "14" "Fizz" "16" "17" "Fizz" "19" "20"このベクトル操作を利用して、ベクトルの3、5、15の倍数の時の値を変更したのです。実は『FizzBuzz R』で検索するとたくさん見つかって、R業界ではFizzBuzz問題は有名みたいです。上に書いた例と同様のコードも見つかりました。考えてみると、FizzBuzz問題はRの得意分野なんですよね。
参考
・The R Project for Statistical Computing
・FizzBuzz問題を使って社内プログラミングコンテストを開催してみた - ITは芸術だ
・FizzBuzz問題をJavaScriptで - jsdo.it - Share JavaScript, HTML5 and CSS
・Fizz-Buzz問題 初級Q&A アーカイブ(7) - RjpWiki