Over-enginnered Fizz Buzz

Intentionally bad code to highlight some common problems
 avatar
unknown
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