Skip to content

Instantly share code, notes, and snippets.

@pmk65
Last active June 25, 2019 21:53
Show Gist options
  • Save pmk65/9c45cba9fb7431f71b58c208b21c7d12 to your computer and use it in GitHub Desktop.
Save pmk65/9c45cba9fb7431f71b58c208b21c7d12 to your computer and use it in GitHub Desktop.
// Expand input of comma separated positive integers including ranges, into flat list of numbers.
var isValidRange = function(str, delimiter, rangeDelimiter) {
return new RegExp('^[0-9]+(?:' + rangeDelimiter + '[0-9]+)?(?:' + delimiter+ '[0-9]+(?:' + rangeDelimiter + '[0-9]+)?)*$', 'i').test(str);
}
var addRange = function(low,high, result) {
var i;
for (i = low; i <= high; i++) result.push(i);
return result;
}
var expandRange = function(str, delimiter, rangeDelimiter) {
var regexp = new RegExp('([0-9]+)(?:' + rangeDelimiter + '([0-9]+))?(?:' + delimiter + '|$)', 'g'),
segments = regexp.exec(str),
result = [], i;
while (segments) {
for (i = 0; i < segments.length; i++) {
if (segments[2] === undefined) result.push(parseInt(segments[1]));
else result = addRange(parseInt(segments[1]), parseInt(segments[2]), result);
}
segments = regexp.exec(str);
}
return Array.from(new Set(result)).sort(function(a, b){return a - b});
}
document.querySelector('button').addEventListener('click', function(e) {
var delimiter = ',', rangeDelimiter = '-', result = '';
var value = (delimiter === ' ') ? this.value.replace(/ +/g, " ") : this.value.replace(/ /g, "");
if (isValidRange(value, delimiter, rangeDelimiter)) result = 'Expanded: ' + expandRange(value, delimiter, rangeDelimiter).toString();
else result = 'Error: Invalid input';
document.querySelector('#output').innerText = result;
}.bind(document.querySelector('#number')));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment