Created
September 1, 2015 22:45
-
-
Save supernova-at/fef5963d37022acf3446 to your computer and use it in GitHub Desktop.
Candy Week 3: http://supernova-at.com/candy/3%20Baby%20Name/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function getNames(input) { | |
// Using the array index of map for the numbers | |
var map = [ | |
// 0 | |
[''], | |
// 1 | |
[''], | |
// 2 | |
['a', 'b', 'c'], | |
// 3 | |
['d', 'e', 'f'], | |
// 4 | |
['g', 'h', 'i'], | |
// 5 | |
['j', 'k', 'l'], | |
// 6 | |
['m', 'n', 'o'], | |
// 7 | |
['p', 'q', 'r', 's'], | |
// 8 | |
['t', 'u', 'v'], | |
// 9 | |
['w', 'x', 'y', 'z'] | |
]; | |
// This is where we're going to store the individual outputs | |
var permutations = []; | |
// I'm assuming all valid inputs here, that's probably not a good thing to do | |
// Get the digits | |
var firstDigit = parseInt(input.charAt(0)); | |
var secondDigit = parseInt(input.charAt(1)); | |
var thirdDigit = parseInt(input.charAt(2)); | |
var fourthDigit = parseInt(input.charAt(3)); | |
// Get the arrays the digits map to | |
var firstArray = map[firstDigit]; | |
var secondArray = map[secondDigit]; | |
var thirdArray = map[thirdDigit]; | |
var fourthArray = map[fourthDigit]; | |
// Determine the total number of permutations based on the length of the arrays | |
var numPermutations = firstArray.length * secondArray.length * thirdArray.length * fourthArray.length; | |
// Loop through the numbers from 1 to total number | |
for (var i = 0; i < numPermutations; i++) { | |
// For each, figure out array index of each digit to target | |
// We do this very similarly to how you'd figure out hours / minutes / seconds given a total number of seconds | |
// For example, the first few are: | |
// 0 = 0,0,0,0 | |
// 1 = 0,0,0,1 | |
// 2 = 0,0,0,2 | |
// 3 = 0,0,1,0 | |
// 4 = 0,0,1,1 | |
// 5 = 0,0,1,2 | |
// 6 = 0,0,2,0 | |
var firstIndex = Math.floor((i / (fourthArray.length * thirdArray.length * secondArray.length))) % firstArray.length; | |
var secondIndex = Math.floor((i / (fourthArray.length * thirdArray.length))) % secondArray.length; | |
var thirdIndex = Math.floor((i / fourthArray.length)) % thirdArray.length; | |
var fourthIndex = i % fourthArray.length; | |
console.log('indices', '' + firstIndex + '' + secondIndex + '' + thirdIndex + '' + fourthIndex); | |
// Combine them all into an individual permutation | |
var firstTarget = firstArray[firstIndex]; | |
var secondTarget = secondArray[secondIndex]; | |
var thirdTarget = thirdArray[thirdIndex]; | |
var fourthTarget = fourthArray[fourthIndex]; | |
// Add this permutation to the permutation list | |
var thisPermutation = firstTarget.concat(secondTarget).concat(thirdTarget).concat(fourthTarget); | |
console.log('this permutation', thisPermutation); | |
permutations.push(thisPermutation); | |
} | |
// Return the list as a comma delimited string | |
return permutations.join(', '); | |
} | |
var input = '1023'; // 7777 // 2345 | |
var result = getNames(input); | |
console.log(result); |
I guess I am somewhat confused because when I translate it to Python I get floats rather than integers. I am guessing that what Math.floor does?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I'm not familiar with javascript, so I had some difficulty reading this. I definitely never would have thought to loop through all of the permutations this way. But your comments were super helpful and I'm pretty sure I understand what your are doing overall. Its been a long time since I have done any real math though, would you mind walking me through this part:
var firstIndex = Math.floor((i / (fourthArray.length * thirdArray.length * secondArray.length))) % firstArray.length;
var secondIndex = Math.floor((i / (fourthArray.length * thirdArray.length))) % secondArray.length;
var thirdIndex = Math.floor((i / fourthArray.length)) % thirdArray.length;
var fourthIndex = i % fourthArray.length;
I think one of my biggest limitations as a potential programmer is figuring out equations, especially how to effectively use the modulo operator.