function FizzBuzz(n, patterns = [{ pred: (v) => v % 3 === 0, str: "Fizz" },
{ pred: (v) => v % 5 === 0, str: "Buzz" }]) {
return Array.from(new Array(n)).map((_, i) =>
[i + 1,
patterns.map((p) => ["", p.str][+p.pred(i + 1)]).join("")
][+patterns.some((p) => p.pred(i + 1))]
).join("\n");
}
console.log(FizzBuzz(15));
console.log("==========");
console.log(FizzBuzz(15, [
{ pred: (v) => v % 3 === 0, str: "Fizz" },
{ pred: (v) => v % 5 === 0, str: "Buzz" },
{ pred: (v) => v % 7 === 0, str: "Quzz" },
{ pred: (v) => v % 11 === 0, str: "Kass" },
]));
console.log("==========");
console.log(FizzBuzz(15, [
{ pred: (v) => (v.toString() + (v % 3 + 3)).indexOf("3") >= 0, str: "Aho" },
{ pred: (v) => v % 5 === 0, str: "Buzz" },
]));
console.log("==========");
console.log(FizzBuzz(15, [
{ pred: (v) => (v.toString() + (v % 3 + 3)).indexOf("3") >= 0, str: "Aho" },
{ pred: (v) => v % 5 === 0, str: "Buzz" },
{ pred: (v) => v % 7 === 0, str: "Quzz" },
{ pred: (v) => v % 11 === 0, str: "Kass" },
]));
ZnVuY3Rpb24gRml6ekJ1enoobiwgcGF0dGVybnMgPSBbeyBwcmVkOiAodikgPT4gdiAlIDMgPT09IDAsIHN0cjogIkZpenoiIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJlZDogKHYpID0+IHYgJSA1ID09PSAwLCBzdHI6ICJCdXp6IiB9XSkgewogIHJldHVybiBBcnJheS5mcm9tKG5ldyBBcnJheShuKSkubWFwKChfLCBpKSA9PiAKICAgIFtpICsgMSwKICAgICBwYXR0ZXJucy5tYXAoKHApID0+IFsiIiwgcC5zdHJdWytwLnByZWQoaSArIDEpXSkuam9pbigiIikKICAgIF1bK3BhdHRlcm5zLnNvbWUoKHApID0+IHAucHJlZChpICsgMSkpXQogICkuam9pbigiXG4iKTsKfQoKY29uc29sZS5sb2coRml6ekJ1enooMTUpKTsKY29uc29sZS5sb2coIj09PT09PT09PT0iKTsKY29uc29sZS5sb2coRml6ekJ1enooMTUsIFsKICB7IHByZWQ6ICh2KSA9PiB2ICUgMyA9PT0gMCwgc3RyOiAiRml6eiIgfSwKICB7IHByZWQ6ICh2KSA9PiB2ICUgNSA9PT0gMCwgc3RyOiAiQnV6eiIgfSwKICB7IHByZWQ6ICh2KSA9PiB2ICUgNyA9PT0gMCwgc3RyOiAiUXV6eiIgfSwKICB7IHByZWQ6ICh2KSA9PiB2ICUgMTEgPT09IDAsIHN0cjogIkthc3MiIH0sCl0pKTsKY29uc29sZS5sb2coIj09PT09PT09PT0iKTsKY29uc29sZS5sb2coRml6ekJ1enooMTUsIFsKICB7IHByZWQ6ICh2KSA9PiAodi50b1N0cmluZygpICsgKHYgJSAzICsgMykpLmluZGV4T2YoIjMiKSA+PSAwLCBzdHI6ICJBaG8iIH0sCiAgeyBwcmVkOiAodikgPT4gdiAlIDUgPT09IDAsIHN0cjogIkJ1enoiIH0sCl0pKTsKY29uc29sZS5sb2coIj09PT09PT09PT0iKTsKY29uc29sZS5sb2coRml6ekJ1enooMTUsIFsKICB7IHByZWQ6ICh2KSA9PiAodi50b1N0cmluZygpICsgKHYgJSAzICsgMykpLmluZGV4T2YoIjMiKSA+PSAwLCBzdHI6ICJBaG8iIH0sCiAgeyBwcmVkOiAodikgPT4gdiAlIDUgPT09IDAsIHN0cjogIkJ1enoiIH0sCiAgeyBwcmVkOiAodikgPT4gdiAlIDcgPT09IDAsIHN0cjogIlF1enoiIH0sCiAgeyBwcmVkOiAodikgPT4gdiAlIDExID09PSAwLCBzdHI6ICJLYXNzIiB9LApdKSk7Cg==