Solutions to FreeCodeCamp Challenges
See http://www.freecodecamp.com/abhisekp
ShortUrl to Gist: http://j.mp/abhisekpFCCSolns
One Liner Solutions Only: http://j.mp/abhisekpFCCSolnsOneLiners
Solved using RegExp: http://bit.ly/abhisekpFCCRegExpSolns
See http://www.freecodecamp.com/abhisekp
ShortUrl to Gist: http://j.mp/abhisekpFCCSolns
One Liner Solutions Only: http://j.mp/abhisekpFCCSolnsOneLiners
Solved using RegExp: http://bit.ly/abhisekpFCCRegExpSolns
function meetBonfire(argument) { | |
// Good luck! | |
console.log("you can read this function's argument in the developer tools", argument); | |
return true; | |
} | |
meetBonfire("You can do this!"); |
function telephoneCheck(str) { | |
// Good luck! | |
// I'm feeling lucky today! | |
return /^(1)?(((?:\s*\(\s*)(\d{3})(?:\s*\)\s*))|((\s*|-)\d{3}(\s*|-)))(\d{3})(\s*-?\s*)(\d{4})$/.test(str); | |
} | |
telephoneCheck("555-555-5555"); |
function reverseString(str) { | |
return str.split("").reverse().join(""); | |
} | |
reverseString('hello'); |
function factorialize(num) { | |
return (num < 2) ? 1 : (num * factorialize(num - 1)); | |
} | |
factorialize(5); |
function factorialize(num) { | |
var fact = 1; | |
while(num) { fact *= num--; } | |
return fact; | |
} | |
factorialize(5); |
var romanPair = { | |
1: 'I', | |
5: 'V', | |
10: 'X', | |
50: 'L', | |
100: 'C', | |
500: 'D', | |
1000: 'M' | |
}; | |
// all bases as number sorted in ascending order | |
var romanBases = Object.keys(romanPair).sort(function (a, b) { | |
return a - b; | |
}).map(function (base) { | |
return Number(base); | |
}); | |
// console.log('romanBases:', romanBases); | |
var minRomanBase = Math.min.apply(null, romanBases); | |
var maxRomanBase = Math.max.apply(null, romanBases); | |
function convert(num) { | |
// console.log('num:', num); | |
if (num < minRomanBase || num > maxRomanBase) { | |
if (num === 0) { | |
return 'Zero (0) was discovered later by Aryabhata (Indian Mathematician).'; | |
} | |
else if (num > maxRomanBase) { | |
return 'Romans were too tired to extend their number system.' | |
} | |
return 'You should definitely consider using the modern decimal number system.'; | |
} | |
if (romanPair[num]) { | |
return romanPair[num]; | |
} | |
var baseInset = 1, | |
tempBase = 1; | |
romanBases.forEach(function (base, i) { | |
if (num > base) { | |
// check if the base is either 1, 10, 100 or 1000 | |
if (Math.log10(base) % 1 === 0) { | |
// find the baseInset value | |
baseInset = base; | |
} | |
if (romanBases[i + 1] - num <= baseInset) { | |
// assign the tempBase to the next romanBase | |
tempBase = romanBases[i + 1]; | |
} | |
else { | |
// assign the tempBase to the current romanBase | |
tempBase = base; | |
} | |
} | |
}); | |
// console.log('baseInset:', baseInset); | |
// console.log('tempBase:', tempBase); | |
var diff = 0, | |
romanNum; | |
// if number is > a roman tempBase | |
if (num > tempBase) { | |
diff = num - tempBase; | |
// console.log('diff:', diff); | |
romanNum = convert(tempBase) + convert(diff); | |
} | |
else { // fixme | |
diff = num - (tempBase - baseInset); | |
// console.log('diff:', diff); | |
romanNum = convert(baseInset) + convert(tempBase) + (diff ? convert(diff) : ''); | |
} | |
return romanNum; | |
} | |
convert(36); |
function palindrome(str) { | |
str = str.toLowerCase().replace(/[\W_]/g, ''); | |
for(var i = 0, len = str.length - 1; i < len/2; i++) { | |
if(str[i] !== str[len-i]) { | |
return false; | |
} | |
} | |
return true; | |
} | |
palindrome("eye"); |
function palindrome(str) { | |
return (str = str.toLowerCase().replace(/\W|_/g, '')) === str.split('').reverse().join(''); | |
} | |
palindrome("0_0 (: /-\\ :) 0-0"); |
function where(collection, source) { | |
// "What's in a name? that which we call a rose | |
// By any other name would smell as sweet.” | |
// -- by William Shakespeare, Romeo and Juliet | |
var srcKeys = Object.keys(source); | |
// filter the collection | |
return collection.filter(function (obj) { | |
// return a Boolean value for filter callback using reduce method | |
return srcKeys.reduce(function (res, key) { | |
// reduce to Boolean value to be returned by reduce method | |
return obj.hasOwnProperty(key) && obj[key] === source[key]; | |
}, false); | |
}); | |
} | |
where([{ first: 'Romeo', last: 'Montague' }, { first: 'Mercutio', last: null }, { first: 'Tybalt', last: 'Capulet' }], { last: 'Capulet' }); |
function where(collection, source) { | |
// "What's in a name? that which we call a rose | |
// By any other name would smell as sweet.” | |
// -- by William Shakespeare, Romeo and Juliet | |
var srcKeys = Object.keys(source); | |
// filter the collection | |
return collection.filter(function (obj) { | |
for(var i = 0; i < srcKeys.length; i++) { | |
// check if obj in collection doesn't have the key | |
// or if it does have the key, | |
// then check if the property value doesn't match the value in source | |
if(!obj.hasOwnProperty(srcKeys[i]) || obj[srcKeys[i]] !== source[srcKeys[i]]) { | |
return false; | |
} | |
} | |
return true; | |
}); | |
} | |
where([{ first: 'Romeo', last: 'Montague' }, { first: 'Mercutio', last: null }, { first: 'Tybalt', last: 'Capulet' }], { last: 'Capulet' }); |
function where(collection, source) { | |
// "What's in a name? that which we call a rose | |
// By any other name would smell as sweet.” | |
// -- by William Shakespeare, Romeo and Juliet | |
var srcKeys = Object.keys(source); | |
// filter the collection | |
return collection.filter(function (obj) { | |
// return a Boolean value for `filter` method | |
return srcKeys.every(function (key) { | |
// reduce to Boolean value to be returned for `every` method | |
return obj.hasOwnProperty(key) && obj[key] === source[key]; | |
}); | |
}); | |
} | |
where([{ first: 'Romeo', last: 'Montague' }, { first: 'Mercutio', last: null }, { first: 'Tybalt', last: 'Capulet' }], { last: 'Capulet' }); |
function findLongestWord(str) { | |
var maxWordLength = 0, | |
words = str.split(' '); | |
for(var i = 0, len = words.length; i < len; i++) { | |
if(words[i].length > maxWordLength) { | |
maxWordLength = words[i].length; | |
} | |
} | |
return maxWordLength; | |
} | |
findLongestWord('The quick brown fox jumped over the lazy dog'); |
function findLongestWord(str) { | |
var maxWordLength = 0, | |
words = str.split(' '); | |
maxWordLength = words.reduce(function(max, curr) { | |
return curr.length > max ? curr.length : max; | |
}, 0); | |
return maxWordLength; | |
} | |
findLongestWord('The quick brown fox jumped over the lazy dog'); |
function findLongestWord(str) { | |
return Math.max(...str.split(' ').map(word => word.length)); | |
} | |
findLongestWord("The quick brown fox jumped over the lazy dog"); |
function myReplace(str, before, after) { | |
var replaced = after; | |
function replacer(before, after) { | |
return after.split('').map(function (afterCh, i) { | |
var beforeCh = before[i]; | |
if (i >= before.length) { | |
return afterCh; | |
} | |
if (beforeCh >= 'a' && beforeCh <= 'z') { | |
return afterCh.toLowerCase(); | |
} | |
else if (beforeCh >= 'A' && beforeCh <= 'Z') { | |
return afterCh.toUpperCase(); | |
} | |
return afterCh; | |
}).join(''); | |
} | |
replaced = str.replace(before, replacer(before, after)); | |
return replaced; | |
} | |
myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped"); | |
// https://repl.it/BRTQ/4 |
function findLongestWord(str) { | |
var maxWordLength = 0, | |
words = str.split(' '); | |
words.forEach(function(curr) { | |
if(curr.length > maxWordLength) { | |
maxWordLength = curr.length; | |
} | |
}); | |
return maxWordLength; | |
} | |
findLongestWord('The quick brown fox jumped over the lazy dog'); |
function titleCase(str) { | |
str = str.toLowerCase(); | |
var words = str.split(' '); | |
for(var i = 0, len = words.length; i < len; i++) { | |
words[i] = words[i][0].toUpperCase() + words[i].substr(1); | |
} | |
str = words.join(' '); | |
return str; | |
} | |
titleCase("I'm a little tea pot"); |
function titleCase(str) { | |
str = str.toLowerCase(); | |
var words = str.split(' '); | |
str = words.map(function (word) { | |
return word[0].toUpperCase() + word.substr(1); | |
}).join(' '); | |
return str; | |
} | |
titleCase("I'm a little tea pot"); |
function titleCase(str) { | |
return str.replace(/(\w)([\w']*)/g, function (match, $1, $2){ | |
return $1.toUpperCase() + $2.toLowerCase(); | |
}); | |
} | |
titleCase("I'm a little tea pot"); |
function titleCase(str) { | |
return str.toLowerCase().replace(/(?: |^)[a-z]/g, (L) => L.toUpperCase()); | |
} | |
titleCase("I'm a little tea pot"); |
function find(array, cb) { | |
/* ES6 Array.prototype.find available */ | |
if(typeof Array.prototype.find !== 'undefined') { | |
return array.find(cb); | |
} | |
// console.log('ES6 Array.prototype.find Unavailable'); | |
for(var index = 0; index < array.length; index++) { | |
var curr = array[index]; | |
var found = cb(curr, index, array); | |
if(found) { | |
var value = array[index]; | |
return value; | |
} | |
} | |
} | |
function nextInCircularArray(array, index) { | |
// console.log('\nindex:', index); | |
// console.log('Given Array:', array); | |
var nextIndex = (index+1) % array.length; | |
// console.log('nextIndex:', nextIndex); | |
return array[nextIndex]; | |
} | |
function pair(DNAstr) { | |
function findPair(pairs, DNA) { | |
return find(pairs, function (pair) { | |
return pair.indexOf(DNA) !== -1; | |
}); | |
} | |
var pairs = [ | |
['A', 'T'], | |
['G', 'C'] | |
]; | |
return [].map.call(DNAstr, function (DNA) { | |
var pair = [DNA]; | |
console.log('DNA:', DNA); | |
var foundPair = findPair(pairs, DNA); | |
console.log('> foundPair:', foundPair); | |
var otherDNA = nextInCircularArray(foundPair, foundPair.indexOf(DNA)); | |
console.log('> otherDNA:', otherDNA); | |
pair.push(otherDNA); | |
return pair; | |
}); | |
} | |
pair("ATCGA"); |
function pair(str) { | |
var pairs = {A:'T', T: 'A', C: 'G', G: 'C'}; | |
return [].map.call(str, function(dna){ | |
return [dna, pairs[dna]]; | |
}); | |
} | |
pair("ATCGA"); |
function largestOfFour(arr) { | |
// You can do this! | |
for(var i = 0; i < arr.length; i++) { | |
var max = arr[i][0]; | |
for(var j = 1; j < arr.length; j++) { | |
if(arr[i][j] > max) { | |
max = arr[i][j]; | |
} | |
} | |
arr[i] = max; | |
} | |
return arr; | |
} | |
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]); |
function largestOfFour(arr) { | |
// You can do this! | |
// Yes, I can. :P | |
return arr.map(Function.apply.bind(Math.max, null)); | |
} | |
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]); |
function end(str, target) { | |
// "Never give up and good luck will find you." | |
// -- Falcor | |
// "I find my own luck!" -- AbhisekP. | |
return target === str.substr(str.length - target.length); | |
} | |
end('Bastian', 'n'); |
function end(str, target) { | |
// "Never give up and good luck will find you." | |
// -- Falcor | |
// "I find my own luck!" -- AbhisekP. | |
return new RegExp(target + '$').test(str); | |
} | |
end('Bastian', 'n'); |
function end(str, target) { | |
// "Never give up and good luck will find you." | |
// -- Falcor | |
// "I find my own luck!" -- AbhisekP. | |
return str.endsWith(target); | |
} | |
end('Bastian', 'n'); |
function end(str, target) { | |
// "Never give up and good luck will find you." | |
// -- Falcor | |
// "I find my own luck!" -- AbhisekP. | |
return str.lastIndexOf(target) === str.length - target.length; | |
} | |
end('Bastian', 'n'); |
function fearNotLetter(str) { | |
var startCode = str.charCodeAt(0); | |
var endCode = str.charCodeAt(str.length-1); | |
if(endCode - startCode + 1 === str.length) { | |
return; | |
} | |
var missing = ''; | |
for(var codeIndex = startCode; codeIndex !== endCode; codeIndex++) { | |
var currChar = String.fromCharCode(codeIndex); | |
if(str.indexOf(currChar) === -1) { | |
missing += currChar; | |
} | |
} | |
return missing; | |
} | |
fearNotLetter("abce"); |
function boo(bool) { | |
// What is the new fad diet for ghost developers? The Boolean. | |
return typof bool === 'boolean'; | |
} | |
boo(null); |
function repeat(str, num) { | |
// repeat after me | |
// am i in class 2 or something? | |
var repeated = ''; | |
while(num-- > 0) { | |
repeated += str; | |
} | |
return repeated; | |
} | |
repeat('abc', 3); |
function repeat(str, num) { | |
// repeat after me | |
// am i in class 2 or something? | |
return num <= 0 ? '': str.repeat(num); | |
} | |
repeat('abc', 3); |
function convert(str) { | |
'use strict'; | |
var htmlEntities = { | |
'\'': ''', | |
'&': '&', | |
'<': '<', | |
'>': '>', | |
'"': '"', | |
get get() { | |
return function (entity) { | |
return this[entity]; | |
}; | |
}, | |
get toString() { | |
return function () { | |
return Object.keys(this).join(''); | |
} | |
} | |
}; | |
Object.defineProperties(htmlEntities, { | |
get: { | |
enumerable: false | |
}, | |
toString: { | |
enumerable: false | |
} | |
}); | |
var re = new RegExp('[' + htmlEntities + ']', 'g'); | |
return str.replace(re, function (entity) { | |
return htmlEntities.get(entity); | |
}); | |
} | |
convert('Dolce & Gabbana'); |
function truncate(str, num) { | |
// Clear out that junk in your trunk | |
// trunk is loaded | |
if(str.length > num) { | |
if(num <= 3) { | |
return str.substr(0, num) + '...'; | |
} | |
return str.substr(0, num-3) + '...'; | |
} | |
return str; | |
} | |
truncate('A-tisket a-tasket A green and yellow basket', 11); |
function truncate(str, num) { | |
// Clear out that junk in your trunk | |
// trunk is loaded | |
return str.length > num ? num <= 3 ? str.substr(0, num) + '...': str.substr(0, num-3) + '...' : str; | |
} | |
truncate('A-tisket a-tasket A green and yellow basket', 11); |
this.myNamespace = {}; | |
(function (namespace, window, undefined) { | |
var htmlEntities = { | |
'\'': ''', | |
'&': '&', | |
'<': '<', | |
'>': '>', | |
'"': '"', | |
get get() { | |
return function (entity) { | |
return this[entity]; | |
}; | |
}, | |
get toString() { | |
return function () { | |
return Object.keys(this).join(''); | |
}; | |
} | |
}; | |
Object.defineProperties(htmlEntities, { | |
get: { | |
enumerable: false | |
}, | |
toString: { | |
enumerable: false | |
} | |
}); | |
namespace.htmlEntities = htmlEntities; | |
})(myNamespace, this); | |
function convert(str) { | |
'use strict'; | |
var re = new RegExp('[' + myNamespace.htmlEntities + ']', 'g'); | |
return str.replace(re, myNamespace.htmlEntities.get.bind(myNamespace.htmlEntities)); | |
} | |
convert('Dolce & Gabbana'); |
function chunk(arr, size) { | |
// Break it up | |
// It's already broken :( | |
arr = arr.slice(); | |
var arr2 = []; | |
for(var i = 0, len = arr.length; i < len; i+=size) { | |
arr2.push(arr.slice(0, size)); | |
arr = arr.slice(size); | |
} | |
return arr2; | |
} | |
chunk(['a', 'b', 'c', 'd'], 2); |
function slasher(arr, howMany) { | |
// it doesn't always pay to be first | |
// well, now my head is chopped off >:( | |
return arr.splice(0, howMany) && arr; | |
} | |
slasher([1, 2, 3], 2); |
function sumFibs(num) { | |
// Fibonacci is life. It's everywhere | |
var sum = 0, | |
last = 0, | |
fib = 1; | |
for(var curr = 1; fib <= num; fib = last + curr, last = curr, curr = fib) { | |
if(fib % 2) { | |
sum += fib; | |
} | |
// console.log(last, curr, fib); | |
} | |
return sum; | |
} | |
sumFibs(4); |
function sumFibs(num) { | |
// Fibonacci is life. It's everywhere | |
var sum = 0, | |
last = 0, | |
curr = 1, | |
fib = curr; | |
while(fib <= num) { | |
if(fib % 2) { | |
sum += fib; | |
} | |
// console.log(last, curr, fib); | |
fib = last + curr; | |
last = curr; | |
curr = fib; | |
} | |
return sum; | |
} | |
sumFibs(4); |
function bouncer(arr) { | |
// Don't show a false ID to this bouncer. | |
// I've a hammer fist. | |
return arr.filter(Boolean); | |
} | |
bouncer([7, 'ate', '', false, 9]); |
function bouncer(arr) { | |
// Don't show a false ID to this bouncer. | |
// I've a hammer fist. | |
var filtered = []; | |
for(var i = 0; i < arr.length; i++) { | |
if(Boolean(arr[i])) { | |
filtered.push(arr[i]); | |
} | |
} | |
return filtered; | |
} | |
bouncer([7, 'ate', '', false, 9]); |
function destroyer(arr) { | |
// Remove all the values | |
// I don't like the emptiness :P | |
var args = [].slice.call(arguments, 1); | |
return arr.filter(function (el) { | |
for(var i = 0; i < args.length; i++) { | |
if(args[i] === el) { | |
return false; | |
} | |
} | |
return true; | |
}); | |
} | |
destroyer([1, 2, 3, 1, 2, 3], 2, 3); |
function destroyer(arr) { | |
// Remove all the values | |
// I don't like the emptiness :P | |
// grab the other args | |
var args = [].slice.call(arguments, 1); | |
// filter the given array | |
return arr.filter(function (el) { | |
// return a Boolean true if args elements doesn't match el | |
return args.reduce(function (res, curr) { | |
return res && curr !== el; | |
}, true); | |
}); | |
} | |
destroyer([1, 2, 3, 1, 2, 3], 2, 3); |
function destroyer(arr) { | |
// Remove all the values | |
// I don't like the emptiness :P | |
// grab the other args | |
var args = [].slice.call(arguments, 1); | |
// filter the given array | |
return arr.filter(function (el) { | |
// return elements not in the args | |
return args.indexOf(el) === -1; | |
}); | |
} | |
destroyer([1, 2, 3, 1, 2, 3], 2, 3); |
function destroyer(arr, ...args) { | |
return arr.filter((el) => !args.includes(el)) | |
} | |
destroyer([1, 2, 3, 1, 2, 3], 2, 3); |
function find(arr, func) { | |
// Find me if you can | |
return arr.filter(func)[0]; | |
} | |
find([1, 2, 3, 4], function(num){ return num % 2 === 0; }); |
function where(arr, num) { | |
// Find my place in this sorted array. | |
// Why? Are you lost? | |
return arr.reduce((pos, curr) => num <= curr ? pos : pos + 1, 0); | |
} | |
where([40, 60], 50); |
function drop(arr, func) { | |
// Drop them elements. | |
// They're not eggs! | |
for(var i = 0; i < arr.length; i++) { | |
if(func(arr[i])) { | |
return arr.slice(i); | |
} | |
} | |
return []; | |
} | |
drop([1, 2, 3], function(n) {return n < 3; }); |
function drop(arr, func) { | |
// Drop them elements. | |
// They're not eggs! | |
'use strict'; | |
for(let el of arr) { | |
if(func(el)) { | |
return arr.slice(arr.indexOf(el)); | |
} | |
} | |
return []; | |
} | |
drop([1, 2, 3], function(n) {return n < 3; }); |
function rot13(str) { // LBH QVQ VG! | |
return str.replace(/[A-Z]/g, (L) => String.fromCharCode(65 + L.charCodeAt(0) % 26)); | |
} | |
rot13("SERR PBQR PNZC"); |
function addTogether(a, b) { | |
return typeof a === 'number' ? | |
(arguments.length < 2 | |
? addTogether.bind(null, a) | |
: typeof b === 'number' ? a + b : undefined | |
) : undefined; | |
} | |
addTogether('2',3); | |
addTogether(0, 3); | |
addTogether(0, 0); | |
addTogether(0.5, 0.5); | |
addTogether(0.5, 2.5); | |
addTogether(-2.5, 0); | |
addTogether(0, '0'); |
function addTogether(a, b) { | |
if (typeof a !== 'number') { | |
return; | |
} | |
if (arguments.length < 2) { | |
return addTogether.bind(null, a); | |
} | |
if (typeof b !== 'number') { | |
return; | |
} | |
return a + b; | |
} |
function binaryAgent(str) { | |
return str.replace(/\d+\s?/g, val => String.fromCodePoint(parseInt(val, 2))) | |
} | |
binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111") |
function binaryAgent(str) { | |
return String.fromCodePoint.apply( | |
null, | |
str.split(' ').map(val => parseInt(val, 2)) | |
) | |
} | |
binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111") |
function diffArray(arr1, arr2) { | |
// Same, same; but different. | |
return arr1.filter(el => !arr2.includes(el)) | |
.concat(arr2.filter(el => !arr1.includes(el))); | |
} | |
diff([1, 2, 3, 5], [1, 2, 3, 4, 5]); |
function truthCheck(collection, pre) { | |
// Is everyone being true? | |
return collection.every(obj => obj[pre]); | |
} | |
truthCheck([{"user": "Tinky-Winky", "sex": "male"}, {"user": "Dipsy", "sex": "male"}, {"user": "Laa-Laa", "sex": "female"}, {"user": "Po", "sex": "female"}], "sex"); |
function checkCashRegister(price, cash, cid) { | |
const currenciesVal = { | |
'ONE HUNDRED': 100, | |
TWENTY: 20, | |
TEN: 10, | |
FIVE: 5, | |
ONE: 1, | |
QUARTER: 0.25, | |
DIME: 0.1, | |
NICKEL: 0.05, | |
PENNY: 0.01, | |
} | |
let remains = +(cash - price).toFixed(2) | |
const total = +(cid.reduce((sum, cashes) => sum + cashes[1], 0)).toFixed(2) | |
if (remains === total) { | |
return 'Closed' | |
} | |
// Here is your change, ma'am. | |
return cid.reverse() | |
.reduce((returnVal, currCID, idx) => { | |
const type = currCID[0] // currency type | |
const val = currenciesVal[type] // currency value | |
const avail = currCID[1] // currency available in drawer | |
// amount to spend for this currency in drawer | |
const usage = Math.floor(Math.min(avail, remains) / val) * val | |
// remaining amount after deducing the used amount | |
remains = +(remains - usage).toFixed(2) | |
// if this is the last cash drawer and there are still change left | |
if ((idx === cid.length - 1) && remains) { | |
return 'Insufficient Funds' | |
} | |
// if currency used, then add it to value | |
if (usage) { | |
returnVal.push([type, usage]) | |
} | |
return returnVal | |
}, []) | |
} | |
console.log( | |
checkCashRegister(19.50, 20.00, [ | |
["PENNY", 1.01], | |
["NICKEL", 2.05], | |
["DIME", 3.10], | |
["QUARTER", 4.25], | |
["ONE", 90.00], | |
["FIVE", 55.00], | |
["TEN", 20.00], | |
["TWENTY", 60.00], | |
["ONE HUNDRED", 100.00] | |
]) | |
) |
function mutation(arr) { | |
// change is the only constant in universe | |
return arr[1].toLowerCase().split('').every(letter => arr[0].toLowerCase().includes(letter)); | |
} | |
mutation(['hello', 'hey']); // false | |
mutation(['hello', 'helloy']); // false | |
mutation(['hello', 'yellow']); // false |
function mutation(arr) { | |
// change is the only constant in universe | |
var test = arr[1].toLowerCase(), | |
target = arr[0].toLowerCase(); | |
for(var i = 0; i < test.length; i++) { | |
if(target.indexOf(test[i]) < 0) { | |
return false; | |
} | |
} | |
return true; | |
} | |
mutation(['hello', 'hey']); |
function translatePigLatin(str) { | |
return /^[aeiou]/.test(str) | |
? str + 'way' | |
: str.replace(/([^aeiou]+)(.+)/, '$2$1ay') | |
} | |
translatePigLatin("consonant") |
function lookUpProfile(firstName, prop) { | |
const foundContact = contacts.find(contact => contact.firstName === firstName) | |
if (!foundContact) return "No such contact" | |
return foundContact.hasOwnProperty(prop) | |
? foundContact[prop] | |
: "No such property" | |
} | |
lookUpProfile("Akira", "likes") |
function updateRecords(id, prop, value) { | |
// store the collection with corresponding collection id | |
const col = collection[id] | |
// check if value is empty/blank | |
if(value === '') { | |
// delete the property entirely | |
delete col[prop] | |
return collection // exit the function | |
} | |
// check if prop is tracks | |
if (prop === 'tracks') { | |
// check if prop exists and push the value at the end | |
if (col[prop]) col[prop].push(value) | |
// otherwise, assign a new array with value as 1st element | |
else col[prop] = [value] | |
return collection // exit the function | |
} | |
// if code has reached till this point, means | |
// value must not be blank | |
// and prop must not be tracks | |
// so assign the prop with the value | |
col[prop] = value | |
return collection // exit the function | |
} |
function uniteUnique(...arrs) { | |
return [].concat(...arrs).filter( | |
(val, idx, currArr) => currArr.indexOf(val) === idx | |
) | |
} | |
uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]) |
function spinalCase(str) { | |
// "It's such a fine line between stupid, and clever." | |
// --David St. Hubbins | |
return str.replace( | |
/[_\s](\w)|(?=[A-Z])/g, | |
(s, w) => w ? '-'+w : '-' | |
).replace(/^-/, '').toLowerCase() | |
} | |
spinalCase('This Is Spinal Tap') |
function spinalCase(str) { | |
// "It's such a fine line between stupid, and clever." | |
// --David St. Hubbins | |
return str.split(/\s|_|(?=[A-Z])/).join('-').toLowerCase() | |
} | |
spinalCase('This Is Spinal Tap') |
function steamrollArray (arr) { | |
return Array.isArray(arr) | |
? [].concat.apply([], arr.map(steamrollArray)) | |
: arr | |
} | |
steamrollArray([1, [2], [3, [[4]]]]) |
function sumAll([firstNum, lastNum]) { | |
// Buckle up everything to one! | |
// Using Arithmetic Progression summing formula | |
// https://en.wikipedia.org/wiki/Arithmetic_progression#Sum | |
return (Math.abs(lastNum - firstNum) + 1) * (firstNum + lastNum) / 2; | |
} | |
sumAll([10, 1]); // 55 |
function sym(...arrays) { | |
// Same, Same | |
// But different | |
return arrays.reduce((symDiff, arr) => | |
symDiff.concat(arr) | |
.filter((val, idx, theArr) => | |
theArr.indexOf(val) === idx && !(symDiff.includes(val) && arr.includes(val)) | |
) | |
) | |
} | |
sym([1, 2, 3], [5, 2, 1, 4]); |