Last active
November 28, 2019 14:17
-
-
Save dptole/c53d4a92853a75adb0f5472b8da31931 to your computer and use it in GitHub Desktop.
Zumber, weird numbers.
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() { | |
function Zumber(array) { | |
if(!(this instanceof Zumber)) | |
return new Zumber(array); | |
if(!( | |
array instanceof Array && | |
array.length > 10 && | |
array.every(function(item, index) { | |
return typeof(item) === 'string' && item.length === 1 && !~array.indexOf(item, index + 1); | |
}) | |
)) throw Error('The first argument must be an array of one-character-strings and each string must be unique in that array.', 1); | |
Object.defineProperties(this, { | |
_base: {value: array, writable: false, configurable: false}, | |
_base_flipped: { | |
writable: false, configurable: false, value: array.reduce(function(_base_flipped, character, index) { | |
_base_flipped[character] = index; | |
return _base_flipped; | |
}, {}) | |
} | |
}); | |
} | |
Object.defineProperties(Zumber.prototype, { | |
encode: { | |
writable: false, configurable: false, value: function(number) { | |
if(~~number !== number) return false; | |
var sign = number < 0 ? '-' : ''; | |
var positive_number = Math.abs(number); | |
if(positive_number < this._base.length) | |
return sign + this._base[positive_number]; | |
var zumber = []; | |
var rest = positive_number; | |
do { | |
rest = positive_number / this._base.length | 0; | |
zumber = this._base[positive_number % this._base.length] + zumber; | |
positive_number = rest; | |
} while(rest >= this._base.length); | |
zumber = this._base[rest] + zumber; | |
return sign + zumber; | |
} | |
}, | |
decode: { | |
writable: false, configurable: false, value: function(zumber) { | |
if(!this.isValidZumber(zumber)) return false; | |
var _self = this; | |
var sign = ''; | |
if(zumber[0] === '-') { | |
sign = '-'; | |
zumber = zumber.substr(1); | |
} | |
return +(sign + zumber.split('').reduce(function(number, zumber) { | |
number.unshift(_self._base_flipped[zumber]); | |
return number | |
}, []).reduce(function(result, number, index) { | |
return result + number * Math.pow(_self._base.length, index); | |
}, 0)); | |
} | |
}, | |
isValidZumber: { | |
writable: false, configurable: false, value: function(zumber) { | |
var _self = this; | |
return typeof(zumber) === 'string' && zumber.split('').every(function(zumber, index) { | |
return ~_self._base.indexOf(zumber) || (index === 0 && zumber === '-'); | |
}); | |
} | |
} | |
}); | |
if(typeof module === 'object' && typeof module.exports === 'object') | |
module.exports = Zumber; | |
else if(typeof window === 'object') | |
window.Zumber = Zumber; | |
else | |
throw new Error('I don\'t know how to export this') | |
}() | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment