Skip to content

Instantly share code, notes, and snippets.

@agudulin
Created November 29, 2018 14:13
Show Gist options
  • Save agudulin/7f2d0efd5bbc237a597861dc36b9e369 to your computer and use it in GitHub Desktop.
Save agudulin/7f2d0efd5bbc237a597861dc36b9e369 to your computer and use it in GitHub Desktop.
function willThereEverBeARainbow(string) {
const rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet'].join('').toUpperCase();
const characterFrequencyMap = (str) => str.split('').reduce((acc, letter) => {
return Object.assign({}, acc, {
[letter]: acc[letter] ? acc[letter] + 1 : 1
});
}, {});
const expectedLettersMap = characterFrequencyMap(rainbow); // => { R: 3, E: 7, D:2, ... }
const inputLettersMap = characterFrequencyMap(string);
const tooShort = string.length < rainbow.length;
if (tooShort) return 'Too short for a rainbow!';
const noRainbow = Object.keys(expectedLettersMap).some((key) => !inputLettersMap[key] || inputLettersMap[key] < expectedLettersMap[key]);
if (noRainbow) return 'No rainbow to be found!';
const double = Object.keys(expectedLettersMap).every((key) => inputLettersMap[key] >= expectedLettersMap[key] * 2);
if (double) return 'Double rainbow all the way!';
const normal = Object.keys(expectedLettersMap).every((key) => inputLettersMap[key] >= expectedLettersMap[key]);
if (normal) return 'Look! A rainbow!';
}
// test cases
Test.assertEquals(willThereEverBeARainbow('REDORANGEYELLOWGREENBLUEINDIGOVIOLET'), 'Look! A rainbow!');
Test.assertEquals(willThereEverBeARainbow('EDORANGEYELLOWGREENBLUEINDIGOVIOLET'), 'Too short for a rainbow!');
Test.assertEquals(willThereEverBeARainbow('EORECDIDSEPYKWNTQVAZIESJKEOOBCCQNHQEJOXJRGLULRPGEGSN'), 'No rainbow to be found!');
Test.assertEquals(willThereEverBeARainbow('REDORANGEYELLOWGREENBLUEINDIGOVIOLETREDORANGEYELLOWGREENBLUEINDIGOVIOLET'), 'Double rainbow all the way!');
Test.assertEquals(willThereEverBeARainbow('JDOIDNRETNMLLEFLORAUOHIIVLTRZRAYBEENGESCGUDEPKOENGIVYWLGBQXOE'), 'Look! A rainbow!');
Test.assertEquals(willThereEverBeARainbow('LQUEXEEARELNEPOIEBWVTYNIVEGZOLELDOIEOEAADLDTGSDREOORYNGNRNEGRENELROLYNVUODBOKCWILEUFHIGIBIJGMGTLR'), 'Double rainbow all the way!');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment