Славик
задача: определить, является ли массив чисел рядом арифметической прогрессии с разностью -1, 0 или 1
Anonymous
ха
Славик
это абсолютно необязательно ошибка
Славик
тебе же неизвестна изначальная постановка задачи
Славик
по-моему, здесь хватит цикла в цикле
Anonymous
тебе же неизвестна изначальная постановка задачи
Это верно. 4 функция, в таком случае, и будет её решать. Возросшая сложность такого решения существенна сама по себе, но несущественна с точки зрения ресурсов. А код станет намного проще.
Anonymous
Да не. Нужна одна функция с двумя аргументами: разрядность и последовательность.
Anonymous
И врамках общей функции она будет вызвана от 1 до 3 раз.
Anonymous
Нуи O(3*n) — пофиг ваще.
Anonymous
задача: определить, является ли массив чисел рядом арифметической прогрессии с разностью -1, 0 или 1
function osmxFunction(array) { array = array.map(v => +v); if ( array.filter(v => !isFinite(v)).length ) { throw new TypeError("Excpected array of finite number"); } let deltaGb = null; for(let i = 0; i < array.length - 1; i++) { const delta = array[i + 1] - array[i]; if ( ![-1,0,1].includes(delta) ) { return false; } if ( deltaGb === null ) { deltaGb = delta; continue; } if ( deltaGb !== delta ) { return false; } } return true; }
Anonymous
?
mdn array every
Anonymous
mdn array every
аа, вместо filter(..).length... Ну да
Anonymous
забыл(не знал) про нее
Anonymous
Это решается в одну строчку arr.every((v, i) => Math.abs(+arr[Math.min(i + 1, arr.length - 1)] - +v) <= 1)
Славик
a1 у прогрессии необязательно 1
Anonymous
тоже покажет true
Anonymous
хотя, в прогрессии ошибка
Ростислав ✚
Здраствуйте. Кто работал с jxcore? Вот у меня js файл с кодом. Всё делаю вроде как правильно но почему-то не запускается скомпилированный exe. Консоль просто вырубается при запуске.
Anonymous
a1 у прогрессии необязательно 1
function osmxFunction(array, list = [-1,0,1]) { array = array.map(v => +v); if ( !array.every(v => isFinite(v)) ) { throw new TypeError("Excpected array of finite number"); } let deltaGb = null; for(let i = 0; i < array.length - 1; i++) { const delta = array[i + 1] - array[i]; if ( !list.includes(delta) ) { return false; } if ( deltaGb === null ) { deltaGb = delta; continue; } if ( deltaGb !== delta ) { return false; } } return true; } вот, можешь в аргументе функции задать, шаг прогрессии
Pavel
array = array.map(Number)
Славик
function funnyFunction(data) { if (!data.length) { return false; } function isProgression(data, d) { let a = Number(data[0]); for (let i = 1; i < data.length; i++) { a += d; if (Number(data[i]) != a) { return false; } } return true; } return isProgression(data, -1) || isProgression(data, 0) || isProgression(data, 1); }
Славик
а, ну я функцию вложил, можно замкнуть data
Anonymous
а, ну я функцию вложил, можно замкнуть data
чем мой вариант не нравится7
Славик
да ок
Славик
я предложил свой и не более
Anonymous
Можно и без рекурсии. Предыдущий вариант действительно был не правильный) javascript function arp(arr) { const len = arr.length; if (len == 1) return true; arr = arr.slice().sort((a, b) => +a - +b); var d = +arr[1] - +arr[0]; for (let i = 2; i < len; ++i) if (+arr[i] - +arr[i - 1] !== d) return false; return true; }
Славик
1,2,2,4
Anonymous
тогда не сортировать)
Anonymous
а вообще, я предоставил уже рабочий вариант...
Anonymous
1,2,2,4
будет false
Славик
а, точняк
Anonymous
Это короче же: javascript function arp(arr) { const len = arr.length; if (len == 1) return true; var d = +arr[1] - +arr[0]; for (let i = 2; i < len; ++i) if (+arr[i] - +arr[i - 1] !== d) return false; return true; }
Anonymous
И самое главное само определяет шаг для арифметической прогрессии
Anonymous
в то время как, шаг надо задавать параметров
Anonymous
Anonymous
Так правильно
не соотвествует тз
Anonymous
Maksim
Anonymous
задача: определить, является ли массив чисел рядом арифметической прогрессии с разностью -1, 0 или 1
Anonymous
тут четко указаны возможные шаги
ну вынеси d в качестве входного параметра, не проблема. Это решений более генерализировано
Славик
жестко
Славик
во-первых, рекурсия, во-вторых, перестроение массива
Славик
значит 4 варианта реализации задачи и ни в одном, пожалуй, не очевидно, что делает этот код
Славик
только названия функций/переменных дают подсказку
Dika
это — очень даже понятный код
Славик
ну по производительности он не ок
Славик
если в нем 'isProgression' заменить на 'funny_function'
Славик
и дать на каком-нибудь собесе
Славик
то вероятно то же количество времени у кандидата потребуется, чтобы понять, что происходит
Dika
Anonymous
Dika
в целом, тут если прикрутить tco и заменить массивы на списки — будет достаточно быстро
Славик
еще stack обычно достаточно ограничен
Славик
так что с рекурсией больше шансов словить stackoverflow
Славик
но в твоем коде куда страшнее перестроение массива
Славик
slice возвращает новый массив же
Славик
лучше уж unshift делать
Maksim
ну кстати можно и промутировать, да
Dika
slice возвращает новый массив же
просто нужно взять списки вместо массива
Maksim
в js нет из коробки списков
Dika
я понимаю
Славик
ну pop, unshift как бы делает их списками
Славик
хотя хрен знает что там с мутабельностью под капотом