├── .eslintrc.js ├── .gitignore ├── Easy ├── 01 - First Reverse.js ├── 02 - First Factorial.js ├── 03 - Longest Word.js ├── 04 - Letter Changes.js ├── 05 - Simple Adding.js ├── 06 - Letter Capitalize.js ├── 07 - Simple Symbols.js ├── 08 - Check Nums.js ├── 09 - Time Convert.js ├── 10 - Alphabet Soup.js ├── 11 - AB Check.js ├── 12 - Vowel Count.js ├── 13 - Word Count.js ├── 14 - Ex Oh.js ├── 15 - Palindrome.js ├── 16 - Arith Geo.js ├── 17 - Array Addition.js ├── 18 - Letter Count I.js ├── 19 - Second GreatLow.js ├── 20 - Division Stringified.js ├── 21 - Counting Minutes I.js ├── 22 - Mean Mode.js ├── 23 - Dash Insert.js ├── 24 - Swap Case.js ├── 25 - Number Addition.js ├── 26 - Third Greatest.js ├── 27 - Powers of Two.js ├── 28 - Additive Persistence.js ├── 29 - Multiplicative Persistence.js └── 30 - Off Line Minimum.js ├── Medium ├── 01 - Prime Time.js ├── 02 - Run Length.js ├── 03 - Prime Mover.js ├── 04 - Palindrome Two.js ├── 05 - Division.js ├── 06 - String Scramble.js ├── 07 - Arith Geo II.js ├── 08 - Array Addition.js ├── 09 - Binary Converter.js ├── 10 - Letter Count.js ├── 11 - Caesar Cipher.js ├── 12 - Simple Mode.js ├── 13 - Consecutive.js ├── 14 - Formatted Division.js ├── 15 - Counting Minutes.js ├── 16 - Permutation Step.js ├── 17 - Prime Checker.js ├── 18 - Dash Insert II.js ├── 19 - Swap II.js ├── 20 - Number Search.js ├── 21 - Triple Double.js ├── 22 - Bracket Matcher.js ├── 23 - String Reduction.js ├── 24 - Three Five Multiples.js ├── 26 - Fibonacci Checker.js ├── 27 - Multiple Brackets.js ├── 29 - Look Say Sequence.js └── 30 - Distinct List.js ├── README.md ├── package-lock.json └── package.json /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "extends": "standard", 3 | "rules": { 4 | "semi": ["error", "always"], 5 | "no-redeclare": ["off"], 6 | "no-unused-vars": ["off"], 7 | } 8 | }; 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /Easy/01 - First Reverse.js: -------------------------------------------------------------------------------- 1 | // Using Native Array Methods 2 | function FirstReverse (str) { 3 | // First, we need to use .split to change the string into an array so it can be further manipulated. 4 | // Passing "" (an empty string) into the method splits the string at every character. 5 | str = str.split(''); 6 | 7 | // Next, we use the reverse method to reverse the order of the elements in our newly formed array. 8 | // Note that only arrays have the .reverse method, which is why we had to use .split. 9 | str = str.reverse(); 10 | 11 | // After that, we use the .join method to reassemble our array back into a string. 12 | // Passing an empty string here means that nothing gets inserted between each array element. 13 | str = str.join(''); 14 | 15 | // Finally, we return the modified string 16 | return str; 17 | } 18 | 19 | // Using chaining 20 | function FirstReverse (str) { 21 | return str.split('').reverse().join(''); 22 | } 23 | 24 | // Without using native array methods 25 | function FirstReverse (str) { 26 | // First, we declare a variable to hold our result and initialize it to an empty string. 27 | var result = ''; 28 | 29 | // Next, we iterate over the input string in reverse, starting from the back (i = str.length - 1)... 30 | for (var i = str.length - 1; i >= 0; i--) { 31 | // ...and adding each character we hit to our result string. 32 | result += str[i]; 33 | } 34 | 35 | // Finally, we return our result 36 | return result; 37 | } 38 | 39 | // Video Tutorial 40 | // https://www.youtube.com/watch?v=Kk_-SvZGdto 41 | -------------------------------------------------------------------------------- /Easy/02 - First Factorial.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | function FirstFactorial (num) { 3 | // First, we declare a for loop starting at the parameter number - 1 (var i = num - 1) 4 | // We decrease i by 1 each iteration (i--) and stop when i reaches 2 (i > 1) 5 | for (var i = num - 1; i > 1; i--) { 6 | // On each pass, we multiply the num by i 7 | num *= i; 8 | } 9 | // The above loop will have the effect of multiplying num by all whole integers between 2 and num-1 inclusive. 10 | // For instance, if we pass 4 into our function, the loop will run twice, multiplying 4*3 (12) and then 12*2 (24). 11 | 12 | // Finally, we return our answer. 13 | return num; 14 | } 15 | 16 | // Recursive Solution 17 | function FirstFactorial (num) { 18 | if (num === 1) { 19 | return num; 20 | } 21 | return num * FirstFactorial(num - 1); 22 | } 23 | 24 | // Without Comments 25 | function FirstFactorial (num) { 26 | for (var i = num - 1; i > 1; i--) { 27 | num *= i; 28 | } 29 | return num; 30 | } 31 | -------------------------------------------------------------------------------- /Easy/03 - Longest Word.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | function LongestWord (sen) { 3 | // First, we declare a variable to hold the longest word and initialize it to an empty string... 4 | var longestWord = ''; 5 | // ...along with another variable to hold the length of the longest word, initializing it to 0. 6 | var longestLength = 0; 7 | 8 | // Next, we "prep" the input sentence by removing all non-alphanumeric characters 9 | sen = sen.replace(/[^a-zA-Z0-9\s]/g, ''); 10 | // Note that /[^a-zA-Z0-9\s]/g is a regex expression that matches all characters that are not lowercase letter (a-z), an uppercase letter (A-Z), a number (0-9), or a space (\s) 11 | // The ^ character negates the set that follows it (think of it like ! in Javascript) 12 | // http://www.regexr.com/ is a good place to play around with regex expressions and see what each character does 13 | 14 | // Next, we use the split method to turn our input string into an array of its individual words 15 | // Note that we pass a single space into the method (" ") to split the string at each space 16 | sen = sen.split(' '); 17 | 18 | // After that, we declare a for loop that iterates through each item in our new array... 19 | for (var i = 0; i < sen.length; i++) { 20 | // ...and check if the length of the word we're currently looking at is longer than the longestLength variable 21 | if (sen[i].length > longestLength) { 22 | // If it is, we set the longestLength variable to the length of the newly-longest word... 23 | longestLength = sen[i].length; 24 | // ...and set the longestWord variable to the string itself 25 | longestWord = sen[i]; 26 | } 27 | } 28 | // Note that since we initialized the longestLength variable to 0, the first word in our array will always become the longest word 29 | // As per coderbyte's prompt, all ties go to the earliest occuring word, which is why we use > in our if statement and not >= 30 | 31 | // Finally, we our answer 32 | return longestWord; 33 | } 34 | 35 | // Without comments 36 | function LongestWord (sen) { 37 | var longestWord = ''; 38 | var longestLength = 0; 39 | sen = sen.replace(/[^a-zA-Z0-9\s]/g, '').split(' '); 40 | 41 | for (var i = 0; i < sen.length; i++) { 42 | if (sen[i].length > longestLength) { 43 | longestLength = sen[i].length; 44 | longestWord = sen[i]; 45 | } 46 | } 47 | return longestWord; 48 | } 49 | 50 | // Using Array sort() Method 51 | function LongestWord (sen) { 52 | var words = sen.match(/[a-z0-9]+/gi); 53 | var sorted = words.sort(function (a, b) { 54 | return b.length - a.length; 55 | }); 56 | return sorted[0]; 57 | } 58 | -------------------------------------------------------------------------------- /Easy/04 - Letter Changes.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | function LetterChanges (str) { 3 | // First we do a little meta-problem solving by setting up our alpha and newAlpha strings: 4 | // Each character in alpha has the same index as the character coderbyte wants us to convert it to in newAlpha 5 | // For instance, since we want all d's in our input string to be converted to e's, and then we want all vowels to be capitalized, 6 | // we can "cheat" a by making alpha[3] equal to "d" and newAlpha[3] equal to "E". 7 | var alpha = 'abcdefghijklmnopqrstuvwxyz'; 8 | var newAlpha = 'bcdEfghIjklmnOpqrstUvwxyzA'; 9 | // Next, we declare a variable to hold our answer 10 | var answer = ''; 11 | 12 | // After that, we loop through each character in our input string 13 | for (var i = 0; i < str.length; i++) { 14 | // First, we use the indexOf method to check if the current character in our string is contained in alpha. 15 | // Note that if the string you pass into indexOf isn't found, it will return -1. Otherwise, it will return the index of the first matching character found. 16 | // For instance, alpha.indexOf("c") returns 2, while alpha.indexOf("C") returns -1. 17 | if (alpha.indexOf(str[i]) !== -1) { 18 | // If we find the character in the alpha string, we declare a variable to hold the index of the character. 19 | // Note that this is an unnessary step that I do for the purposes of clarity. See the 2nd function for a faster implementation. 20 | var index = alpha.indexOf(str[i]); 21 | // Since we set up the characters in alpha to have the same index as the one we want to convert it to in newAlpha, 22 | // all we have to do is access newAlpha at index to add the converted character to our answer variable. 23 | answer += newAlpha[index]; 24 | // If str[i] doesn't appear in alpha... 25 | } else { 26 | // ...we add it to our answer string, leaving any characters we don't want to change untouched and in the same index in our answer variable as they were in our input string. 27 | answer += str[i]; 28 | } 29 | } 30 | // Finally, we return our answer. 31 | return answer; 32 | } 33 | 34 | // Without Comments 35 | function LetterChanges (str) { 36 | var alpha = 'abcdefghijklmnopqrstuvwxyz'; 37 | var newAlpha = 'bcdEfghIjklmnOpqrstUvwxyzA'; 38 | var answer = ''; 39 | 40 | for (var i = 0; i < str.length; i++) { 41 | var index = alpha.indexOf(str[i]); 42 | if (index !== -1) { 43 | answer += newAlpha[index]; 44 | } else { 45 | answer += str[i]; 46 | } 47 | } 48 | return answer; 49 | } 50 | -------------------------------------------------------------------------------- /Easy/05 - Simple Adding.js: -------------------------------------------------------------------------------- 1 | // Step By Step Iterative Solution 2 | function SimpleAdding (num) { 3 | // Declare a variable to hold our answer 4 | var sum = 0; 5 | 6 | // Loop through all numbers between num and 1 inclusive... 7 | for (var i = num; i > 0; i--) { 8 | // ...adding i to our answer each time. 9 | sum += i; 10 | } 11 | // Finally, we return our answer. 12 | return sum; 13 | } 14 | 15 | // Step By Step Recursive Solution 16 | // By Eric Ehli, https://github.com/eihli 17 | function SimpleAdding (num, sum) { 18 | // If no argument is passed for sum (Coderbyte will always only pass 1 argument into our function), we set it to 0 19 | sum = sum || 0; 20 | 21 | // Next, we set our base case to stop the function from recursing when our input number equals 0... 22 | if (num === 0) { 23 | // ...and return our answer 24 | return sum; 25 | } 26 | 27 | // Each time we recurse through our function, we add the number to our sum variable (sum += num)... 28 | sum += num; 29 | // ...and decrease num by 1 using the decrement operator 30 | num--; 31 | 32 | // We return the function again and continue to add num to curSum and decrement num by 1 until num reaches 0. 33 | return SimpleAdding(num, sum); 34 | } 35 | -------------------------------------------------------------------------------- /Easy/06 - Letter Capitalize.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | function LetterCapitalize (str) { 3 | // First, we use the split method to divide the input string into an array of individual words 4 | // Note that we pass a string consisting of a single space into the method to "split" the string at each space 5 | str = str.split(' '); 6 | 7 | // Next, we loop through each item in our new array... 8 | for (var i = 0; i < str.length; i++) { 9 | // ...and set each word in the array to be equal to the first letter of the word (str[i][0]) capitalized using the toUpperCase method. 10 | // along with a substring of the remainder of the word (passing only 1 arg into the substr method means that you start at that index and go until the end of the string) 11 | str[i] = str[i][0].toUpperCase() + str[i].substr(1); 12 | } 13 | // Finally, we join our array back together... 14 | str = str.join(' '); 15 | 16 | // ...and return our answer. 17 | return str; 18 | } 19 | 20 | // Without Comments 21 | function LetterCapitalize (str) { 22 | str = str.split(' '); 23 | 24 | for (var i = 0, x = str.length; i < x; i++) { 25 | str[i] = str[i][0].toUpperCase() + str[i].substr(1); 26 | } 27 | 28 | return str.join(' '); 29 | } 30 | 31 | // Using Chaining/Map 32 | 33 | function LetterCapitalize (str) { 34 | return str.split(' ').map(function (word, i) { 35 | return word[0].toUpperCase() + word.substr(1); 36 | }).join(' '); 37 | } 38 | -------------------------------------------------------------------------------- /Easy/07 - Simple Symbols.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | function SimpleSymbols (str) { 3 | // First, we declare a variable to hold a regex expression to match all upper and lowercase letters 4 | var alphaTest = /[a-zA-Z]/; 5 | 6 | // Next, we loop through each character in the string... 7 | for (var i = 0; i < str.length; i++) { 8 | // ... and use the our previously declared regex expression and the .test method to see if the character is a letter 9 | if (alphaTest.test(str[i])) { 10 | // If our test returns true, we check if either of the adjacent characters are not +'s 11 | if ((str[i + 1] !== '+') || (str[i - 1] !== '+')) { 12 | // If one of them isn't, we return false. 13 | return false; 14 | } 15 | } 16 | } 17 | 18 | // If our program is able to check all of the characters and hasn't returned false, we know the string obeys all of the problem's rules and can return true. 19 | return true; 20 | } 21 | 22 | // Without Comments 23 | function SimpleSymbols (str) { 24 | for (var i = 0, x = str.length; i < x; i++) { 25 | if (/[a-zA-Z]/.test(str[i])) { 26 | if ((str[i + 1] !== '+') || (str[i - 1] !== '+')) { 27 | return false; 28 | } 29 | } 30 | } 31 | 32 | return true; 33 | } 34 | -------------------------------------------------------------------------------- /Easy/08 - Check Nums.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | function CheckNums (num1, num2) { 3 | // We check if the first number is less than the second... 4 | if (num1 < num2) { 5 | // ...if so, we return true 6 | return true; 7 | // If the first number is greater than the second... 8 | } else if (num1 > num2) { 9 | // ...we return false 10 | return false; 11 | // If neither of the above conditions are true, we know that the numbers are equal... 12 | } else { 13 | // ...and so we return the string -1. 14 | return '-1'; 15 | } 16 | } 17 | 18 | // Without Comments 19 | function CheckNums (num1, num2) { 20 | if (num1 === num2) { 21 | return '-1'; 22 | } 23 | return num1 < num2; 24 | } 25 | -------------------------------------------------------------------------------- /Easy/09 - Time Convert.js: -------------------------------------------------------------------------------- 1 | // With step by step instructions 2 | function TimeConvert (num) { 3 | // First, we divide our number by 60 and then use math.floor to "round down" and get the number of hours. 4 | // Note that Math.floor returns the nearest whole integer less than or equal to the input number. 5 | var hours = Math.floor(num / 60); 6 | 7 | // Next, we use the modulus operator to figure out the number of minutes (the remainder of num/60). 8 | // For instance, 125 % 60 would return 5. 9 | var minutes = num % 60; 10 | 11 | // Finally, we return our answer as a string with ":" inserted between the hours and minutes. 12 | return hours + ':' + minutes; 13 | } 14 | 15 | // Without comments 16 | function TimeConvert (num) { 17 | return Math.floor(num / 60) + ':' + num % 60; 18 | } 19 | -------------------------------------------------------------------------------- /Easy/10 - Alphabet Soup.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | function AlphabetSoup (str) { 3 | // Use .split to turn the string into an array... 4 | str = str.split(''); 5 | 6 | // .sort to alphabatize the new array... 7 | str = str.sort(); 8 | 9 | // and .join to turn it back into a string. 10 | str = str.join(''); 11 | 12 | // Finally, we return our answer. 13 | return str; 14 | } 15 | 16 | // With Chaining 17 | function AlphabetSoup (str) { 18 | return str.split('').sort().join(''); 19 | } 20 | -------------------------------------------------------------------------------- /Easy/11 - AB Check.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | function ABCheck (str) { 3 | // First, we declare two regex expressions to match if a and b ever occur three characters apart. 4 | // Note that . is a "wildcard" metacharacter in regex that matches almost any character. 5 | var testOne = /a...b/; 6 | var testTwo = /b...a/; 7 | 8 | // Next, we use the test method in conjunction with the regex expressions to see if our string contains any matching characters 9 | var aThenB = testOne.test(str); 10 | var bThenA = testTwo.test(str); 11 | 12 | // Finally, we return our answer 13 | return aThenB || bThenA; 14 | } 15 | 16 | // No Comments 17 | function ABCheck (str) { 18 | return (/a...b/).test(str) || (/b...a/).test(str); 19 | } 20 | -------------------------------------------------------------------------------- /Easy/12 - Vowel Count.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | function VowelCount (str) { 3 | // First, we Remove all characters in the string that aren't vowels with the .replace method. 4 | // Note that ^ in Regex means "all characters not in the set", so placing it in front of aeiou means "Match everything that isn't a vowel" 5 | // Enclosing a set in [] means that our string matches any individual character in that set 6 | // Ending with our /g tag signifies that we want to do a global search and lets our engine know to going through the entire string. 7 | str = str.replace(/[^aeiuo]/g, ''); 8 | 9 | // Finally, we return the length of the string to "count" how many vowels are left. 10 | return str.length; 11 | } 12 | 13 | // No Comments 14 | function VowelCount (str) { 15 | return str.replace(/[^aeiou]/g, '').length; 16 | } 17 | -------------------------------------------------------------------------------- /Easy/13 - Word Count.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | function WordCount (str) { 3 | // First, we turn the input string into an array of words by passing a single space into the .split method... 4 | str = str.split(' '); 5 | 6 | // ...and return the length of the new array as our answer 7 | return str.length; 8 | } 9 | 10 | // No Comments 11 | function WordCount (str) { 12 | return str.split(' ').length; 13 | } 14 | -------------------------------------------------------------------------------- /Easy/14 - Ex Oh.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | function ExOh (str) { 3 | // First, we declare two variables: 4 | // One which remove all characters in the string that aren't x's... 5 | var strX = str.replace(/[^x]/g, ''); 6 | 7 | // ...and and the second which removes all characters that aren't o's 8 | var strO = str.replace(/[^o]/g, ''); 9 | 10 | // Next, we get the length of each of these new variables to determine how many x's and o's are in the string... 11 | var xNumber = strX.length; 12 | var oNumber = strO.length; 13 | 14 | // ...and return the truth value of comparing the two. 15 | return xNumber === oNumber; 16 | } 17 | 18 | // No Comments 19 | function ExOh (str) { 20 | return str.replace(/[^x]/g, '').length === str.replace(/[^o]/g, '').length; 21 | } 22 | -------------------------------------------------------------------------------- /Easy/15 - Palindrome.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | // ♫ I put my string down flip it and reverse it ♫ 3 | function Palindrome (str) { 4 | // First, we prep the string by using the .replace method to take out all spaces. 5 | // Note that [\s] will match all whitespace in the string. 6 | str = str.replace(/[\s]/g, ''); 7 | 8 | // Next, we declare a new variable to hold the reversed string and use the .split, .reverse, and .join methods to modify it. 9 | // You should remember this section from the very first problem (check out my solution in this repository if you need a refresher). 10 | var strRev = str.split('').reverse().join(''); 11 | 12 | // Finally, we return the truth value of comparing the two strings. 13 | return str === strRev; 14 | } 15 | 16 | // No Comments 17 | // Note that while this problem doesn't use any inputs with uppercase letters, you can add in .toLowerCase() to account for inputs that do. 18 | function Palindrome (str) { 19 | return str.replace(/[\s]/g, '').toLowerCase() === str.replace(/[\s]/g, '').toLowerCase().split('').reverse().join(''); 20 | } 21 | -------------------------------------------------------------------------------- /Easy/16 - Arith Geo.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | function ArithGeo (arr) { 3 | // First, we declare two empty arrays to hold the differences and quotients of each item in our input array 4 | var arrDif = []; 5 | var arrQuo = []; 6 | 7 | // Next, we declare two booleans as "flags" for whether or not our array follows an arithmetic or geometric pattern 8 | // As we're going to turn these false if the input array doesn't follow an arithmetic or geometric pattern, we initialize them to true. 9 | var ariFlag = true; 10 | var geoFlag = true; 11 | 12 | // Next, we loop through each item in our input array and use the .push method to send... 13 | for (var i = 0; i < arr.length - 1; i++) { 14 | // ...the difference of each item to our arrDif array. 15 | arrDif.push(arr[i + 1] - arr[i]); 16 | // ...the quotient of each item to our arrQuo array. 17 | arrQuo.push(arr[i + 1] / arr[i]); 18 | } 19 | // Note that since this loop "looks ahead" one item during each pass, we end it 1 iteration earlier than we normally would (i < arr.length - 1 instead of i < arr.length) 20 | 21 | // After that, we use a single loop to check if each item in our newly populated arrDif and arrQuo arrays are equal to each other. 22 | // Note that we can set the loop length using the length of arrDif because we know both arrDif and arrQuo are the same length. 23 | for (var j = 0; j < arrDif.length - 1; j++) { 24 | // This if statement checks to see if each item in our array of differences is equal to the next item in the array, and if not, sets our ariFlag to false. 25 | if (arrDif[j] !== arrDif[j + 1]) { 26 | ariFlag = false; 27 | } 28 | // We do the same thing for our array of quotients. 29 | if (arrQuo[j] !== arrQuo[j + 1]) { 30 | geoFlag = false; 31 | } 32 | } 33 | 34 | // Finally, we return "Arithmetic" if the ariFlag is set to true, "Geometric" if the geoFlag is set to true, and -1 if neither are set to true. 35 | if (ariFlag) { 36 | return 'Arithmetic'; 37 | } 38 | if (geoFlag) { 39 | return 'Geometric'; 40 | } 41 | return -1; 42 | } 43 | 44 | // No Comments 45 | function ArithGeo (arr) { 46 | var arrDif = []; 47 | var arrQuo = []; 48 | var ariFlag = true; 49 | var geoFlag = true; 50 | 51 | for (var i = 0; i < arr.length - 1; i++) { 52 | arrDif.push(arr[i + 1] - arr[i]); 53 | arrQuo.push(arr[i + 1] / arr[i]); 54 | if (i > 0) { 55 | if (arrDif[i - 1] !== arrDif[i]) { 56 | ariFlag = false; 57 | } 58 | if (arrQuo[i - 1] !== arrQuo[i]) { 59 | geoFlag = false; 60 | } 61 | } 62 | } 63 | 64 | if (ariFlag) { 65 | return 'Arithmetic'; 66 | } 67 | if (geoFlag) { 68 | return 'Geometric'; 69 | } 70 | return -1; 71 | } 72 | -------------------------------------------------------------------------------- /Easy/17 - Array Addition.js: -------------------------------------------------------------------------------- 1 | // Note that this solution uses recursion. For a non-recursive solution, you can check out http://leaena.com/2013/08/solver-of-problems/ 2 | 3 | function ArrayAdditionI (arr) { 4 | // First, we use the native sort method to order our input array from smallest to largest 5 | var arr = arr.sort(function (a, b) { return a - b; }); 6 | // Next, we use pop to grab the largest value. Note that this will also remove it from the array. 7 | var largest = arr.pop(); 8 | // Our last bit of set-up is to create a 'result' variable that we'll change to true if we find a possible solution within our recursive inner function 9 | var result = false; 10 | 11 | // Now that we've prepped our input array and have a variable to store our result in, we create an inner function 12 | // that accepts our current sum and the position of the array element that we're adding to the sum as inputs. 13 | var onePerm = function (sum, i) { 14 | // If we don't pass anything for sum or i, these two lines will make them default to 0 15 | // If you're interested in diving into how these work, check out https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Short-Circuit_Evaluation 16 | sum = sum || 0; 17 | i = i || 0; 18 | // Our sole base case is to check if our current sum is equal to the largest value 19 | if (sum === largest) { 20 | // If it is, we set our result to true and return out of the inner function 21 | result = true; 22 | return; 23 | } 24 | // This next loop's structure may look a little funky to some people, but since we're getting i from somewhere else we don't need a loop initialization 25 | // Once we've gotten to this part of the function we know that the current sum isn't equal to the largest value, so we iterate over the numbers array... 26 | for (; i < arr.length; i++) { 27 | // Add the current number to our sum... 28 | sum += arr[i]; 29 | // ...and call the function again, but this time passing in the modified sum and adding 1 to the i value so that our next run through will add the next value in the array 30 | // Note that if i is larger or equal to the length of the array, the loop won't execute and the function will terminate 31 | onePerm(sum, i + 1); 32 | // Finally, we subtract the last number we added so as to check all possible permutations 33 | sum -= arr[i]; 34 | } 35 | }; 36 | // Back outside of the inner function, we invoke our inner function to 'seed' it and start checking all possible permutations 37 | // Note that we don't have to pass anything into the function due to lines 16 and 17 38 | onePerm(); 39 | // Finally, we return our result boolean 40 | return result; 41 | } 42 | 43 | // With no comments 44 | function ArrayAdditionI (arr) { 45 | var arr = arr.sort(function (a, b) { return a - b; }); 46 | var largest = arr.pop(); 47 | var result = false; 48 | 49 | var onePerm = function (sum, i) { 50 | sum = sum || 0; 51 | i = i || 0; 52 | 53 | if (sum === largest) { 54 | result = true; 55 | return; 56 | } 57 | for (; i < arr.length; i++) { 58 | sum += arr[i]; 59 | onePerm(sum, i + 1); 60 | sum -= arr[i]; 61 | } 62 | }; 63 | 64 | onePerm(); 65 | return result; 66 | } 67 | -------------------------------------------------------------------------------- /Easy/18 - Letter Count I.js: -------------------------------------------------------------------------------- 1 | function LetterCountI (str) { 2 | var words = str.split(' '); 3 | var largestDif = 0; 4 | var answer; 5 | 6 | for (var i = 0; i < words.length; i++) { 7 | var currentWord = words[i]; 8 | var currentWordLength = words[i].length; 9 | var currentWordSorted = words[i].split('').sort(); 10 | for (var j = 0; j < (words[i].length - 1); j++) { 11 | if (currentWordSorted[j] === currentWordSorted[j + 1]) { 12 | currentWordSorted.splice(j, 1); 13 | } 14 | var currentDif = (currentWordLength - currentWordSorted.length); 15 | if (currentDif > largestDif) { 16 | largestDif = currentDif; 17 | answer = currentWord; 18 | } 19 | } 20 | } 21 | 22 | if (largestDif > 0) { 23 | return answer; 24 | } 25 | return -1; 26 | } 27 | -------------------------------------------------------------------------------- /Easy/19 - Second GreatLow.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | function SecondGreatLow (arr) { 3 | // Use the sort function and pass in a callback to sort from smallest to largest 4 | // If you haven't encountered function expressions/callbacks before, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort gives a good explanation of how this method works. 5 | arr = arr.sort(function (a, b) { return a - b; }); 6 | 7 | // Loop through each item in the array and check if the adjacent array item is the same. 8 | for (var i = arr.length - 1; i > 0; i--) { 9 | if (arr[i] === arr[i - 1]) { 10 | // If it is, we use the .splice method to remove it. 11 | arr.splice(i, 1); 12 | } 13 | } 14 | 15 | if (arr.length > 2) { 16 | // If our array is longer than two items, we return the 2nd and 2nd to last item in the array. 17 | return arr[1] + ' ' + arr[arr.length - 2]; 18 | } else if (arr.length === 2) { 19 | // If our array is exactly two items long, we return the 2nd and the first item 20 | return arr[1] + ' ' + arr[0]; 21 | } else { 22 | // If our array is only one item, we return the only element twice. 23 | return arr[0] + ' ' + arr[0]; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Easy/20 - Division Stringified.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | 3 | function DivisionStringified (num1, num2) { 4 | // First, we use the Math.round method to calculate our product... 5 | // ...and then use the .toString method to convert the reusltant number into a string. 6 | var result = Math.round(num1 / num2).toString(); 7 | 8 | // Next, we use the .split method to convert our result variable into an array so it can be further manipulated. 9 | // Note that we pass in an empty string ("") into the .split method to split the result variable at every character. 10 | var resultArr = result.split(''); 11 | 12 | // Next, we check if our result is greater than 1000. 13 | if (result >= 1000) { 14 | // If it is, we loop through each item in our result array... 15 | // ...starting at the third character from the end (i = result.length - 3)... 16 | // ...moving back three charactres each time (i -= 3)... 17 | // ...and stopping when we get to the start of the string (i > 0) 18 | for (var i = result.length - 3; i > 0; i -= 3) { 19 | // At every third character we use the .splice method to insert a comma. 20 | // Note that the first arguement of the .splice is where the method inserts things into the array (i), 21 | // ...the second controls how many array items are removed (0), 22 | // ...and the third controls what is inserted (","). 23 | resultArr.splice(i, 0, ','); 24 | } 25 | } 26 | 27 | // Finally, we return our result array with the .join method to covert it into a string. 28 | return resultArr.join(''); 29 | } 30 | 31 | // No Comments 32 | function DivisionStringified (num1, num2) { 33 | var result = Math.round(num1 / num2).toString(); 34 | var resultArr = result.split(''); 35 | 36 | if (result >= 1000) { 37 | for (var i = result.length - 3; i > 0; i -= 3) { 38 | resultArr.splice(i, 0, ','); 39 | } 40 | } 41 | 42 | return resultArr.join(''); 43 | } 44 | -------------------------------------------------------------------------------- /Easy/21 - Counting Minutes I.js: -------------------------------------------------------------------------------- 1 | function CountingMinutesI (str) { 2 | var timeArray = str.split('-'); 3 | var startTime = timeArray[0]; 4 | var endTime = timeArray[1]; 5 | var startTimeArr = startTime.split(':'); 6 | var startTimeHour = parseInt(startTimeArr[0]); 7 | var startTimeMinute = parseInt(startTimeArr[1].replace(/[^0-9]/g, '')); 8 | var startTimeAMPM = startTimeArr[1].replace(/[^a-zA-Z]/g, ''); 9 | var endTimeArr = endTime.split(':'); 10 | var endTimeHour = parseInt(endTimeArr[0]); 11 | var endTimeMinute = parseInt(endTimeArr[1].replace(/[^0-9]/g, '')); 12 | var endTimeAMPM = endTimeArr[1].replace(/[^a-zA-Z]/g, ''); 13 | 14 | if ((startTimeHour !== 12) && (startTimeAMPM === 'pm')) { 15 | startTimeHour += 12; 16 | } 17 | if ((endTimeHour !== 12) && (endTimeAMPM === 'pm')) { 18 | endTimeHour += 12; 19 | } 20 | if ((startTimeHour === 12) && (startTimeAMPM === 'am')) { 21 | startTimeHour -= 12; 22 | } 23 | if ((endTimeHour === 12) && (endTimeAMPM === 'am')) { 24 | endTimeHour -= 12; 25 | } 26 | 27 | if ((startTimeHour > endTimeHour) || ((startTimeHour === endTimeHour) && (startTimeMinute > endTimeMinute))) { 28 | return (1440 + ((endTimeHour - startTimeHour) * 60) + (endTimeMinute - startTimeMinute)); 29 | } else { 30 | return ((endTimeHour - startTimeHour) * 60) + (endTimeMinute - startTimeMinute); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Easy/22 - Mean Mode.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | function MeanMode (arr) { 3 | // First, we declare an empty object to hold the number of times each item in the input array occurs, 4 | var modeMap = {}; 5 | // a variable to hold the actual mode, 6 | var mode = 0; 7 | // a variable to hold the number of times the mode occurs, 8 | var modeCount = 0; 9 | // and a variable to hold the sum of the items in the array (to calculate the mean), 10 | var sum = 0; 11 | 12 | // Next, we loop through each item in the input array and... 13 | for (var i = 0; i < arr.length; i++) { 14 | // ...add each value to our sum variable 15 | sum += arr[i]; 16 | 17 | // ...check if each value is present in our frequency count 18 | if (modeMap[arr[i]]) { 19 | // If it is, we increase its value by 1. 20 | modeMap[arr[i]]++; 21 | } else { 22 | // If it isn't, we initialize its value to 1. 23 | modeMap[arr[i]] = 1; 24 | } 25 | 26 | // ...and check if the count is greater than our current mode's count. 27 | if (modeMap[arr[i]] > modeCount) { 28 | // If it is, we set the mode to the current item in our input array... 29 | mode = arr[i]; 30 | // ...and set the number of times the mode has occured to the current item's value in our mode array. 31 | modeCount = modeMap[arr[i]]; 32 | } 33 | } 34 | 35 | // Next, we calculate the mean by dividing the sum by the total number of items in the array. 36 | var mean = sum / arr.length; 37 | 38 | // If the mean and the mode are the same, we return 1, otherwise we return 0. 39 | if (mean === mode) { 40 | return 1; 41 | } else { 42 | return 0; 43 | } 44 | } 45 | 46 | // Without Comments 47 | function MeanMode (arr) { 48 | var modeMap = {}; 49 | var mode = 0; 50 | var modeCount = 0; 51 | var sum = 0; 52 | 53 | for (var i = 0; i < arr.length; i++) { 54 | sum += arr[i]; 55 | 56 | if (modeMap[arr[i]]) { 57 | modeMap[arr[i]]++; 58 | } else { 59 | modeMap[arr[i]] = 1; 60 | } 61 | if (modeMap[arr[i]] > modeCount) { 62 | mode = arr[i]; 63 | modeCount = modeMap[arr[i]]; 64 | } 65 | } 66 | 67 | var mean = sum / arr.length; 68 | 69 | if (mean === mode) { 70 | return 1; 71 | } else { 72 | return 0; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /Easy/23 - Dash Insert.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | function DashInsert (num) { 3 | // First, we convert the input number into a string 4 | // This allows us to add the character to our answer rather than summing the two. 5 | num = num.toString(); 6 | // Next, we declare and initialize a variable to hold our answer string. 7 | var answer = ''; 8 | 9 | // After that, we loop through each character in our input number... 10 | for (var i = 0; i < num.length; i++) { 11 | // ...and for every character after the first, we check if the current and previous character are odd. 12 | if ((i > 0) && (num[i] % 2 === 1) && (num[i - 1] % 2 === 1)) { 13 | // If both are, we add a dash to our answer. 14 | answer += '-'; 15 | } 16 | // No matter whether or not we add a dash, we add the current number to our answer string. 17 | answer += num[i]; 18 | } 19 | 20 | // Finally, we return our answer. 21 | return answer; 22 | } 23 | 24 | // No Comments 25 | function DashInsert (num) { 26 | num = num.toString(); 27 | var answer = ''; 28 | 29 | for (var i = 0, x = num.length; i < x; i++) { 30 | if ((i > 0) && (num[i] % 2 === 1) && (num[i - 1] % 2 === 1)) { 31 | answer += '-'; 32 | } 33 | 34 | answer += num[i]; 35 | } 36 | 37 | return answer; 38 | } 39 | -------------------------------------------------------------------------------- /Easy/24 - Swap Case.js: -------------------------------------------------------------------------------- 1 | function SwapCase (str) { 2 | var answer = ''; 3 | 4 | for (var i = 0; i < str.length; i++) { 5 | if (str[i] === str[i].toUpperCase()) { 6 | answer += str[i].toLowerCase(); 7 | } else if (str[i] === str[i].toLowerCase()) { 8 | answer += str[i].toUpperCase(); 9 | } else { 10 | answer += str[i]; 11 | } 12 | } 13 | 14 | return answer; 15 | } 16 | -------------------------------------------------------------------------------- /Easy/25 - Number Addition.js: -------------------------------------------------------------------------------- 1 | // Step By Step 2 | function NumberAddition (str) { 3 | // First we charge our input string into an array by splitting it at every alphabetic character. 4 | // Note that this regex expression will match any capital or lowercase letter. 5 | str = str.split(/[a-zA-Z]/); 6 | // Next, we declare a sum variable to hold our answer. 7 | var sum = 0; 8 | // After that, we iterate over each element in our modified array... 9 | for (var i = 0; i < str.length; i++) { 10 | // ...and if it isn't an empty string... 11 | if (str[i] !== '') { 12 | // ...we parse its value with parseInt and add it to our answer. 13 | sum += parseInt(str[i]); 14 | } 15 | } 16 | // Finally, we return our answer 17 | return sum; 18 | } 19 | 20 | // Without Comments 21 | function NumberAddition (str) { 22 | str = str.split(/[a-zA-Z]/); 23 | var sum = 0; 24 | 25 | for (var i = 0; i < str.length; i++) { 26 | if (str[i] !== '') { 27 | sum += parseInt(str[i]); 28 | } 29 | } 30 | 31 | return sum; 32 | } 33 | -------------------------------------------------------------------------------- /Easy/26 - Third Greatest.js: -------------------------------------------------------------------------------- 1 | function ThirdGreatest (strArr) { 2 | strArr = strArr.sort(function (a, b) { return b.length - a.length; }); 3 | return strArr[2]; 4 | } 5 | -------------------------------------------------------------------------------- /Easy/27 - Powers of Two.js: -------------------------------------------------------------------------------- 1 | function PowersofTwo (num) { 2 | while (num > 1) { 3 | if (num % 2 !== 0) { 4 | return false; 5 | } 6 | num = Math.floor(num / 2); 7 | } 8 | return true; 9 | } 10 | -------------------------------------------------------------------------------- /Easy/28 - Additive Persistence.js: -------------------------------------------------------------------------------- 1 | function AdditivePersistence (num) { 2 | var addPer = 0; 3 | 4 | function splitArray (intN) { 5 | intN = intN.toString().split(''); 6 | var answerArr = []; 7 | for (var i = 0; i < intN.length; i++) { 8 | answerArr.push(parseInt(intN[i])); 9 | } 10 | return answerArr; 11 | } 12 | 13 | function add (array) { 14 | var sum = 0; 15 | for (var i = 0; i < array.length; i++) { 16 | sum += array[i]; 17 | } 18 | return sum; 19 | } 20 | 21 | while (num.toString().length > 1) { 22 | num = splitArray(num); 23 | num = add(num); 24 | addPer++; 25 | } 26 | 27 | return addPer; 28 | } 29 | -------------------------------------------------------------------------------- /Easy/29 - Multiplicative Persistence.js: -------------------------------------------------------------------------------- 1 | function MultiplicativePersistence (num) { 2 | var multiPer = 0; 3 | 4 | function splitArray (intN) { 5 | intN = intN.toString().split(''); 6 | var answerArr = []; 7 | for (var i = 0; i < intN.length; i++) { 8 | answerArr.push(parseInt(intN[i])); 9 | } 10 | return answerArr; 11 | } 12 | 13 | function mult (array) { 14 | var product = 1; 15 | for (var i = 0; i < array.length; i++) { 16 | product *= array[i]; 17 | } 18 | return product; 19 | } 20 | 21 | while (num.toString().length > 1) { 22 | num = splitArray(num); 23 | num = mult(num); 24 | multiPer++; 25 | } 26 | 27 | return multiPer; 28 | } 29 | -------------------------------------------------------------------------------- /Easy/30 - Off Line Minimum.js: -------------------------------------------------------------------------------- 1 | function OffLineMinimum (strArr) { 2 | var numTest = /[0-9]/; 3 | var numArr = []; 4 | var answerArr = []; 5 | var lowest = 10; 6 | var lowestInd = 0; 7 | 8 | for (var i = 0; i < strArr.length; i++) { 9 | if (numTest.test(strArr[i])) { 10 | numArr.push(strArr[i]); 11 | } else { 12 | for (var j = 0; j < numArr.length; j++) { 13 | if (numArr[j] < lowest) { 14 | lowest = numArr[j]; 15 | lowestInd = numArr.indexOf(lowest); 16 | } 17 | } 18 | answerArr.push(lowest); 19 | lowest = 10; 20 | numArr.splice(lowestInd, 1); 21 | } 22 | } 23 | 24 | return answerArr.join(','); 25 | } 26 | -------------------------------------------------------------------------------- /Medium/01 - Prime Time.js: -------------------------------------------------------------------------------- 1 | function PrimeTime (num) { 2 | if (num === 1) { 3 | return false; 4 | } 5 | for (var i = 2; i < num; i++) { 6 | if (num % i === 0) { 7 | return false; 8 | } 9 | } 10 | return true; 11 | } 12 | -------------------------------------------------------------------------------- /Medium/02 - Run Length.js: -------------------------------------------------------------------------------- 1 | function RunLength (str) { 2 | var count = 1; 3 | var result = ''; 4 | 5 | for (var i = 0; i < str.length; i++) { 6 | if (str[i] === str[i + 1]) { 7 | count++; 8 | } else { 9 | result += count + str[i]; 10 | count = 1; 11 | } 12 | } 13 | return result; 14 | } 15 | -------------------------------------------------------------------------------- /Medium/03 - Prime Mover.js: -------------------------------------------------------------------------------- 1 | 2 | function PrimeMover (num) { 3 | var isPrime = function (num) { 4 | for (var i = 2; i < num; i++) { 5 | if (num % i === 0) { 6 | return false; 7 | } 8 | } 9 | return true; 10 | }; 11 | 12 | var primeArr = []; 13 | var cur = 2; 14 | 15 | while (primeArr.length < num) { 16 | if (isPrime(cur)) { 17 | primeArr.push(cur); 18 | } 19 | cur++; 20 | } 21 | return primeArr.pop(); 22 | } 23 | -------------------------------------------------------------------------------- /Medium/04 - Palindrome Two.js: -------------------------------------------------------------------------------- 1 | function PalindromeTwo (str) { 2 | var strFor = str.replace(/[^a-zA-Z]/g, '').toLowerCase(); 3 | var strRev = str.replace(/[^a-zA-Z]/g, '').split('').reverse().join('').toLowerCase(); 4 | return strFor === strRev; 5 | } 6 | 7 | function PalindromeTwo (str) { 8 | return str.replace(/[^a-zA-Z]/g, '').toLowerCase() === str.replace(/[^a-zA-Z]/g, '').split('').reverse().join('').toLowerCase(); 9 | } 10 | -------------------------------------------------------------------------------- /Medium/05 - Division.js: -------------------------------------------------------------------------------- 1 | function Division (num1, num2) { 2 | var largestFactor = 1; 3 | var smallerNum; 4 | 5 | if (num1 > num2) { 6 | smallerNum = num2; 7 | } else { 8 | smallerNum = num1; 9 | } 10 | 11 | for (var i = 1; i <= smallerNum; i++) { 12 | if ((num1 % i === 0) && (num2 % i === 0) && (i > largestFactor)) { 13 | largestFactor = i; 14 | } 15 | } 16 | return largestFactor; 17 | } 18 | -------------------------------------------------------------------------------- /Medium/06 - String Scramble.js: -------------------------------------------------------------------------------- 1 | function StringScramble (str1, str2) { 2 | for (var i = 0; i < str2.length; i++) { 3 | if (str1.indexOf(str2[i]) === -1) { 4 | return false; 5 | } else { 6 | str1 = str1.replace(str2[i], ''); 7 | } 8 | } 9 | 10 | return true; 11 | } 12 | -------------------------------------------------------------------------------- /Medium/07 - Arith Geo II.js: -------------------------------------------------------------------------------- 1 | function ArithGeoII (arr) { 2 | var diffArr = []; 3 | var geoArr = []; 4 | var geoFlag = true; 5 | var arithFlag = true; 6 | 7 | for (var i = 0; i < arr.length - 1; i++) { 8 | diffArr.push(arr[i + 1] - arr[i]); 9 | geoArr.push(arr[i + 1] / arr[i]); 10 | } 11 | 12 | for (var j = 0; j < diffArr.length - 1; j++) { 13 | if (diffArr[j] !== diffArr[j + 1]) { 14 | arithFlag = false; 15 | } 16 | if (geoArr[j] !== geoArr[j + 1]) { 17 | geoFlag = false; 18 | } 19 | } 20 | 21 | if (arithFlag) { 22 | return 'Arithmetic'; 23 | } else if (geoFlag) { 24 | return 'Geometric'; 25 | } else { 26 | return -1; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Medium/08 - Array Addition.js: -------------------------------------------------------------------------------- 1 | function ArrayAddition (arr) { 2 | var largest = arr.sort(function (a, b) { return a - b; }).pop(); 3 | var sum = 0; 4 | 5 | for (var i = 0; i < arr.length; i++) { 6 | sum += arr[i]; 7 | if (sum === largest) { 8 | return true; 9 | } 10 | 11 | for (var j = 0; j < arr.length; j++) { 12 | if (j !== i) { 13 | sum += arr[j]; 14 | } 15 | if (sum === largest) { 16 | return true; 17 | } 18 | } 19 | 20 | for (var k = 0; k < arr.length; k++) { 21 | if (k !== i) { 22 | sum -= arr[k]; 23 | } 24 | if (sum === largest) { 25 | return true; 26 | } 27 | } 28 | 29 | sum = 0; 30 | } 31 | 32 | return false; 33 | } 34 | -------------------------------------------------------------------------------- /Medium/09 - Binary Converter.js: -------------------------------------------------------------------------------- 1 | function BinaryConverter (str) { 2 | str = str.split('').reverse(); 3 | var sum = 0; 4 | if (str[0] === 1) { 5 | sum += 1; 6 | } 7 | 8 | for (var i = 1; i < str.length; i++) { 9 | if (str[i] === 1) { 10 | sum += Math.pow(2, i); 11 | } 12 | } 13 | 14 | return sum; 15 | } 16 | -------------------------------------------------------------------------------- /Medium/10 - Letter Count.js: -------------------------------------------------------------------------------- 1 | function LetterCount (str) { 2 | var wordArr = str.split(' '); 3 | var currentDif = 0; 4 | var largestDif = 0; 5 | var answer; 6 | var currentWord; 7 | var currentWordLength; 8 | var currentWordR; 9 | var currentWordRLength; 10 | 11 | for (var i = 0; i < wordArr.length; i++) { 12 | currentWord = wordArr[i].split('').sort(); 13 | currentWordLength = currentWord.length; 14 | for (var j = 0; j < currentWordLength - 1; j++) { 15 | if (currentWord[j] === currentWord[j + 1]) { 16 | currentWord.splice(j, 1); 17 | } 18 | } 19 | currentWordR = currentWord; 20 | currentWordRLength = currentWordR.length; 21 | currentDif = (currentWordLength - currentWordRLength); 22 | 23 | if (currentDif > largestDif) { 24 | largestDif = currentDif; 25 | answer = wordArr[i]; 26 | } 27 | } 28 | if (largestDif > 0) { 29 | return answer; 30 | } 31 | return -1; 32 | } 33 | -------------------------------------------------------------------------------- /Medium/11 - Caesar Cipher.js: -------------------------------------------------------------------------------- 1 | function CaesarCipher (str, num) { 2 | var alphaStrLow = 'abcdefghijklmnopqrstuvwxyz'; 3 | var alphaStrUpp = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 4 | var currentLetterInd = 0; 5 | var newLetterInd = 0; 6 | var answer = ''; 7 | var lowerTest = /[a-z]/; 8 | var upperTest = /[A-Z]/; 9 | 10 | for (var i = 0; i < str.length; i++) { 11 | if (upperTest.test(str[i])) { 12 | currentLetterInd = alphaStrUpp.indexOf(str[i]); 13 | newLetterInd = (currentLetterInd + num) % 26; 14 | answer += alphaStrUpp[newLetterInd]; 15 | } else if (lowerTest.test(str[i])) { 16 | currentLetterInd = alphaStrLow.indexOf(str[i]); 17 | newLetterInd = (currentLetterInd + num) % 26; 18 | answer += alphaStrLow[newLetterInd]; 19 | } else { 20 | answer += str[i]; 21 | } 22 | } 23 | 24 | return answer; 25 | } 26 | -------------------------------------------------------------------------------- /Medium/12 - Simple Mode.js: -------------------------------------------------------------------------------- 1 | function SimpleMode (arr) { 2 | var map = {}; 3 | var mode = 0; 4 | var highestFreq = 0; 5 | 6 | for (var i = 0; i < arr.length; i++) { 7 | if (map[arr[i]]) { 8 | map[arr[i]]++; 9 | } else { 10 | map[arr[i]] = 1; 11 | } 12 | } 13 | 14 | for (var j = 0; j < arr.length; j++) { 15 | if (map[arr[j]] > highestFreq) { 16 | highestFreq = map[arr[j]]; 17 | mode = arr[j]; 18 | } 19 | } 20 | 21 | if (highestFreq !== 1) { 22 | return mode; 23 | } 24 | return -1; 25 | } 26 | -------------------------------------------------------------------------------- /Medium/13 - Consecutive.js: -------------------------------------------------------------------------------- 1 | function Consecutive (arr) { 2 | arr = arr.sort(function (a, b) { return a - b; }); 3 | var diffArr = []; 4 | var diffArrSum = 0; 5 | for (var i = 0; i < arr.length - 1; i++) { 6 | diffArr.push((arr[i + 1] - arr[i]) - 1); 7 | } 8 | for (var j = 0; j < diffArr.length; j++) { 9 | diffArrSum += diffArr[j]; 10 | } 11 | return diffArrSum; 12 | } 13 | -------------------------------------------------------------------------------- /Medium/14 - Formatted Division.js: -------------------------------------------------------------------------------- 1 | function FormattedDivision (num1, num2) { 2 | var result = (num1 / num2).toFixed(4); 3 | if (result >= 1000) { 4 | result = result.split(''); 5 | for (var i = result.length - 8; i > 0; i -= 3) { 6 | result.splice(i, 0, ','); 7 | } 8 | result = result.join(''); 9 | } 10 | return result; 11 | } 12 | -------------------------------------------------------------------------------- /Medium/15 - Counting Minutes.js: -------------------------------------------------------------------------------- 1 | function CountingMinutes (str) { 2 | str = str.split('-'); 3 | var startTime = str[0].split(':'); 4 | var endTime = str[1].split(':'); 5 | var startHour = parseInt(startTime[0]); 6 | var startMinutes = parseInt(startTime[1].replace(/[^0-9]/g, '')); 7 | var startAMPM = startTime[1].replace(/[^a-zA-Z]/g, ''); 8 | var endHour = parseInt(endTime[0]); 9 | var endMinutes = parseInt(endTime[1].replace(/[^0-9]/g, '')); 10 | var endAMPM = endTime[1].replace(/[^a-zA-Z]/g, ''); 11 | 12 | if ((startHour !== 12) && (startAMPM === 'pm')) { 13 | startHour += 12; 14 | } 15 | if ((startHour === 12) && (startAMPM === 'am')) { 16 | startHour -= 12; 17 | } 18 | if ((endHour !== 12) && (endAMPM === 'pm')) { 19 | endHour += 12; 20 | } 21 | if ((endHour === 12) && (endAMPM === 'am')) { 22 | endHour -= 12; 23 | } 24 | 25 | var timeDif = ((endHour - startHour) * 60) + (endMinutes - startMinutes); 26 | 27 | if (timeDif < 0) { 28 | return 1440 + timeDif; 29 | } 30 | return timeDif; 31 | } 32 | -------------------------------------------------------------------------------- /Medium/16 - Permutation Step.js: -------------------------------------------------------------------------------- 1 | // Solution by Matt Larsh 2 | // https://github.com/MattLarsh 3 | 4 | function PermutationStep (num) { 5 | var permArr = []; 6 | var usedChars = []; 7 | 8 | function permute (numArr) { 9 | var i; 10 | var ch; 11 | for (i = 0; i < numArr.length; i++) { 12 | ch = numArr.splice(i, 1)[0]; 13 | usedChars.push(ch); 14 | if (numArr.length === 0) { 15 | permArr.push(usedChars.slice()); 16 | } 17 | permute(numArr); 18 | numArr.splice(i, 0, ch); 19 | usedChars.pop(); 20 | } 21 | return permArr; 22 | } 23 | 24 | permute(String(num).split('')); 25 | 26 | for (var i = 0; i < permArr.length; i++) { 27 | permArr[i] = Number(permArr[i].join('')); 28 | } 29 | 30 | permArr = permArr.sort(function (a, b) { 31 | return a - b; 32 | }); 33 | 34 | for (var j = 0; j < permArr.length; j++) { 35 | if (permArr[j] > num) { 36 | return permArr[j]; 37 | } 38 | } 39 | 40 | return -1; 41 | } 42 | -------------------------------------------------------------------------------- /Medium/17 - Prime Checker.js: -------------------------------------------------------------------------------- 1 | function PrimeChecker (num) { 2 | function permute (num) { 3 | num = num.toString().split(''); 4 | var answerArr = []; 5 | var outerLength = num.length; 6 | var innerLength = 1; 7 | var startItem; 8 | var moveItem; 9 | for (var i = 1; i < num.length; i++) { 10 | innerLength *= i; 11 | } 12 | 13 | for (var j = 0; j < outerLength; j++) { 14 | startItem = num[j]; 15 | num.splice(j, 1); 16 | 17 | for (var k = 0; k < innerLength + 1; k++) { 18 | moveItem = num.shift(); 19 | num.splice(k, 0, moveItem); 20 | if (k < innerLength) { 21 | answerArr.push(parseInt(startItem + num.join(''))); 22 | } 23 | } 24 | num.splice(j, 0, startItem); 25 | } 26 | return answerArr; 27 | } 28 | 29 | function isPrime (num) { 30 | for (var i = 2; i < num; i++) { 31 | if (num % i === 0) { 32 | return false; 33 | } 34 | } 35 | if (num === 1) { 36 | return false; 37 | } 38 | return true; 39 | } 40 | 41 | var possibleCombos = permute(num); 42 | var foundPerms = 0; 43 | 44 | for (var k = 0; k < possibleCombos.length; k++) { 45 | if (isPrime(possibleCombos[k])) { 46 | foundPerms = 1; 47 | } 48 | } 49 | 50 | return foundPerms; 51 | } 52 | -------------------------------------------------------------------------------- /Medium/18 - Dash Insert II.js: -------------------------------------------------------------------------------- 1 | function DashInsertII (num) { 2 | num = num.toString().split(''); 3 | var answer = ''; 4 | for (var i = 0; i < num.length; i++) { 5 | if ((num[i] % 2 === 1) && (num[i + 1] % 2 === 1)) { 6 | answer += num[i] + '-'; 7 | } else if ((num[i] !== 0) && (num[i + 1] !== 0) && (num[i] % 2 === 0) && (num[i + 1] % 2 === 0)) { 8 | answer += num[i] + '*'; 9 | } else { 10 | answer += num[i]; 11 | } 12 | } 13 | return answer; 14 | } 15 | -------------------------------------------------------------------------------- /Medium/19 - Swap II.js: -------------------------------------------------------------------------------- 1 | function SwapII (str) { 2 | // Regex to match any upper or lowercase character 3 | var testChar = /[a-zA-Z]/; 4 | // Regex to match a number, followed by any number (but at least one) alpha characters, followed by a number 5 | var testSwap = /[0-9][a-zA-Z]+[0-9]/g; 6 | var result = ''; 7 | 8 | // Loop over the input string... 9 | for (var i = 0; i < str.length; i++) { 10 | // If the character is alphabetic... 11 | if (testChar.test(str[i])) { 12 | // ...and change it to lowercase if it's uppercase, and uppercase if it's lowercase 13 | if (str[i] === str[i].toUpperCase()) { 14 | result += str[i].toLowerCase(); 15 | } else if (str[i] === str[i].toLowerCase()) { 16 | result += str[i].toUpperCase(); 17 | } 18 | // If it's some other character, add it to our result string. 19 | } else { 20 | result += str[i]; 21 | } 22 | } 23 | // Next, we use the .match method to return all substrings that meet the criteria of testSwap. 24 | var numSwaps = result.match(testSwap); 25 | // If there are matches... 26 | if (numSwaps !== null) { 27 | // Loop over the array of substrings and replace each one with the same string's first and last characters swapped 28 | for (var j = 0; j < numSwaps.length; j++) { 29 | result = result.replace(numSwaps[j], numSwaps[j][numSwaps[j].length - 1] + numSwaps[j].substr(1, numSwaps[j].length - 2) + numSwaps[j][0]); 30 | } 31 | } 32 | // Finally, we return our result 33 | return result; 34 | } 35 | -------------------------------------------------------------------------------- /Medium/20 - Number Search.js: -------------------------------------------------------------------------------- 1 | function NumberSearch (str) { 2 | var notAlpha = /[^a-zA-Z]/g; 3 | var notNum = /[^0-9]/g; 4 | var sum = 0; 5 | var alphaCount = 0; 6 | 7 | var strAlpha = str.replace(notAlpha, ''); 8 | var strNum = str.replace(notNum, ''); 9 | 10 | for (var i = 0; i < strAlpha.length; i++) { 11 | alphaCount++; 12 | } 13 | 14 | for (var j = 0; j < strNum.length; j++) { 15 | sum += parseInt(strNum[j]); 16 | } 17 | 18 | return Math.round(sum / alphaCount); 19 | } 20 | -------------------------------------------------------------------------------- /Medium/21 - Triple Double.js: -------------------------------------------------------------------------------- 1 | function TripleDouble (num1, num2) { 2 | num1 = num1.toString(); 3 | num2 = num2.toString(); 4 | var triples = []; 5 | var doubles = []; 6 | 7 | for (var i = 0; i < num1.length; i++) { 8 | if ((num1[i] === num1[i + 1]) && (num1[i] === num1[i + 2])) { 9 | triples.push(num1[i] + num1[i + 1]); 10 | } 11 | } 12 | for (var j = 0; j < num2.length; j++) { 13 | if (num2[j] === num2[j + 1]) { 14 | doubles.push(num2[j] + num2[j + 1]); 15 | } 16 | } 17 | 18 | for (var k = 0; k < triples.length; k++) { 19 | if (triples.indexOf(doubles[k]) !== -1) { 20 | return 1; 21 | } 22 | } 23 | return 0; 24 | } 25 | -------------------------------------------------------------------------------- /Medium/22 - Bracket Matcher.js: -------------------------------------------------------------------------------- 1 | function BracketMatcher (str) { 2 | var leftCount = 0; 3 | var rightCount = 0; 4 | 5 | for (var i = 0; i < str.length; i++) { 6 | if (str[i] === '(') { 7 | leftCount++; 8 | } else if (str[i] === ')') { 9 | rightCount++; 10 | } 11 | if (rightCount > leftCount) { 12 | return 0; 13 | } 14 | } 15 | 16 | if (leftCount === rightCount) { 17 | return 1; 18 | } 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /Medium/23 - String Reduction.js: -------------------------------------------------------------------------------- 1 | function StringReduction (str) { 2 | str = str.split(''); 3 | 4 | function notAllSame () { 5 | for (var j = 0; j < str.length; j++) { 6 | if (str[0] === str[j]) { 7 | continue; 8 | } else { 9 | return true; 10 | } 11 | } 12 | return false; 13 | } 14 | 15 | while (notAllSame()) { 16 | for (var i = 0; i < str.length; i++) { 17 | if (str[i] + str[i + 1] === 'ab') { 18 | str.splice(i, 2, 'c'); 19 | } 20 | if ((str[i] === 'a') && (str[i + 1] === 'c')) { 21 | str.splice(0, 2, 'b'); 22 | } 23 | if ((str[i] === 'b') && (str[i + 1] === 'c')) { 24 | str.splice(i, 2, 'a'); 25 | } 26 | if ((str[i] === 'b') && (str[i + 1] === 'a')) { 27 | str.splice(i, 2, 'c'); 28 | } 29 | if ((str[i] === 'c') && (str[i + 1] === 'b')) { 30 | str.splice(i, 2, 'a'); 31 | } 32 | if ((str[i] === 'c') && (str[i + 1] === 'a')) { 33 | str.splice(i, 2, 'b'); 34 | } 35 | } 36 | } 37 | return str.length; 38 | } 39 | -------------------------------------------------------------------------------- /Medium/24 - Three Five Multiples.js: -------------------------------------------------------------------------------- 1 | function ThreeFiveMultiples (num) { 2 | var sum = 0; 3 | for (var i = 0; i < num; i++) { 4 | if ((i % 3 === 0) || (i % 5 === 0)) { 5 | sum += i; 6 | } 7 | } 8 | return sum; 9 | } 10 | -------------------------------------------------------------------------------- /Medium/26 - Fibonacci Checker.js: -------------------------------------------------------------------------------- 1 | function FibonacciChecker (num) { 2 | var fibSeq = [0, 1]; 3 | for (var i = 0; i <= 100000; i++) { 4 | fibSeq.push(fibSeq[i] + fibSeq[i + 1]); 5 | } 6 | if (fibSeq.indexOf(num) !== -1) { 7 | return 'yes'; 8 | } else { 9 | return 'no'; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Medium/27 - Multiple Brackets.js: -------------------------------------------------------------------------------- 1 | function MultipleBrackets (str) { 2 | var leftPCount = 0; 3 | var rightPCount = 0; 4 | var leftBCount = 0; 5 | var rightBCount = 0; 6 | 7 | for (var i = 0; i <= str.length; i++) { 8 | if (str[i] === '(') { 9 | leftPCount++; 10 | } else if (str[i] === ')') { 11 | rightPCount++; 12 | } 13 | if (rightPCount > leftPCount) { 14 | return 0; 15 | } 16 | 17 | if (str[i] === '[') { 18 | leftBCount++; 19 | } else if (str[i] === ']') { 20 | rightBCount++; 21 | } 22 | if (rightBCount > leftBCount) { 23 | return 0; 24 | } 25 | } 26 | 27 | if ((leftPCount === rightPCount) && (leftBCount === rightBCount)) { 28 | return '1 ' + (leftPCount + leftBCount); 29 | } 30 | return 0; 31 | } 32 | -------------------------------------------------------------------------------- /Medium/29 - Look Say Sequence.js: -------------------------------------------------------------------------------- 1 | // Step-by-step 2 | function LookSaySequence (num) { 3 | // First, we create a result variable to hold the string we're going to return 4 | var result = ''; 5 | 6 | // Appending an empty string to our input number type coerces it into a string 7 | // This allows us to add numbers to it without JavaScript thinking we want to perform arithmetic 8 | num = num + ''; 9 | 10 | // Next, we create variables to hold our current number (intializing it to the first number in the sequence) and a counter variable to capture how many times the number has been repeated 11 | var currentNum = num[0]; 12 | var counter = 1; 13 | 14 | // After our set-up variables have been created, we loop over each character in our input number 15 | // Note that we start from position 1 rather than 0 due to initializing our currentNumber to num[0] 16 | for (var i = 1; i < num.length; i++) { 17 | // If the current number is not the same as the number our loop iterates over... 18 | if (currentNum !== num[i]) { 19 | // We add the counter and current number to our result... 20 | result += counter; 21 | result += currentNum; 22 | // ...and change the current number to the new, different number/reset the counter to 1 23 | currentNum = num[i]; 24 | counter = 1; 25 | } else { 26 | // If the number is the same, we increment the counter 27 | counter++; 28 | } 29 | } 30 | // As the above loop won't fire for the last digit in the input number, we add the counter and current number to our result one last time 31 | result += counter; 32 | result += currentNum; 33 | // Finally, we return our result string 34 | return result; 35 | } 36 | 37 | // No comments 38 | function LookSaySequence (num) { 39 | var result = ''; 40 | num = num + ''; 41 | var currentNum = num[0]; 42 | var counter = 1; 43 | for (var i = 1; i < num.length; i++) { 44 | if (currentNum !== num[i]) { 45 | result += counter; 46 | result += currentNum; 47 | currentNum = num[i]; 48 | counter = 1; 49 | } else { 50 | counter++; 51 | } 52 | } 53 | result += counter; 54 | result += currentNum; 55 | return result; 56 | } 57 | -------------------------------------------------------------------------------- /Medium/30 - Distinct List.js: -------------------------------------------------------------------------------- 1 | function DistinctList (arr) { 2 | arr = arr.sort(function (a, b) { return a - b; }); 3 | var startLength = arr.length; 4 | for (var i = arr.length - 1; i > 0; i--) { 5 | if (arr[i] === arr[i - 1]) { 6 | arr.splice(i, 1); 7 | } 8 | } 9 | var endLength = arr.length; 10 | 11 | return startLength - endLength; 12 | } 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Coderbyte-Solutions 2 | =================== 3 | 4 | After finishing all of Coderbyte's easy and medium challenges, I thought it might be useful for both myself (and anyone else learning javascript by completing these challenges) to go back through each challenge with cleaner/well-commented code. Note that this repo is aimed at allowing novice programmers the ability to follow along and are by no means the most optimized/best solutions. 5 | 6 | #### Feel free to contribute your own solutions or improve upon the ones I've created! 7 | 8 | - When contributing, please be sure to lint your solutions prior to submission 9 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "coderbyte-solutions", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "acorn": { 8 | "version": "5.4.1", 9 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", 10 | "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==", 11 | "dev": true 12 | }, 13 | "acorn-jsx": { 14 | "version": "3.0.1", 15 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", 16 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", 17 | "dev": true, 18 | "requires": { 19 | "acorn": "3.3.0" 20 | }, 21 | "dependencies": { 22 | "acorn": { 23 | "version": "3.3.0", 24 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", 25 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", 26 | "dev": true 27 | } 28 | } 29 | }, 30 | "ajv": { 31 | "version": "5.5.2", 32 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 33 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 34 | "dev": true, 35 | "requires": { 36 | "co": "4.6.0", 37 | "fast-deep-equal": "1.0.0", 38 | "fast-json-stable-stringify": "2.0.0", 39 | "json-schema-traverse": "0.3.1" 40 | } 41 | }, 42 | "ajv-keywords": { 43 | "version": "2.1.1", 44 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", 45 | "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", 46 | "dev": true 47 | }, 48 | "ansi-escapes": { 49 | "version": "3.0.0", 50 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", 51 | "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", 52 | "dev": true 53 | }, 54 | "ansi-regex": { 55 | "version": "2.1.1", 56 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 57 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 58 | "dev": true 59 | }, 60 | "ansi-styles": { 61 | "version": "2.2.1", 62 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 63 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 64 | "dev": true 65 | }, 66 | "argparse": { 67 | "version": "1.0.9", 68 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", 69 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", 70 | "dev": true, 71 | "requires": { 72 | "sprintf-js": "1.0.3" 73 | } 74 | }, 75 | "array-union": { 76 | "version": "1.0.2", 77 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 78 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 79 | "dev": true, 80 | "requires": { 81 | "array-uniq": "1.0.3" 82 | } 83 | }, 84 | "array-uniq": { 85 | "version": "1.0.3", 86 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 87 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 88 | "dev": true 89 | }, 90 | "arrify": { 91 | "version": "1.0.1", 92 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 93 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 94 | "dev": true 95 | }, 96 | "babel-code-frame": { 97 | "version": "6.26.0", 98 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 99 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 100 | "dev": true, 101 | "requires": { 102 | "chalk": "1.1.3", 103 | "esutils": "2.0.2", 104 | "js-tokens": "3.0.2" 105 | }, 106 | "dependencies": { 107 | "chalk": { 108 | "version": "1.1.3", 109 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 110 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 111 | "dev": true, 112 | "requires": { 113 | "ansi-styles": "2.2.1", 114 | "escape-string-regexp": "1.0.5", 115 | "has-ansi": "2.0.0", 116 | "strip-ansi": "3.0.1", 117 | "supports-color": "2.0.0" 118 | } 119 | }, 120 | "strip-ansi": { 121 | "version": "3.0.1", 122 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 123 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 124 | "dev": true, 125 | "requires": { 126 | "ansi-regex": "2.1.1" 127 | } 128 | } 129 | } 130 | }, 131 | "balanced-match": { 132 | "version": "1.0.0", 133 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 134 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 135 | "dev": true 136 | }, 137 | "brace-expansion": { 138 | "version": "1.1.8", 139 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 140 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 141 | "dev": true, 142 | "requires": { 143 | "balanced-match": "1.0.0", 144 | "concat-map": "0.0.1" 145 | } 146 | }, 147 | "builtin-modules": { 148 | "version": "1.1.1", 149 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 150 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 151 | "dev": true 152 | }, 153 | "caller-path": { 154 | "version": "0.1.0", 155 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 156 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 157 | "dev": true, 158 | "requires": { 159 | "callsites": "0.2.0" 160 | } 161 | }, 162 | "callsites": { 163 | "version": "0.2.0", 164 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 165 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 166 | "dev": true 167 | }, 168 | "chalk": { 169 | "version": "2.3.0", 170 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", 171 | "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", 172 | "dev": true, 173 | "requires": { 174 | "ansi-styles": "3.2.0", 175 | "escape-string-regexp": "1.0.5", 176 | "supports-color": "4.5.0" 177 | }, 178 | "dependencies": { 179 | "ansi-styles": { 180 | "version": "3.2.0", 181 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", 182 | "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", 183 | "dev": true, 184 | "requires": { 185 | "color-convert": "1.9.1" 186 | } 187 | }, 188 | "supports-color": { 189 | "version": "4.5.0", 190 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", 191 | "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", 192 | "dev": true, 193 | "requires": { 194 | "has-flag": "2.0.0" 195 | } 196 | } 197 | } 198 | }, 199 | "chardet": { 200 | "version": "0.4.2", 201 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", 202 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", 203 | "dev": true 204 | }, 205 | "circular-json": { 206 | "version": "0.3.3", 207 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 208 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 209 | "dev": true 210 | }, 211 | "cli-cursor": { 212 | "version": "2.1.0", 213 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 214 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 215 | "dev": true, 216 | "requires": { 217 | "restore-cursor": "2.0.0" 218 | } 219 | }, 220 | "cli-width": { 221 | "version": "2.2.0", 222 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 223 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 224 | "dev": true 225 | }, 226 | "co": { 227 | "version": "4.6.0", 228 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 229 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 230 | "dev": true 231 | }, 232 | "color-convert": { 233 | "version": "1.9.1", 234 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", 235 | "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", 236 | "dev": true, 237 | "requires": { 238 | "color-name": "1.1.3" 239 | } 240 | }, 241 | "color-name": { 242 | "version": "1.1.3", 243 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 244 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 245 | "dev": true 246 | }, 247 | "concat-map": { 248 | "version": "0.0.1", 249 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 250 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 251 | "dev": true 252 | }, 253 | "concat-stream": { 254 | "version": "1.6.0", 255 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", 256 | "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", 257 | "dev": true, 258 | "requires": { 259 | "inherits": "2.0.3", 260 | "readable-stream": "2.3.3", 261 | "typedarray": "0.0.6" 262 | } 263 | }, 264 | "contains-path": { 265 | "version": "0.1.0", 266 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 267 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 268 | "dev": true 269 | }, 270 | "core-util-is": { 271 | "version": "1.0.2", 272 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 273 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 274 | "dev": true 275 | }, 276 | "cross-spawn": { 277 | "version": "5.1.0", 278 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 279 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 280 | "dev": true, 281 | "requires": { 282 | "lru-cache": "4.1.1", 283 | "shebang-command": "1.2.0", 284 | "which": "1.3.0" 285 | } 286 | }, 287 | "debug": { 288 | "version": "3.1.0", 289 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 290 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 291 | "dev": true, 292 | "requires": { 293 | "ms": "2.0.0" 294 | } 295 | }, 296 | "deep-is": { 297 | "version": "0.1.3", 298 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 299 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 300 | "dev": true 301 | }, 302 | "del": { 303 | "version": "2.2.2", 304 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", 305 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 306 | "dev": true, 307 | "requires": { 308 | "globby": "5.0.0", 309 | "is-path-cwd": "1.0.0", 310 | "is-path-in-cwd": "1.0.0", 311 | "object-assign": "4.1.1", 312 | "pify": "2.3.0", 313 | "pinkie-promise": "2.0.1", 314 | "rimraf": "2.6.2" 315 | } 316 | }, 317 | "doctrine": { 318 | "version": "2.1.0", 319 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 320 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 321 | "dev": true, 322 | "requires": { 323 | "esutils": "2.0.2" 324 | } 325 | }, 326 | "error-ex": { 327 | "version": "1.3.1", 328 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", 329 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", 330 | "dev": true, 331 | "requires": { 332 | "is-arrayish": "0.2.1" 333 | } 334 | }, 335 | "escape-string-regexp": { 336 | "version": "1.0.5", 337 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 338 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 339 | "dev": true 340 | }, 341 | "eslint": { 342 | "version": "4.17.0", 343 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.17.0.tgz", 344 | "integrity": "sha512-AyxBUCANU/o/xC0ijGMKavo5Ls3oK6xykiOITlMdjFjrKOsqLrA7Nf5cnrDgcKrHzBirclAZt63XO7YZlVUPwA==", 345 | "dev": true, 346 | "requires": { 347 | "ajv": "5.5.2", 348 | "babel-code-frame": "6.26.0", 349 | "chalk": "2.3.0", 350 | "concat-stream": "1.6.0", 351 | "cross-spawn": "5.1.0", 352 | "debug": "3.1.0", 353 | "doctrine": "2.1.0", 354 | "eslint-scope": "3.7.1", 355 | "eslint-visitor-keys": "1.0.0", 356 | "espree": "3.5.3", 357 | "esquery": "1.0.0", 358 | "esutils": "2.0.2", 359 | "file-entry-cache": "2.0.0", 360 | "functional-red-black-tree": "1.0.1", 361 | "glob": "7.1.2", 362 | "globals": "11.3.0", 363 | "ignore": "3.3.7", 364 | "imurmurhash": "0.1.4", 365 | "inquirer": "3.3.0", 366 | "is-resolvable": "1.1.0", 367 | "js-yaml": "3.10.0", 368 | "json-stable-stringify-without-jsonify": "1.0.1", 369 | "levn": "0.3.0", 370 | "lodash": "4.17.5", 371 | "minimatch": "3.0.4", 372 | "mkdirp": "0.5.1", 373 | "natural-compare": "1.4.0", 374 | "optionator": "0.8.2", 375 | "path-is-inside": "1.0.2", 376 | "pluralize": "7.0.0", 377 | "progress": "2.0.0", 378 | "require-uncached": "1.0.3", 379 | "semver": "5.5.0", 380 | "strip-ansi": "4.0.0", 381 | "strip-json-comments": "2.0.1", 382 | "table": "4.0.2", 383 | "text-table": "0.2.0" 384 | } 385 | }, 386 | "eslint-config-standard": { 387 | "version": "11.0.0-beta.0", 388 | "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-11.0.0-beta.0.tgz", 389 | "integrity": "sha512-f+vs5HAHQo7NRZ3hVe+UVdT5DbebMNaFTWFp95orJ0LUdYPoWdM8xw/bMeO/IZMvHOPmIteGKGc2QOhSXd5nRg==", 390 | "dev": true 391 | }, 392 | "eslint-import-resolver-node": { 393 | "version": "0.3.2", 394 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", 395 | "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", 396 | "dev": true, 397 | "requires": { 398 | "debug": "2.6.9", 399 | "resolve": "1.5.0" 400 | }, 401 | "dependencies": { 402 | "debug": { 403 | "version": "2.6.9", 404 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 405 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 406 | "dev": true, 407 | "requires": { 408 | "ms": "2.0.0" 409 | } 410 | } 411 | } 412 | }, 413 | "eslint-module-utils": { 414 | "version": "2.1.1", 415 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", 416 | "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", 417 | "dev": true, 418 | "requires": { 419 | "debug": "2.6.9", 420 | "pkg-dir": "1.0.0" 421 | }, 422 | "dependencies": { 423 | "debug": { 424 | "version": "2.6.9", 425 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 426 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 427 | "dev": true, 428 | "requires": { 429 | "ms": "2.0.0" 430 | } 431 | } 432 | } 433 | }, 434 | "eslint-plugin-import": { 435 | "version": "2.8.0", 436 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", 437 | "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", 438 | "dev": true, 439 | "requires": { 440 | "builtin-modules": "1.1.1", 441 | "contains-path": "0.1.0", 442 | "debug": "2.6.9", 443 | "doctrine": "1.5.0", 444 | "eslint-import-resolver-node": "0.3.2", 445 | "eslint-module-utils": "2.1.1", 446 | "has": "1.0.1", 447 | "lodash.cond": "4.5.2", 448 | "minimatch": "3.0.4", 449 | "read-pkg-up": "2.0.0" 450 | }, 451 | "dependencies": { 452 | "debug": { 453 | "version": "2.6.9", 454 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 455 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 456 | "dev": true, 457 | "requires": { 458 | "ms": "2.0.0" 459 | } 460 | }, 461 | "doctrine": { 462 | "version": "1.5.0", 463 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 464 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 465 | "dev": true, 466 | "requires": { 467 | "esutils": "2.0.2", 468 | "isarray": "1.0.0" 469 | } 470 | } 471 | } 472 | }, 473 | "eslint-plugin-node": { 474 | "version": "6.0.0", 475 | "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-6.0.0.tgz", 476 | "integrity": "sha512-Qj4dMF1N/wRALO1IRvnchn8c1i0awgrztrGx7MjF9ewDwlW/heNB+WeZ09bhp8Yp0TD+BZcADP8BRya0wmropA==", 477 | "dev": true, 478 | "requires": { 479 | "ignore": "3.3.7", 480 | "minimatch": "3.0.4", 481 | "resolve": "1.5.0", 482 | "semver": "5.5.0" 483 | } 484 | }, 485 | "eslint-plugin-promise": { 486 | "version": "3.6.0", 487 | "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz", 488 | "integrity": "sha512-YQzM6TLTlApAr7Li8vWKR+K3WghjwKcYzY0d2roWap4SLK+kzuagJX/leTetIDWsFcTFnKNJXWupDCD6aZkP2Q==", 489 | "dev": true 490 | }, 491 | "eslint-plugin-standard": { 492 | "version": "3.0.1", 493 | "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", 494 | "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", 495 | "dev": true 496 | }, 497 | "eslint-scope": { 498 | "version": "3.7.1", 499 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", 500 | "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", 501 | "dev": true, 502 | "requires": { 503 | "esrecurse": "4.2.0", 504 | "estraverse": "4.2.0" 505 | } 506 | }, 507 | "eslint-visitor-keys": { 508 | "version": "1.0.0", 509 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 510 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", 511 | "dev": true 512 | }, 513 | "espree": { 514 | "version": "3.5.3", 515 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.3.tgz", 516 | "integrity": "sha512-Zy3tAJDORxQZLl2baguiRU1syPERAIg0L+JB2MWorORgTu/CplzvxS9WWA7Xh4+Q+eOQihNs/1o1Xep8cvCxWQ==", 517 | "dev": true, 518 | "requires": { 519 | "acorn": "5.4.1", 520 | "acorn-jsx": "3.0.1" 521 | } 522 | }, 523 | "esprima": { 524 | "version": "4.0.0", 525 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", 526 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", 527 | "dev": true 528 | }, 529 | "esquery": { 530 | "version": "1.0.0", 531 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", 532 | "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", 533 | "dev": true, 534 | "requires": { 535 | "estraverse": "4.2.0" 536 | } 537 | }, 538 | "esrecurse": { 539 | "version": "4.2.0", 540 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", 541 | "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", 542 | "dev": true, 543 | "requires": { 544 | "estraverse": "4.2.0", 545 | "object-assign": "4.1.1" 546 | } 547 | }, 548 | "estraverse": { 549 | "version": "4.2.0", 550 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 551 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 552 | "dev": true 553 | }, 554 | "esutils": { 555 | "version": "2.0.2", 556 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 557 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 558 | "dev": true 559 | }, 560 | "external-editor": { 561 | "version": "2.1.0", 562 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", 563 | "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", 564 | "dev": true, 565 | "requires": { 566 | "chardet": "0.4.2", 567 | "iconv-lite": "0.4.19", 568 | "tmp": "0.0.33" 569 | } 570 | }, 571 | "fast-deep-equal": { 572 | "version": "1.0.0", 573 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", 574 | "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", 575 | "dev": true 576 | }, 577 | "fast-json-stable-stringify": { 578 | "version": "2.0.0", 579 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 580 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 581 | "dev": true 582 | }, 583 | "fast-levenshtein": { 584 | "version": "2.0.6", 585 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 586 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 587 | "dev": true 588 | }, 589 | "figures": { 590 | "version": "2.0.0", 591 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 592 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 593 | "dev": true, 594 | "requires": { 595 | "escape-string-regexp": "1.0.5" 596 | } 597 | }, 598 | "file-entry-cache": { 599 | "version": "2.0.0", 600 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 601 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 602 | "dev": true, 603 | "requires": { 604 | "flat-cache": "1.3.0", 605 | "object-assign": "4.1.1" 606 | } 607 | }, 608 | "find-up": { 609 | "version": "1.1.2", 610 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 611 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 612 | "dev": true, 613 | "requires": { 614 | "path-exists": "2.1.0", 615 | "pinkie-promise": "2.0.1" 616 | } 617 | }, 618 | "flat-cache": { 619 | "version": "1.3.0", 620 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", 621 | "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", 622 | "dev": true, 623 | "requires": { 624 | "circular-json": "0.3.3", 625 | "del": "2.2.2", 626 | "graceful-fs": "4.1.11", 627 | "write": "0.2.1" 628 | } 629 | }, 630 | "fs.realpath": { 631 | "version": "1.0.0", 632 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 633 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 634 | "dev": true 635 | }, 636 | "function-bind": { 637 | "version": "1.1.1", 638 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 639 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 640 | "dev": true 641 | }, 642 | "functional-red-black-tree": { 643 | "version": "1.0.1", 644 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 645 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 646 | "dev": true 647 | }, 648 | "glob": { 649 | "version": "7.1.2", 650 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 651 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 652 | "dev": true, 653 | "requires": { 654 | "fs.realpath": "1.0.0", 655 | "inflight": "1.0.6", 656 | "inherits": "2.0.3", 657 | "minimatch": "3.0.4", 658 | "once": "1.4.0", 659 | "path-is-absolute": "1.0.1" 660 | } 661 | }, 662 | "globals": { 663 | "version": "11.3.0", 664 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", 665 | "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==", 666 | "dev": true 667 | }, 668 | "globby": { 669 | "version": "5.0.0", 670 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", 671 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 672 | "dev": true, 673 | "requires": { 674 | "array-union": "1.0.2", 675 | "arrify": "1.0.1", 676 | "glob": "7.1.2", 677 | "object-assign": "4.1.1", 678 | "pify": "2.3.0", 679 | "pinkie-promise": "2.0.1" 680 | } 681 | }, 682 | "graceful-fs": { 683 | "version": "4.1.11", 684 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 685 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 686 | "dev": true 687 | }, 688 | "has": { 689 | "version": "1.0.1", 690 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", 691 | "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", 692 | "dev": true, 693 | "requires": { 694 | "function-bind": "1.1.1" 695 | } 696 | }, 697 | "has-ansi": { 698 | "version": "2.0.0", 699 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 700 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 701 | "dev": true, 702 | "requires": { 703 | "ansi-regex": "2.1.1" 704 | } 705 | }, 706 | "has-flag": { 707 | "version": "2.0.0", 708 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 709 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 710 | "dev": true 711 | }, 712 | "hosted-git-info": { 713 | "version": "2.5.0", 714 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", 715 | "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", 716 | "dev": true 717 | }, 718 | "iconv-lite": { 719 | "version": "0.4.19", 720 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 721 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", 722 | "dev": true 723 | }, 724 | "ignore": { 725 | "version": "3.3.7", 726 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", 727 | "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", 728 | "dev": true 729 | }, 730 | "imurmurhash": { 731 | "version": "0.1.4", 732 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 733 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 734 | "dev": true 735 | }, 736 | "inflight": { 737 | "version": "1.0.6", 738 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 739 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 740 | "dev": true, 741 | "requires": { 742 | "once": "1.4.0", 743 | "wrappy": "1.0.2" 744 | } 745 | }, 746 | "inherits": { 747 | "version": "2.0.3", 748 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 749 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 750 | "dev": true 751 | }, 752 | "inquirer": { 753 | "version": "3.3.0", 754 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", 755 | "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", 756 | "dev": true, 757 | "requires": { 758 | "ansi-escapes": "3.0.0", 759 | "chalk": "2.3.0", 760 | "cli-cursor": "2.1.0", 761 | "cli-width": "2.2.0", 762 | "external-editor": "2.1.0", 763 | "figures": "2.0.0", 764 | "lodash": "4.17.5", 765 | "mute-stream": "0.0.7", 766 | "run-async": "2.3.0", 767 | "rx-lite": "4.0.8", 768 | "rx-lite-aggregates": "4.0.8", 769 | "string-width": "2.1.1", 770 | "strip-ansi": "4.0.0", 771 | "through": "2.3.8" 772 | } 773 | }, 774 | "is-arrayish": { 775 | "version": "0.2.1", 776 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 777 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 778 | "dev": true 779 | }, 780 | "is-builtin-module": { 781 | "version": "1.0.0", 782 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 783 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 784 | "dev": true, 785 | "requires": { 786 | "builtin-modules": "1.1.1" 787 | } 788 | }, 789 | "is-fullwidth-code-point": { 790 | "version": "2.0.0", 791 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 792 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 793 | "dev": true 794 | }, 795 | "is-path-cwd": { 796 | "version": "1.0.0", 797 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 798 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 799 | "dev": true 800 | }, 801 | "is-path-in-cwd": { 802 | "version": "1.0.0", 803 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", 804 | "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", 805 | "dev": true, 806 | "requires": { 807 | "is-path-inside": "1.0.1" 808 | } 809 | }, 810 | "is-path-inside": { 811 | "version": "1.0.1", 812 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 813 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 814 | "dev": true, 815 | "requires": { 816 | "path-is-inside": "1.0.2" 817 | } 818 | }, 819 | "is-promise": { 820 | "version": "2.1.0", 821 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 822 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 823 | "dev": true 824 | }, 825 | "is-resolvable": { 826 | "version": "1.1.0", 827 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", 828 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", 829 | "dev": true 830 | }, 831 | "isarray": { 832 | "version": "1.0.0", 833 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 834 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 835 | "dev": true 836 | }, 837 | "isexe": { 838 | "version": "2.0.0", 839 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 840 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 841 | "dev": true 842 | }, 843 | "js-tokens": { 844 | "version": "3.0.2", 845 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 846 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 847 | "dev": true 848 | }, 849 | "js-yaml": { 850 | "version": "3.10.0", 851 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", 852 | "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", 853 | "dev": true, 854 | "requires": { 855 | "argparse": "1.0.9", 856 | "esprima": "4.0.0" 857 | } 858 | }, 859 | "json-schema-traverse": { 860 | "version": "0.3.1", 861 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 862 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 863 | "dev": true 864 | }, 865 | "json-stable-stringify-without-jsonify": { 866 | "version": "1.0.1", 867 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 868 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 869 | "dev": true 870 | }, 871 | "levn": { 872 | "version": "0.3.0", 873 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 874 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 875 | "dev": true, 876 | "requires": { 877 | "prelude-ls": "1.1.2", 878 | "type-check": "0.3.2" 879 | } 880 | }, 881 | "load-json-file": { 882 | "version": "2.0.0", 883 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 884 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 885 | "dev": true, 886 | "requires": { 887 | "graceful-fs": "4.1.11", 888 | "parse-json": "2.2.0", 889 | "pify": "2.3.0", 890 | "strip-bom": "3.0.0" 891 | } 892 | }, 893 | "locate-path": { 894 | "version": "2.0.0", 895 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 896 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 897 | "dev": true, 898 | "requires": { 899 | "p-locate": "2.0.0", 900 | "path-exists": "3.0.0" 901 | }, 902 | "dependencies": { 903 | "path-exists": { 904 | "version": "3.0.0", 905 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 906 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 907 | "dev": true 908 | } 909 | } 910 | }, 911 | "lodash": { 912 | "version": "4.17.5", 913 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", 914 | "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", 915 | "dev": true 916 | }, 917 | "lodash.cond": { 918 | "version": "4.5.2", 919 | "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", 920 | "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", 921 | "dev": true 922 | }, 923 | "lru-cache": { 924 | "version": "4.1.1", 925 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", 926 | "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", 927 | "dev": true, 928 | "requires": { 929 | "pseudomap": "1.0.2", 930 | "yallist": "2.1.2" 931 | } 932 | }, 933 | "mimic-fn": { 934 | "version": "1.2.0", 935 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 936 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 937 | "dev": true 938 | }, 939 | "minimatch": { 940 | "version": "3.0.4", 941 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 942 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 943 | "dev": true, 944 | "requires": { 945 | "brace-expansion": "1.1.8" 946 | } 947 | }, 948 | "minimist": { 949 | "version": "0.0.8", 950 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 951 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 952 | "dev": true 953 | }, 954 | "mkdirp": { 955 | "version": "0.5.1", 956 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 957 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 958 | "dev": true, 959 | "requires": { 960 | "minimist": "0.0.8" 961 | } 962 | }, 963 | "ms": { 964 | "version": "2.0.0", 965 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 966 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 967 | "dev": true 968 | }, 969 | "mute-stream": { 970 | "version": "0.0.7", 971 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 972 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 973 | "dev": true 974 | }, 975 | "natural-compare": { 976 | "version": "1.4.0", 977 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 978 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 979 | "dev": true 980 | }, 981 | "normalize-package-data": { 982 | "version": "2.4.0", 983 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 984 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 985 | "dev": true, 986 | "requires": { 987 | "hosted-git-info": "2.5.0", 988 | "is-builtin-module": "1.0.0", 989 | "semver": "5.5.0", 990 | "validate-npm-package-license": "3.0.1" 991 | } 992 | }, 993 | "object-assign": { 994 | "version": "4.1.1", 995 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 996 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 997 | "dev": true 998 | }, 999 | "once": { 1000 | "version": "1.4.0", 1001 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1002 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1003 | "dev": true, 1004 | "requires": { 1005 | "wrappy": "1.0.2" 1006 | } 1007 | }, 1008 | "onetime": { 1009 | "version": "2.0.1", 1010 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1011 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1012 | "dev": true, 1013 | "requires": { 1014 | "mimic-fn": "1.2.0" 1015 | } 1016 | }, 1017 | "optionator": { 1018 | "version": "0.8.2", 1019 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1020 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1021 | "dev": true, 1022 | "requires": { 1023 | "deep-is": "0.1.3", 1024 | "fast-levenshtein": "2.0.6", 1025 | "levn": "0.3.0", 1026 | "prelude-ls": "1.1.2", 1027 | "type-check": "0.3.2", 1028 | "wordwrap": "1.0.0" 1029 | } 1030 | }, 1031 | "os-tmpdir": { 1032 | "version": "1.0.2", 1033 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1034 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1035 | "dev": true 1036 | }, 1037 | "p-limit": { 1038 | "version": "1.2.0", 1039 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", 1040 | "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", 1041 | "dev": true, 1042 | "requires": { 1043 | "p-try": "1.0.0" 1044 | } 1045 | }, 1046 | "p-locate": { 1047 | "version": "2.0.0", 1048 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1049 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1050 | "dev": true, 1051 | "requires": { 1052 | "p-limit": "1.2.0" 1053 | } 1054 | }, 1055 | "p-try": { 1056 | "version": "1.0.0", 1057 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 1058 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 1059 | "dev": true 1060 | }, 1061 | "parse-json": { 1062 | "version": "2.2.0", 1063 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1064 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1065 | "dev": true, 1066 | "requires": { 1067 | "error-ex": "1.3.1" 1068 | } 1069 | }, 1070 | "path-exists": { 1071 | "version": "2.1.0", 1072 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 1073 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 1074 | "dev": true, 1075 | "requires": { 1076 | "pinkie-promise": "2.0.1" 1077 | } 1078 | }, 1079 | "path-is-absolute": { 1080 | "version": "1.0.1", 1081 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1082 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1083 | "dev": true 1084 | }, 1085 | "path-is-inside": { 1086 | "version": "1.0.2", 1087 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1088 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1089 | "dev": true 1090 | }, 1091 | "path-parse": { 1092 | "version": "1.0.5", 1093 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 1094 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 1095 | "dev": true 1096 | }, 1097 | "path-type": { 1098 | "version": "2.0.0", 1099 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", 1100 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", 1101 | "dev": true, 1102 | "requires": { 1103 | "pify": "2.3.0" 1104 | } 1105 | }, 1106 | "pify": { 1107 | "version": "2.3.0", 1108 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1109 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1110 | "dev": true 1111 | }, 1112 | "pinkie": { 1113 | "version": "2.0.4", 1114 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1115 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1116 | "dev": true 1117 | }, 1118 | "pinkie-promise": { 1119 | "version": "2.0.1", 1120 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1121 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1122 | "dev": true, 1123 | "requires": { 1124 | "pinkie": "2.0.4" 1125 | } 1126 | }, 1127 | "pkg-dir": { 1128 | "version": "1.0.0", 1129 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", 1130 | "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", 1131 | "dev": true, 1132 | "requires": { 1133 | "find-up": "1.1.2" 1134 | } 1135 | }, 1136 | "pluralize": { 1137 | "version": "7.0.0", 1138 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", 1139 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", 1140 | "dev": true 1141 | }, 1142 | "prelude-ls": { 1143 | "version": "1.1.2", 1144 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1145 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1146 | "dev": true 1147 | }, 1148 | "process-nextick-args": { 1149 | "version": "1.0.7", 1150 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1151 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 1152 | "dev": true 1153 | }, 1154 | "progress": { 1155 | "version": "2.0.0", 1156 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", 1157 | "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", 1158 | "dev": true 1159 | }, 1160 | "pseudomap": { 1161 | "version": "1.0.2", 1162 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1163 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 1164 | "dev": true 1165 | }, 1166 | "read-pkg": { 1167 | "version": "2.0.0", 1168 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 1169 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", 1170 | "dev": true, 1171 | "requires": { 1172 | "load-json-file": "2.0.0", 1173 | "normalize-package-data": "2.4.0", 1174 | "path-type": "2.0.0" 1175 | } 1176 | }, 1177 | "read-pkg-up": { 1178 | "version": "2.0.0", 1179 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", 1180 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", 1181 | "dev": true, 1182 | "requires": { 1183 | "find-up": "2.1.0", 1184 | "read-pkg": "2.0.0" 1185 | }, 1186 | "dependencies": { 1187 | "find-up": { 1188 | "version": "2.1.0", 1189 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 1190 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 1191 | "dev": true, 1192 | "requires": { 1193 | "locate-path": "2.0.0" 1194 | } 1195 | } 1196 | } 1197 | }, 1198 | "readable-stream": { 1199 | "version": "2.3.3", 1200 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 1201 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 1202 | "dev": true, 1203 | "requires": { 1204 | "core-util-is": "1.0.2", 1205 | "inherits": "2.0.3", 1206 | "isarray": "1.0.0", 1207 | "process-nextick-args": "1.0.7", 1208 | "safe-buffer": "5.1.1", 1209 | "string_decoder": "1.0.3", 1210 | "util-deprecate": "1.0.2" 1211 | } 1212 | }, 1213 | "require-uncached": { 1214 | "version": "1.0.3", 1215 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 1216 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 1217 | "dev": true, 1218 | "requires": { 1219 | "caller-path": "0.1.0", 1220 | "resolve-from": "1.0.1" 1221 | } 1222 | }, 1223 | "resolve": { 1224 | "version": "1.5.0", 1225 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", 1226 | "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", 1227 | "dev": true, 1228 | "requires": { 1229 | "path-parse": "1.0.5" 1230 | } 1231 | }, 1232 | "resolve-from": { 1233 | "version": "1.0.1", 1234 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 1235 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 1236 | "dev": true 1237 | }, 1238 | "restore-cursor": { 1239 | "version": "2.0.0", 1240 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1241 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1242 | "dev": true, 1243 | "requires": { 1244 | "onetime": "2.0.1", 1245 | "signal-exit": "3.0.2" 1246 | } 1247 | }, 1248 | "rimraf": { 1249 | "version": "2.6.2", 1250 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1251 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1252 | "dev": true, 1253 | "requires": { 1254 | "glob": "7.1.2" 1255 | } 1256 | }, 1257 | "run-async": { 1258 | "version": "2.3.0", 1259 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 1260 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 1261 | "dev": true, 1262 | "requires": { 1263 | "is-promise": "2.1.0" 1264 | } 1265 | }, 1266 | "rx-lite": { 1267 | "version": "4.0.8", 1268 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", 1269 | "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", 1270 | "dev": true 1271 | }, 1272 | "rx-lite-aggregates": { 1273 | "version": "4.0.8", 1274 | "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", 1275 | "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", 1276 | "dev": true, 1277 | "requires": { 1278 | "rx-lite": "4.0.8" 1279 | } 1280 | }, 1281 | "safe-buffer": { 1282 | "version": "5.1.1", 1283 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 1284 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", 1285 | "dev": true 1286 | }, 1287 | "semver": { 1288 | "version": "5.5.0", 1289 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", 1290 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", 1291 | "dev": true 1292 | }, 1293 | "shebang-command": { 1294 | "version": "1.2.0", 1295 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1296 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1297 | "dev": true, 1298 | "requires": { 1299 | "shebang-regex": "1.0.0" 1300 | } 1301 | }, 1302 | "shebang-regex": { 1303 | "version": "1.0.0", 1304 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1305 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1306 | "dev": true 1307 | }, 1308 | "signal-exit": { 1309 | "version": "3.0.2", 1310 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1311 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1312 | "dev": true 1313 | }, 1314 | "slice-ansi": { 1315 | "version": "1.0.0", 1316 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", 1317 | "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", 1318 | "dev": true, 1319 | "requires": { 1320 | "is-fullwidth-code-point": "2.0.0" 1321 | } 1322 | }, 1323 | "spdx-correct": { 1324 | "version": "1.0.2", 1325 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", 1326 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", 1327 | "dev": true, 1328 | "requires": { 1329 | "spdx-license-ids": "1.2.2" 1330 | } 1331 | }, 1332 | "spdx-expression-parse": { 1333 | "version": "1.0.4", 1334 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", 1335 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", 1336 | "dev": true 1337 | }, 1338 | "spdx-license-ids": { 1339 | "version": "1.2.2", 1340 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", 1341 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", 1342 | "dev": true 1343 | }, 1344 | "sprintf-js": { 1345 | "version": "1.0.3", 1346 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1347 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1348 | "dev": true 1349 | }, 1350 | "string-width": { 1351 | "version": "2.1.1", 1352 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1353 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1354 | "dev": true, 1355 | "requires": { 1356 | "is-fullwidth-code-point": "2.0.0", 1357 | "strip-ansi": "4.0.0" 1358 | } 1359 | }, 1360 | "string_decoder": { 1361 | "version": "1.0.3", 1362 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 1363 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 1364 | "dev": true, 1365 | "requires": { 1366 | "safe-buffer": "5.1.1" 1367 | } 1368 | }, 1369 | "strip-ansi": { 1370 | "version": "4.0.0", 1371 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1372 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1373 | "dev": true, 1374 | "requires": { 1375 | "ansi-regex": "3.0.0" 1376 | }, 1377 | "dependencies": { 1378 | "ansi-regex": { 1379 | "version": "3.0.0", 1380 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1381 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1382 | "dev": true 1383 | } 1384 | } 1385 | }, 1386 | "strip-bom": { 1387 | "version": "3.0.0", 1388 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1389 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 1390 | "dev": true 1391 | }, 1392 | "strip-json-comments": { 1393 | "version": "2.0.1", 1394 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1395 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1396 | "dev": true 1397 | }, 1398 | "supports-color": { 1399 | "version": "2.0.0", 1400 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1401 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1402 | "dev": true 1403 | }, 1404 | "table": { 1405 | "version": "4.0.2", 1406 | "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", 1407 | "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", 1408 | "dev": true, 1409 | "requires": { 1410 | "ajv": "5.5.2", 1411 | "ajv-keywords": "2.1.1", 1412 | "chalk": "2.3.0", 1413 | "lodash": "4.17.5", 1414 | "slice-ansi": "1.0.0", 1415 | "string-width": "2.1.1" 1416 | } 1417 | }, 1418 | "text-table": { 1419 | "version": "0.2.0", 1420 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1421 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1422 | "dev": true 1423 | }, 1424 | "through": { 1425 | "version": "2.3.8", 1426 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1427 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1428 | "dev": true 1429 | }, 1430 | "tmp": { 1431 | "version": "0.0.33", 1432 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1433 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1434 | "dev": true, 1435 | "requires": { 1436 | "os-tmpdir": "1.0.2" 1437 | } 1438 | }, 1439 | "type-check": { 1440 | "version": "0.3.2", 1441 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1442 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1443 | "dev": true, 1444 | "requires": { 1445 | "prelude-ls": "1.1.2" 1446 | } 1447 | }, 1448 | "typedarray": { 1449 | "version": "0.0.6", 1450 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1451 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1452 | "dev": true 1453 | }, 1454 | "util-deprecate": { 1455 | "version": "1.0.2", 1456 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1457 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1458 | "dev": true 1459 | }, 1460 | "validate-npm-package-license": { 1461 | "version": "3.0.1", 1462 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", 1463 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", 1464 | "dev": true, 1465 | "requires": { 1466 | "spdx-correct": "1.0.2", 1467 | "spdx-expression-parse": "1.0.4" 1468 | } 1469 | }, 1470 | "which": { 1471 | "version": "1.3.0", 1472 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", 1473 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", 1474 | "dev": true, 1475 | "requires": { 1476 | "isexe": "2.0.0" 1477 | } 1478 | }, 1479 | "wordwrap": { 1480 | "version": "1.0.0", 1481 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1482 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1483 | "dev": true 1484 | }, 1485 | "wrappy": { 1486 | "version": "1.0.2", 1487 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1488 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1489 | "dev": true 1490 | }, 1491 | "write": { 1492 | "version": "0.2.1", 1493 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 1494 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 1495 | "dev": true, 1496 | "requires": { 1497 | "mkdirp": "0.5.1" 1498 | } 1499 | }, 1500 | "yallist": { 1501 | "version": "2.1.2", 1502 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1503 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 1504 | "dev": true 1505 | } 1506 | } 1507 | } 1508 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "coderbyte-solutions", 3 | "version": "1.0.0", 4 | "description": "Coderbyte-Solutions ===================", 5 | "main": "index.js", 6 | "scripts": { 7 | "lint": "eslint ./" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/ZLester/Coderbyte-Solutions.git" 12 | }, 13 | "author": "", 14 | "license": "ISC", 15 | "bugs": { 16 | "url": "https://github.com/ZLester/Coderbyte-Solutions/issues" 17 | }, 18 | "homepage": "https://github.com/ZLester/Coderbyte-Solutions#readme", 19 | "devDependencies": { 20 | "eslint": "^4.17.0", 21 | "eslint-config-standard": "^11.0.0-beta.0", 22 | "eslint-plugin-import": "^2.8.0", 23 | "eslint-plugin-node": "^6.0.0", 24 | "eslint-plugin-promise": "^3.6.0", 25 | "eslint-plugin-standard": "^3.0.1" 26 | } 27 | } 28 | --------------------------------------------------------------------------------