Credit card validator
by suhail
JavaScript
Trie = (function() {
function Trie() {
this.trie = {};
}
Trie.prototype.push = function(value) {
var char, i, j, len, obj, ref, results;
value = value.toString();
obj = this.trie;
ref = value.split('');
results = [];
for (i = j = 0, len = ref.length; j < len; i = ++j) {
char = ref[i];
if (obj[char] == null) {
if (i === (value.length - 1)) {
obj[char] = null;
} else {
obj[char] = {};
}
}
results.push(obj = obj[char]);
}
return results;
};
Trie.prototype.find = function(value) {
var char, i, j, len, obj, ref;
value = value.toString();
obj = this.trie;
ref = value.split('');
for (i = j = 0, len = ref.length; j < len; i = ++j) {
char = ref[i];
if (obj.hasOwnProperty(char)) {
if (obj[char] === null) {
return true;
}
} else {
return false;
}
obj = obj[char];
}
};
return Trie;
})();
Range = (function() {
function Range(trie1) {
this.trie = trie1;
if (this.trie.constructor !== Trie) {
throw Error('Range constructor requires a Trie parameter');
}
}
Range.rangeWithString = function(ranges) {
var j, k, len, n, r, range, ref, ref1, trie;
if (typeof ranges !== 'string') {
throw Error('rangeWithString requires a string parameter');
}
ranges = ranges.replace(/ /g, '');
ranges = ranges.split(',');
trie = new Trie;
for (j = 0, len = ranges.length; j < len; j++) {
range = ranges[j];
if (r = range.match(/^(\d+)-(\d+)$/)) {
for (n = k = ref = r[1], ref1 = r[2]; ref <= ref1 ? k <= ref1 : k >= ref1; n = ref <= ref1 ? ++k : --k) {
trie.push(n);
}
} else if (range.match(/^\d+$/)) {
trie.push(range);
} else {
throw...