Skip to content

Instantly share code, notes, and snippets.

@katai5plate
Last active May 23, 2019 14:05
Show Gist options
  • Save katai5plate/4a55a53e2c957f71bcd9bfe0b446d6ab to your computer and use it in GitHub Desktop.
Save katai5plate/4a55a53e2c957f71bcd9bfe0b446d6ab to your computer and use it in GitHub Desktop.
FizzBuzz問題の回答例
/**
* FizzBuzzプログラム
*/
const fizzbuzz = n => {
if (!Number.isInteger(n) || n < 0) throw new Error("0以上の数値じゃないすよ");
const print = (value, div, text) => (value % div === 0 ? text : "");
return [...new Array(n).keys()].map(
num => `${print(num, 3, "Fizz")}${print(num, 5, "Buzz")}` || num
);
};
/**
* FizzBuzzプログラムが正しく動作するかをチェックするプログラム
*/
(() => {
// a(結果) === b(期待値) でない場合エラー
const checkEqual = (scenario, a, b) => {
if (JSON.stringify(a) !== JSON.stringify(b)) throw new Error(scenario);
return true;
};
// エラー発生しなければエラー
const checkError = (scenario, callback) => {
try {
callback();
} catch {
return true;
}
throw new Error(scenario);
};
// テスト
try {
checkEqual("引数が 4 の場合、正しい答え", fizzbuzz(4), ["FizzBuzz", 1, 2, "Fizz"]);
checkEqual("引数が 0 の場合、空の配列", fizzbuzz(0), []);
checkEqual("0 番目は、FizzBuzz", fizzbuzz(20)[0], "FizzBuzz");
checkEqual("3 番目は、Fizz", fizzbuzz(20)[3], "Fizz");
checkEqual("5 番目は、Buzz", fizzbuzz(20)[5], "Buzz");
checkEqual("15 番目は、FizzBuzz", fizzbuzz(20)[15], "FizzBuzz");
checkError("引数がない場合、エラー", () => fizzbuzz());
checkError("引数が undefined の場合、エラー", () => fizzbuzz(undefined));
checkError("引数が null の場合、エラー", () => fizzbuzz(null));
checkError("引数が NaN の場合、エラー", () => fizzbuzz(NaN));
checkError("引数が 実数 の場合、エラー", () => fizzbuzz(3.1415));
checkError("引数が 文字列 の場合、エラー", () => fizzbuzz("松茸のお吸い物"));
checkError("引数が 無限大 の場合、エラー", () => fizzbuzz(Infinity));
checkError("引数が 配列 の場合、エラー", () => fizzbuzz([1, 2, 3]));
checkError("引数が オブジェクト の場合、エラー", () => fizzbuzz({ abc: "xyz" }));
checkError("引数が 関数 の場合、エラー", () => fizzbuzz(() => {}));
} catch (error) {
throw new Error(`バグってんだろ!(激怒) -> ${error}`);
}
console.log("バグは見つからんかったで");
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment