Вывести массив коротким образом в String [как отобразить последовательные числа из массива через дефис?]

Есть массив,числа это типа номера маршруток на данном улице.Числа идут только на возрастание и по порядку.

[1,3,4,5,6,8,10,12,13,14,17]

Нужно чтобы те числа которые последовательны друг другу по 1 -

(3,4,5,6)(12,13,14)

были написаны таким образом -

(3-6)(12-14)

И в итоге получать такой String -

1,3-6,8,10,12-14,17

Еще примеры массивов -

[10,11,12] 10-12

[1,2,3,4,5,9] 1-5,9
У меня неполноценный код.

function solution(x) {
  let y = [];
  let min;
  let max;
  for (var i = 0; i < x.length; i++) {
    if (x[i] - x[i - 1] == 1) {
      y.push(x[i])
    }
  }
  y.unshift(y[0] - 1);
  min = y[0];
  max = y[y.length - 1];
  y = [min, max];
  y = y.toString().split(",").join("-");
  return y
}
console.log(solution([1, 3, 4, 5, 6, 8])) //3-6
console.log(solution([1, 3, 4, 5, 6, 8, 10, 11, 12])) //3-12

Каким должен быть результат для данного набора [1,3,4,7,8,11,12,20] ?

  1. "1, 3-4, 7-8, 11-12, 20"
  2. "1, 3, 4, 7, 8, 11, 12, 20"

Направление мышления верное.

Любую задачу стоит пробовать разбить на простые подзадачи. И в этом случае я бы сначала сделал промежуточную структуру массив массивов из последовательных чисел. И эту структуру уже намного проще превратить в текст.

Для входного [1,3,4,5,6,8,10,12,13,14,17] я бы сгенерировал вот такой промежуточный результат:

[ [ 1 ], [ 3, 4, 5, 6 ], [ 8 ], [ 10 ], [ 12, 13, 14 ], [ 17 ] ]

пришёл вот к такому решению, но оказалось, что код не правильный для скрытого теста(к сожалению вариант скрытого теста не известен), каким образом можно изменить код, чтоб во всех случаях было правильно?

function solution(x) {
return x
.sort((a, b) => a - b).reduce((intervals, value, index) => {
if (!index) {
return intervals;
}
let interval = intervals[intervals.length - 1];
let last = interval[interval.length - 1];
if (value - last === 1) {
interval.push(value);
} else {
intervals.push([value]);
}
return intervals;
}, [
[x[0]]
])
.map(interval => {
if (interval.length > 1) {
return interval[0]+‘-’+interval[interval.length - 1]
} else {
return String(interval[0]);
}
})
.join();
}
console.log(solution([1,2,4, 5, 6, 8, 10, 11, 12]))
console.log(solution([110,120,121,122,145,165,166,167,181]))

Иными словами ты спрашиваешь при каких входных данных твой код не будет работать корректно.

Я не нашел таких входных данных. Самому интересно узнать что это были за входные данные. Напиши если узнаешь.

Ради интереса посмотри проходит ли проверку это решение:

написал его когда разбирался с твоим вопросом

спасибо за уделённое вопросу время, но код не принимает, слишком длинный

получил часть кода в качестве подсказки

if (arr1.length !== 0) {
arr1.push(x[i])
if(arr1.length > 2){
arr1 = arr1[0] + ‘-’ + arr1[arr1.length - 1]
}
arr2.push(arr1)
arr1 =
}

Это не помогает.

К тому же называть переменную arr1 и хранить в ней строку это нежелаемая практика. Только усложняет понимание для читающего.

По возможности спроси при каких входных данных не срабатывает твой код. Возможно мы что-то упустили в условии задачи, а в данных это упущение видно.

возможно моя догадка не верна но когда, с моим примером кода я пишу допустим на входе 1,2 на выходе получаю 1-2, возможно нужно получить 1,2 думаю это и есть скрытый тест

Хорошая догадка. Я по свободе подумаю как изменить решение чтобы учесть этот случай.

должен быть ваш второй вариант

наконец то, получилось

function solution(x) {
    let skip = 0;
    return x.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)
}
1 лайк