Переодоление барьера

Дан массив, элементы которого являются координатами барьеров на отрезке.
Мы можем делать прыжки равной длины с нуля направо.

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

Например в случае массива [5,3,6,7,9], минимальной длиной прыжка будет 4. Надо написать функцию, которая получает массив координат барьеров и возвращает минимальную длину прыжка.

function barrier(x) {
    x.sort((a, b) => a - b)
    let a = [];
    let k = 0;


    for (let i = 0; i < x[x.length - 1]; i++) {
        if (x[i - k] != (i + 1)) {
            a.push(i + 1);
            k++;
        }
    }
}

console.log(barrier([5,3,6,7,9]))   // Должен вывести 4
console.log(barrier([2,3]))   // Должен вывести 4
console.log(barrier([1,4,10,6,2]))   // Должен вывести 7
console.log(barrier([19,32,11,23]))   // Должен вывести 3
...

Пожолуйста помогите решить задачу...


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

Автор решения: teran

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

function barrier(x) {
    x.sort((a, b) => a - b)
    const max = x[x.length - 1];
    var result = Array(max).fill()
                     .map((v,i) => ++i)
                     .filter(v => !x.includes(v));    
                     
    let min = result.find(r => !x.some(v => v % r == 0));
    
    return min ? min : max + 1;
}

console.log(barrier([5,3,6,7,9]))   // Должен вывести 4
console.log(barrier([2,3]))         // Должен вывести 4
console.log(barrier([1,4,10,6,2]))  // Должен вывести 7
console.log(barrier([19,32,11,23])) // Должен вывести 3

→ Ссылка