Skip to content

Instantly share code, notes, and snippets.

@dptole
Last active November 28, 2019 14:17
Show Gist options
  • Save dptole/c53d4a92853a75adb0f5472b8da31931 to your computer and use it in GitHub Desktop.
Save dptole/c53d4a92853a75adb0f5472b8da31931 to your computer and use it in GitHub Desktop.
Zumber, weird numbers.
-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