Skip to content

Instantly share code, notes, and snippets.

@danielwayota
Created January 30, 2020 14:48
Show Gist options
  • Select an option

  • Save danielwayota/6b34e0171ebf75281e1491a3d146d374 to your computer and use it in GitHub Desktop.

Select an option

Save danielwayota/6b34e0171ebf75281e1491a3d146d374 to your computer and use it in GitHub Desktop.
/**
* @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