Over-enginnered Fizz Buzz
Intentionally bad code to highlight some common problemsunknown
javascript
4 months ago
2.2 kB
5
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