Не понял почему у меня не проходит проверка, я ведь сделал всё, что соответствует условиям!
// Отсортировал элементы массива по убыванию (ничего сложного)
for (i = 0; i <= attempts.length - 2; i++) {
var maxValue = attempts[i];
for (j = i + 1; j <= attempts.length - 1; j++){
if (attempts[j] > maxValue){
maxValue = attempts[j];
var swap = attempts[i];
attempts[i] = maxValue;
attempts[j] = swap;
}
}
}
// Создал массив для трех лучших прыжков и при помощи цикла записал в него
// первые три прыжка из предыдущего массива
// (этот шаг я выполнил исключительно для себя, для наглядности
// В качестве альтернативы мог просто взять второй прыжок из первых трех лучших: attempts[1])
var threeJumps = [];
for(i = 0; i < 3; i++){
threeJumps[i] = attempts[i];
}
// Поскольку в трех прыжках, средним всегда будет второй, записал в соответствующую переменную значение второго прыжка
averageBest = threeJumps[1];
// И проверка, если лучший (средний) прыжок больше квалификационной позиции, то true, если меньше, то false
if(averageBest > qualificationDistance){
qualified = true;
} else {
qualified = false;
}
Не проходит вторая проверка, среднее значение там почему-то ожидается 197, хотя из лучших трех прыжков такого нету, и последняя проверка, тоже, ожидается 189, хотя такого прыжка нет. Бред какой-то.
Средний из трех прыжков всегда будет второй (1, 2, 3)! Их же не четыре, чтобы складывать attempts[indexRight] и attempts[indexLeftt] а потом делить получившееся на 2. Их всего три!
Если бы прыжков было четыре, то нужно было бы считать среднее значение между вторым и третьим, то есть срединное между вторым и третьим.
А какое значение между вторым и вторым? Второе! Я не понимаю что от меня хотят.
Но ведь там написано “посчитать среднее значение этих трёх прыжков” а не “посчитать среднюю длину всех трех прыжков”, а значение - это один элемент, который посередине. Ведь все предыдущие задания строились как раз на поиске середины в массиве, не среднего значения суммы каких-то элементов, а одного конкретного элемента в массиве.
Поясните, пожалуйста, почему, если в строке " var swap = attempts[i] " attempts[i] заменить на longestJump, получается ошибка? Не до конца понимаю этот момент:(
// Сортируем массив
for (var i = 0; i <= attempts.length - 2; i++) {
var minValue = attempts[i];
for (var j = i + 1; j <= attempts.length - 1; j++) {
if (attempts[j] < minValue) {
minValue = attempts[j];
var swap = attempts[i];
attempts[i] = minValue;
attempts[j] = swap;
}
}
}
// Записываем во временный список три лучшие попытки
console.log(attempts);
var tempList = [];
for (var i = attempts.length - 1; i >= attempts.length - 3; i–) {
tempList.push(attempts[i]);
}
console.log('Три лучшие попытки: ', tempList);
// Записывавем средний результат трех попыток в averageBest
for (var i = 0; i <= tempList.length - 1; i++) {
averageBest += tempList[i];
}
averageBest = averageBest / tempList.length;
console.log('Средний результат: ’ , averageBest);
if averageBest > qualificationDistance:
qualified = True
print(‘Поздравляем! Вы прошли предворительную квалификацию.’)
else:
print(‘Вам следует пересмотреть тренировочный подход.’)
тут многие пишут, что можно было бы воспользоваться функциями,встроенными в язык. типа sort(); но как по мне, то мне кажется задачу нужно проходить в соответствии с навыками, предоставленными в курсе. можно считать эти навыки как часть условия, для решения задачи. так интереснее.
мой код, с учетом сортировки массива, без использования информации, не предоставленной в курсе.
code
for (var i = 0; i < attempts.length; i++) {
for (var j = 0; j < attempts.length; j++) {
if (attempts[i] < attempts[j]) {
var swap = attempts[i]
attempts[i] = attempts[j];
attempts[j] = swap;
}
}
}
averageBest = (attempts[attempts.length - 1] +
attempts[attempts.length - 2] + attempts[attempts.length - 3])/3;
qualified = averageBest > qualificationDistance;
если делать поиск по массиву на убывание, то код выходит немного чище.
code
for (var i = attempts.length-1; i >= 0; i--) {
for (var j = attempts.length-1; j >= 0; j--) {
if (attempts[i] < attempts[j]) {
var swap = attempts[i]
attempts[i] = attempts[j];
attempts[j] = swap;
}
}
}
averageBest = (attempts[0] + attempts[1] + attempts[2])/3;
qualified = averageBest > qualificationDistance;
Добавил две переменные, чтобы программа стала более универсальна, переменная choose отвечает за количество проверяемых попыток из которых вычисляется среднее значение
Решение
var choose = 3;
var sum = 0;
for (var i = 0; i <= attempts.length - 2; i++) {
var maxValue = attempts[i];
for (var j = i + 1; j <= attempts.length - 1; j++) {
if (attempts[j] > maxValue) {
maxValue = attempts[j];
var swap = attempts[i];
attempts[i] = maxValue;
attempts[j] = swap;
}
}
}
for (var n = choose - 1; n >=0; n--) {
sum +=attempts[n];
}
averageBest = sum/choose;
averageBest > qualificationDistance ? qualified = true : qualified = false;
И в одной из проверок вот такой результат выходит: 196.99999999999997
Я уже прочитала про эту “аномалию”, попробовала Math.ceil/round, но это не помогло. несостыковки тогда вылазят в других тестах. Как это решить?
Вы фактически рассчитываете не среднее арифметическое трех элементов, а на каждой итерации цикла делите соответствующий элемент на 3, после чего суммируете их. В результате деления могут получаться бесконечные числа и происходит их округление по следующей причине: https://learn.javascript.ru/
Чтобы этого избежать, необходимо в цикле найти сумму элементов, а деление на их количество выполнить отдельным действием вне цикла.