Задача с конкатенацией строк

Функция получает массив из целих чисел нужно последующие числа объединить через символ - и в конце вернуть строку. Я почти решил задачу но есть маленькая проблема, на которую указал в комментариях.

function solution(x) {
    let y = [];
    let a = 0;
    let b = 0;

    for (let i = 0; i < x.length; i++) {
        a = x[i];
        b = a;
        while (x[i + 1] - x[i] == 1) {
            b = x[i + 1];
            i++;
        }
        y.push(a == b ? a + '' : a + '-' + b);
    }

    return y.join(',');
}

console.log(solution([6, 7, 67, 54, 55, 56]));     
// '6-7,67,54-56' но должен выводится '6,7,67,54-56'

console.log(solution([15, 16]));                   
// '15-16' но должен выводится '15, 16'

console.log(solution([1, 2, 3, 17, 18, 20, 28]));  
// '1-3,17-18,20,28' но должен выводится '1-3,17,18,20,28'

Как правильно решить задачу?


Ответы (3 шт):

Автор решения: девочка с глазами ребёнка

function solution(x) {
    let data = [],
        first,
        last;

    let temp = x.concat([]);

    for (let i = 0; i < temp.length; i++) {
        first = last = temp[i];
        while (temp[i + 1] === last + 1) {
            last++;
            i++;
        }

        data.push(first === last ? first : first + '-' + last);
    }

    return data.join(', ');
}

console.log(solution([1, 2, 3, 67, 17, 18, 20, 28]));

→ Ссылка
Автор решения: Aleksandr

Можно, например, так:

function solution(x) {
    let y = [];
    let a;
    let b;
    
    for (let i = 0; i < x.length; i++) {
        a = x[i];
        b = a;
        while (x[i + 1] - x[i] == 1) {
            b = x[i + 1];
            i++;
        }
        if (a == b) {
            y.push(a + '');
        }
        else {
            if ((b - a) == 1) {
                y.push([a + '', b + '']);
            }
            else {
                y.push(a + '-' + b);
            }
        }
    }
    
    return y.join(',');
}

console.log(solution([6, 7, 67, 54, 55, 56]));
console.log(solution([15, 16]));
console.log(solution([1, 2, 3, 17, 18, 20, 28]));

Или очень короткий вариант (тяжело читаемый):

function solution(x) {
    let y = [];
    let a;
    let b;

    for (let i = 0; i < x.length; i++) {
        a = x[i];
        b = a;
        while (x[i + 1] - x[i] == 1) {
            b = x[i + 1];
            i++;
        }
        y.push(a == b ? a + '' : (b - a) == 1 ? [a + '', b + ''] : a + '-' + b);
    }

    return y.join(',');
}

console.log(solution([6, 7, 67, 54, 55, 56]));
console.log(solution([15, 16]));
console.log(solution([1, 2, 3, 17, 18, 20, 28]));

→ Ссылка
Автор решения: Rafael Seidalinov

Это мое изначальное решение, оставлю тут чтобы понимался смысл решения, оно более читаемое

function solution(numbers) {
  let skip = 0;
  let result = ""
  for(let i = 0; i < numbers.length; i++)
   {
    if(numbers[i+1] - numbers[i] === 1)
    {
      skip++;
      if(skip === 1)
      {
        result = result.concat(numbers[i]+",");
      }
      if(skip === 2)
      {
        result= result.slice(0, -1);
        result= result.concat("-");
      }
    }
    else
    {
      skip = 0;
      result = result.concat(numbers[i]+",");
    }
  };
  return result.slice(0, -1);
}

console.log(solution([6, 7, 67, 54, 55, 56]));     
console.log(solution([15, 16]));                   
console.log(solution([15, 16, 17]));                   
console.log(solution([1, 2, 3, 4, 5, 17, 18, 20, 28]));  
console.log(solution([1, 2, 3, 17, 18, 20, 28]));  

это решение тоже самое что выше просто оптимизированное(более краткое), но менее читамое/понимаемое

   

 function solution(numbers) {
  let skip = 0;
  return numbers.reduce((prev, cur, i, arr) => {
    skip = arr[i + 1] - arr[i] !== 1 ? 0 : skip + 1;
    if (skip > 1) {
      return prev.slice(0, -1) + "-";    
    }
    return prev.concat(cur + ",");
  }, "").slice(0, -1)
}
console.log(solution([6, 7, 67, 54, 55, 56]));     
console.log(solution([15, 16]));                   
console.log(solution([15, 16, 17]));                   
console.log(solution([1, 2, 3, 4, 5, 17, 18, 20, 28]));  
console.log(solution([1, 2, 3, 17, 18, 20, 28]));  

→ Ссылка