Created
January 30, 2020 14:48
-
-
Save danielwayota/6b34e0171ebf75281e1491a3d146d374 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
| /** | |
| * @param {Number} num | |
| * @param {Number} hash_size | |
| * | |
| * @return {String} | |
| */ | |
| function doit(num) { | |
| let letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' | |
| let hash_letters = [0, 0, 0, 0, 0, 0] | |
| let letters_remaining = 6 | |
| let next_letter_step = Math.pow(10, letters_remaining) | |
| if (num >= next_letter_step) { | |
| // Insert fist A. | |
| // 1000000 fits just once. | |
| hash_letters[hash_letters.length-1] += 1 | |
| num -= next_letter_step | |
| letters_remaining -= 1 | |
| } | |
| do { | |
| next_letter_step = Math.pow(10, letters_remaining) | |
| let count = Math.floor(num / next_letter_step) | |
| let max_amount = letters.length - hash_letters[hash_letters.length-1] | |
| if (count > max_amount) { | |
| count = max_amount | |
| } | |
| hash_letters[hash_letters.length-1] += count | |
| // Rol a letter forward | |
| for (let i = letters.length - 1; i > 0; i--) { | |
| if (hash_letters[i] >= letters.length) { | |
| hash_letters[i] = 1 | |
| hash_letters[i-1] += 1 | |
| } | |
| } | |
| letters_remaining = hash_letters.filter((item) => item == 0).length | |
| num -= count * next_letter_step | |
| } while (num >= next_letter_step && letters_remaining > 0) | |
| // Filled with AAAAAA | |
| if (num != 0) { | |
| let final_count = Math.floor(num / letters.length) | |
| num = num % letters.length | |
| hash_letters[hash_letters.length-1] += final_count | |
| // Rol the letters with the rest of the "laps" | |
| for (let i = letters.length - 1; i > 0; i--) { | |
| if (hash_letters[i] >= letters.length) { | |
| let to_rol = Math.floor(hash_letters[i] / letters.length) | |
| let current = hash_letters[i] % letters.length | |
| hash_letters[i] = current + 1 | |
| hash_letters[i-1] += to_rol | |
| } | |
| } | |
| // Still value remaining | |
| while (num != 0) { | |
| hash_letters[hash_letters.length-1] += 1 | |
| // Rol a letter forward | |
| for (let i = letters.length - 1; i > 0; i--) { | |
| if (hash_letters[i] >= letters.length) { | |
| hash_letters[i] = 1 | |
| hash_letters[i-1] += 1 | |
| } | |
| } | |
| num -= 1 | |
| } | |
| // Last element letter index overflow | |
| if (hash_letters[0] > letters.length) { | |
| let final_count = Math.floor(hash_letters[0] / letters.length) | |
| hash_letters[0] = hash_letters[0] % letters.length | |
| hash_letters[hash_letters.length-1] += final_count | |
| // Rol a letter forward | |
| for (let i = letters.length - 1; i > 0; i--) { | |
| if (hash_letters[i] >= letters.length) { | |
| let to_rol = Math.floor(hash_letters[i] / letters.length) | |
| let current = hash_letters[i] % letters.length | |
| hash_letters[i] = current + 1 | |
| hash_letters[i-1] += to_rol | |
| } | |
| } | |
| } | |
| } | |
| let hash = hash_letters | |
| .filter((item) => item != 0) | |
| .reduce((acc, index) => { | |
| return acc + letters[index-1] | |
| }, '') | |
| return num != 0 ? num.toString() : '' + hash | |
| } | |
| /** | |
| * @param {Number} num | |
| * | |
| * @return {String} | |
| */ | |
| function getHash(num) { | |
| let hash = doit(num) | |
| // Fill with leading zeros | |
| while (hash.length < 6) { | |
| hash = '0' + hash | |
| } | |
| return hash | |
| } | |
| console.log(' -> ', getHash(999999 * 2)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment