FibBuzz (not FizzBuzz) in JavaScript
[FizzBuzz は時代遅れらしいので FibBuzz を発案します | cod.note http://codnote.net/2011/10/13/fibbuzz/ ]
buzzfib()
fibbuzz()FibBuzz (最新版): フィボナッチ数ではない数はスキップする形,つまりフィボナッチ数だけでfizzbuzzをしてください. #fibbuzz #FibonacciBuzz
(function (scope) { 'use strict'; var _fibmemo = [0, 1]; function _fib (num) { var i; if (_fibmemo[num] === void 0) { for (i = _fibmemo.length; i <= num; i += 1) { _fibmemo[i] = _fibmemo[i - 2] + _fibmemo[i - 1]; } } return _fibmemo[num]; } function _FibIter (num) { if (!(this instanceof _FibIter)) { return new _FibIter(); } this.idx = Number(num) || 0; if (this.idx < 0) { throw Error('arguments[0] must larger then +0.'); } } _FibIter.prototype = { current: function () { return _fib(this.idx); }, next: function () { this.idx += 1; return this.current(); } } function buzzfib (num) { var result = [], i, p, iter = new _FibIter(1); for (i = 1; i <= num; i += 1) { p = ''; i === iter.current() && (p += 'Fib'); i % 5 || (p += 'Buzz'); result.push(p || i); while (iter.current() <= i) { iter.next(); } } return result; } function fibbuzz (num) { var result = [], i, p, iter = new _FibIter(1); for (i = 0; i < num; i += 1, iter.next()) { p = ''; iter.current() % 3 || (p += 'Fib'); iter.current() % 5 || (p += 'Buzz'); result.push(p || i); } return result; } scope.buzzfib = buzzfib; scope.fibbuzz = fibbuzz; }(this)); console.log(buzzfib(100)); console.log(fibbuzz(100));
効率あんま気にしてない。きちゃない。イテレータ作る意味がわかってない。