話題の「FizzBuzzクイズ」というものに挑戦した。
皆さんRubyで書かれているが、自分の大好きなR言語で書いた。
趣旨がずれている気がしないでもない。
library(magrittr)
FizzBuzz <- function() {
n <- NULL
func_maker <- function(m, word) {
function(x) {
if (is.numeric(x)) {
n <<- x
if (n %% m == 0) return(word)
return(n)
}
if (n %% m == 0) return(paste(x, word, sep=""))
return(x)
}
}
fizz <- func_maker(3, "Fizz")
buzz <- func_maker(5, "Buzz")
pezz <- func_maker(7, "Pezz")
environment()
}
FB <- FizzBuzz()
attach(FB)
動作確認
1 %>% fizz %>% buzz ## [1] 1
3 %>% fizz %>% buzz ## [1] "Fizz"
5 %>% fizz %>% buzz ## [1] "Buzz"
15 %>% fizz %>% buzz ## [1] "FizzBuzz"
15 %>% buzz %>% fizz ## [1] "BuzzFizz"
7 %>% fizz %>% buzz %>% pezz ## [1] "Pezz"
21 %>% fizz %>% buzz %>% pezz ## [1] "FizzPezz"
35 %>% fizz %>% buzz %>% pezz ## [1] "BuzzPezz"
105 %>% fizz %>% buzz %>% pezz ## [1] "FizzBuzzPezz"
105 %>% fizz %>% pezz %>% buzz ## [1] "FizzPezzBuzz"
105 %>% pezz %>% buzz %>% fizz ## [1] "PezzBuzzFizz"
1 %>% fizz %>% buzz %>% pezz ## [1] 1
3 %>% fizz %>% buzz %>% pezz ## [1] "Fizz"
5 %>% fizz %>% buzz %>% pezz ## [1] "Buzz"
15 %>% fizz %>% buzz %>% pezz ## [1] "FizzBuzz"
15 %>% buzz %>% fizz %>% pezz ## [1] "BuzzFizz"
104 %>% fizz %>% buzz %>% pezz ## [1] 104
要件確認
- ここで求めているのはメソッドの返値(文字列もしくは数値そのまま)であり、標準出力等への出力ではない。 ==> ok.
- グローバル変数は使わないことが望ましい。 ==> 環境内に共有の変数を置く方式・・・ギリギリアウト?
- 余力があれば、7の倍数を与えると"Pezz"を返し、かつfizzやbuzzと同様に振る舞うpezzメソッドの追加拡張を実際に試し、それが最小限のコード変更で可能であるように設計や枠組みの工夫があればなお良い。 ==> 一応、1行で追加可能
感想
- 結局、引数の型で場合分けする方法しか思いつかなかった。
- 拡張しやすいように(Pezzの追加)、関数生成器を定義した。これはR言語では常套手段だと思う。