LoginSignup
2
0

More than 5 years have passed since last update.

「FizzBuzzクイズ」をRで書くと

Last updated at Posted at 2017-09-25

話題の「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言語では常套手段だと思う。
2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0