range-array.mjs


// https://www.codewars.com/kata/57d83dfc950d842dcb00005b/train/javascript

/**
 * Converts a list of ranges into a flat array of numbers.
 * @param {Array<Array<number>>} ranges - An array of ranges, where each range is [min, max] or [min].
 * @returns {Array<number>} An array containing all numbers in the specified ranges.
 */
export const range2array = ranges => {
  return ranges.reduce((arr, range) => {
    const min = range[0];
    const max = range[1] ?? min;
    return arr.push(
      ...new Array(max - min + 1).fill(0).map((n ,i) => min + i)
    ), arr;
  }, []);
};

/**
 * Converts a sorted array of numbers into a list of ranges.
 * Consecutive numbers are grouped into a single range [min, max].
 * Isolated numbers are represented as [num, num].
 * @param {Array<number>} arr - The sorted array of numbers.
 * @returns {Array<Array<number>>} An array of ranges.
 */
export const array2range = arr => {
  const ranges = [];
  let last = arr[0];
  let begin = last;
  for (let i = 1; i <= arr.length; ++i) {
    const n = arr[i];
    if (n !== last + 1) {
      ranges.push([begin, last]);
      begin = n;
    }
    last = n;
  }
  return ranges;
};