JavaScriptでfizzbuzzいろいろやってみた

新人研修用に作っていたやつ。






よく見る解法1 単純な分岐


単純にif文で分岐しているやりかた。

var NUM = 100 + 1

console.log("")
console.log(`-- case1 -----------------`)

for (var i = 1; i < NUM; i++) {
  if (i % 15 === 0) {
    console.log("fizzbuzz")
  } else if (i % 3 === 0) {
    console.log("fizz")
  } else if (i % 5 === 0) {
    console.log("buzz")
  } else {
    console.log(i);
  }
}



よく見る解法2 分岐を少なく


条件式を少なくするというアプローチ。

var NUM = 100 + 1

for (var i = 1; i < NUM; i++) {
  var output = ""
  if (i % 3 === 0) {
    output += "fizz"
  }
  if (i % 5 === 0) {
    output += "buzz"
  }
  if (output === "") {
    output += i
  }
  console.log(output)

}

output宣言時はnullでもいいし何なら何も指定せずundefinedにしてもいい。
11行目に関しては if(!output) でも動作する。
今回はプログラム中にnull,undefinedを入れないように、そして比較はかなり厳密に実装している。



配列を使う


1~15までで一巡するので15の余剰を出して決め撃ちした値へマッピングしようともの。
あんまり見ないけどルール(ロジック)が変数1つで決まるので個人的には結構気に入ってる。


console.log("")
console.log(`-- case3 -----------------`)
var NUM = 100 + 1


var MAP = [
  "", "", "fizz", "", "buzz",
  "fizz", "", "", "fizz", "buzz",
  "", "fizz", "", "", "fizzbuzz",
]

for (var i = 1; i < NUM; i++) {
  var output = MAP[(i - 1) % 15]

  if (output === "") {
    output = i
  }
  console.log(output)

}




再帰でfizzbuzz


検索して最初にでてくるのがバグっているのはどうなのか(しかも再帰が一番シンプルでいいですねとか書いちゃってるし)
条件分岐はswitchで書いてみたけど可読性はそれほど良くならなかった。

var NUM = 100 + 1
console.log("")
console.log(`-- case4 -----------------`)

function fizzbuzz(n, end) {

  if (n === end) {
    return
  } else {
    var temp = n % 15
    switch (temp) {
      case 0:
        console.log("fizzbuzz")
        break;

      case 3:
      case 6:
      case 9:
      case 12:
        console.log("fizz")
        break;

      case 5:
      case 10:
        console.log("buzz")
        break;

      default:
        console.log(n);
        break;
    }
    fizzbuzz(n + 1, end)
  }

}
fizzbuzz(1, NUM)


この手のfor文を置き換えるタイプの再帰はPromise(async/await)が使えないJavaScriptの非同期処理で使用したりする。


2018年8月9日木曜日