Over-enginnered Fizz Buzz
Intentionally bad code to highlight some common problemsunknown
javascript
a year ago
2.2 kB
6
Indexable
function isFizz(num) {
return num % 3 === 0;
}
function isBuzz(num) {
return num % 5 === 0;
}
function isFizzBuzz(num) {
return isFizz(num) && isBuzz(num);
}
function fizzBuzzValue(num) {
// DRY!
const COMMON_SUFFIX = 'zz';
const FIZZ = `Fi${COMMON_SUFFIX}`;
const BUZZ = `Bu${COMMON_SUFFIX}`;
// Return in priority order!
switch(true) {
case isFizzBuzz(num): return `${FIZZ}${BUZZ}`;
case isFizz(num): return FIZZ;
case isBuzz(num): return BUZZ;
default: return `${num}`;
}
}
// Cache results so we never have to calculate the same value more than once!
let numberToStringFactory;
function registerNumberToStringFactoryEntry(num, str) {
numberToStringFactory[num] = str;
}
function buildFizzBuzzData(num) {
if (numberToStringFactory && numberToStringFactory.length > num) {
return;
}
let start = 0;
if (!numberToStringFactory) {
numberToStringFactory = new Array(num);
}
else {
const currentFactoryLength = numberToStringFactory.length;
const numberOfNewEntriesToCalculate = num - currentFactoryLength;
numberToStringFactory = [...numberToStringFactory, ...new Array(numberOfNewEntriesToCalculate)];
start = currentFactoryLength;
}
for (let i = start; i < num; i++) {
registerNumberToStringFactoryEntry(i, fizzBuzzValue(i))
}
}
function* fizzBuzzGenerator(start, num) {
buildFizzBuzzData(num);
let index = start;
while (index < num) {
yield numberToStringFactory[index];
index++;
}
}
function generateFizzBuzzResultsInFourBatches(batchSize0, batchSize1, batchSize2, batchSize3) {
// TODO scale this to any number of batches. Use a loop?
return [
...fizzBuzzGenerator(1 /* skip zero */, batchSize0),
...fizzBuzzGenerator(batchSize0, batchSize0 + batchSize1),
...fizzBuzzGenerator(batchSize0 + batchSize1, batchSize0 + batchSize1 + batchSize2),
...fizzBuzzGenerator(batchSize0 + batchSize1 + batchSize2, batchSize0 + batchSize1 + batchSize2 + batchSize3)];
}
const fizzBuzzData1to100 = generateFizzBuzzResultsInFourBatches(25, 25, 25, 26 /*need one more as only goes from 0 to 99, could increase any of the batch sizes but add to the end for clarity*/);
for(const line of fizzBuzzData1to100) {
console.log(line);
}Editor is loading...
Leave a Comment