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

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






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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 分岐を少なく


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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つで決まるので個人的には結構気に入ってる。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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で書いてみたけど可読性はそれほど良くならなかった。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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日木曜日