Испытание: Рекорды по прыжкам в длину

Не понял почему у меня не проходит проверка, я ведь сделал всё, что соответствует условиям!

// Отсортировал элементы массива по убыванию (ничего сложного)
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. Их всего три!
Если бы прыжков было четыре, то нужно было бы считать среднее значение между вторым и третьим, то есть срединное между вторым и третьим.
А какое значение между вторым и вторым? Второе! Я не понимаю что от меня хотят.

Под “средним” имеется в виду “среднее арифметическое”, то есть: (первый + втрой + третий) / 3

1 лайк

Но ведь там написано “посчитать среднее значение этих трёх прыжков” а не “посчитать среднюю длину всех трех прыжков”, а значение - это один элемент, который посередине. Ведь все предыдущие задания строились как раз на поиске середины в массиве, не среднего значения суммы каких-то элементов, а одного конкретного элемента в массиве.

В курсе акцентировалось внимание на отличии срединного (медиана) значения массива от среднего арифметического. Перечитайте теорию.

1 лайк

Тоже через sort, но лаконичнее:

var qualificationDistance = 200;
var attempts = [120, 150, 160, 201, 203, 180, 202];
var qualified = false;
var averageBest = 0;

attempts.sort(function (a, b) {
return b - a;
});
console.log(attempts);

averageBest = (attempts[0] + attempts[1] + attempts[2]) / 3;
if (averageBest > qualificationDistance) {
qualified = true
} else {
qualified = false
};

1 лайк

var qualificationDistance = 200;
var attempts = [120, 150, 160, 201, 203, 180, 202];
var qualified;
var averageBest;

for (var i = 0; i <= attempts.length-2; i++){
var longestJump = attempts[i]; //longestJump = 120
for (var j = i + 1; j <= attempts.length - 1; j++){
if(longestJump < attempts[j]){
var swap = attempts[i]; //swap = 120
longestJump = attempts[j]; //longestJump = 150
attempts[i] = longestJump; //attempts[i] = 150
attempts[j] = swap;//attempts[j] = 120
}
}
}

console.log(attempts)
var averageBest = (attempts[0] + attempts[1] + attempts[2]) / 3;
console.log(averageBest)
if((attempts[0] + attempts[1] + attempts[2]) / 3 > 200 ){
qualified = true}else{
qualified = false}

Поясните, пожалуйста, почему, если в строке " var swap = attempts[i] " attempts[i] заменить на longestJump, получается ошибка? Не до конца понимаю этот момент:(

for (var i = 0; i < attempts.length; i++) {
 
var maxArr = attempts[i];

for (var j = i + 1; j < attempts.length; j++) {
    
    if (maxArr < attempts[j]) {
      
      maxArr = attempts[j];
      var lessArr = attempts[i];
      attempts[i] = maxArr;
      attempts[j] = lessArr;
      
    }
     
  }
  
}

console.log(attempts)

averageBest = (attempts[0] + attempts[1] + attempts[2]) / 3;

console.log(averageBest)

if (averageBest > qualificationDistance) {

  qualified = true;
  
} else {
  
  qualified = false;

}
Мое решение задания

// Сортируем массив
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;
}
else {
qualified = false;
}

Для сравнения решил на Python

qualificationDistance = 200
attempts = [120, 150, 160, 201, 203, 180, 202, 205]
qualified = False
averageBest = 0

1

tempList = sorted(attempts)[:-4:-1]
averageBest = sum(tempList) / len(tempList)
print(int(averageBest))

2

if averageBest > qualificationDistance:
qualified = True
print(‘Поздравляем! Вы прошли предворительную квалификацию.’)
else:
print(‘Вам следует пересмотреть тренировочный подход.’)

1 лайк

Как советуется в подсказке, принял вызов :sunglasses: и сортировал массив от больших значений к меньшим. Как говорит мой знакомый программист “Работает и ЛАДНО” :laughing:.

Решил как-то так

var qualificationDistance = 200;
var attempts = [120, 150, 160, 201, 203, 180, 202];
var qualified = false;
var averageBest = 0;
var summBest = 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 (maxValue < attempts[j]) {
maxValue = attempts[j];
maxValue = attempts[j];
var swap = attempts[i];
attempts[i] = maxValue;
attempts[j] = swap;
}
}
}
console.log(attempts);

var counter = 0;

for (i = 0; i <=2; i++) {
summBest += attempts[i];
counter++;
}

averageBest = summBest / counter;

if (averageBest > qualificationDistance) {
qualified = true;
console.log(‘Пройдено!’)
} else {
qualified = false;
console.log(’#feelsBadMan’);
}

1 лайк

У меня так вышло:

code
var qualificationDistance = 200;
var attempts = [120, 150, 160, 201, 203, 180, 202];
var qualified = false;
var averageBest = 0;

attempts.sort( function(a, b) { return b - a });
averageBest = (attempts[0] + attempts[1] + attempts[2]) / 3;

if (averageBest > qualificationDistance) {
  qualified = true;
}

тут многие пишут, что можно было бы воспользоваться функциями,встроенными в язык. типа 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;
4 лайка

Написал такой код, все работает)))

var qualificationDistance = 200;
var attempts = [120, 150, 160, 201, 203, 180, 202];
var qualified = false;
var averageBest = 0;

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);
console.log(attempts.length);

// averageBest = (attempts[4] + attempts[5] + attempts[6]) / 3;
averageBest = (attempts[attempts.length - 1] + attempts[attempts.length - 2] + attempts[attempts.length - 3]) / 3;
if (averageBest > qualificationDistance) {
qualified = true;
}

console.log(qualified);

Форматируйте код с помощью кнопки </> пожалуйста.

хорошо, буду знать

Добавил две переменные, чтобы программа стала более универсальна, переменная 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;
1 лайк

У меня проблема возникла при проверке кода ботом. Вот мой код:

Summary

var qualificationDistance = 200;
var attempts = [201,199,191,150];
var qualified = false;
var averageBest = 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 i = 0; i <= 2; i++) {
// averageBest += Math.round(attempts[i] / 3);
averageBest += attempts[i] / 3;
}
console.log(averageBest);

if (averageBest >= qualificationDistance) {
qualified = true;
} else {
qualified = false;
}
console.log(qualified);

И в одной из проверок вот такой результат выходит: 196.99999999999997
Я уже прочитала про эту “аномалию”, попробовала Math.ceil/round, но это не помогло. несостыковки тогда вылазят в других тестах. Как это решить?

Вы фактически рассчитываете не среднее арифметическое трех элементов, а на каждой итерации цикла делите соответствующий элемент на 3, после чего суммируете их. В результате деления могут получаться бесконечные числа и происходит их округление по следующей причине:
https://learn.javascript.ru/
Чтобы этого избежать, необходимо в цикле найти сумму элементов, а деление на их количество выполнить отдельным действием вне цикла.

1 лайк

выполнил по-возрастанию и по убыванию. Вариант с убыванием. Вопрос: Следовало ли здесь использовать оператор “?” при сравнении?

var qualificationDistance = 200;
var attempts = [120, 150, 160, 201, 203, 180, 202];
for (var i = attempts.length - 1; i >= 1; i--) {
  var minValue = attempts[i];
  for (var j = i - 1; j >= 0; j--) {
    if (attempts[j] < attempts[i]) {
      minValue = attempts[j];
      var samp = attempts[i];
      attempts[i] = minValue;
      attempts[j] = samp;
    }
  }
}
 var averageBest = (attempts[0] + attempts[1] + attempts[2]) / 3;
 var qualified = (averageBest > qualificationDistance)? true:false;

Мой код

Summary

var qualificationDistance = 200;
var attempts = [120, 150, 160, 201, 203, 180, 202];
var qualified = false;
var averageBest = 0;
var nach = 0;
for(var i = 0;i < attempts.length - 1;i++){
var minValue = attempts[i]
for(var j = i + 1;j < attempts.length;j++){

if(attempts[j] > minValue){
  minValue = attempts[j]
  var swap = attempts[i]
  attempts[i] = minValue
  attempts[j] = swap
  }
}
averageBest = (attempts[0] + attempts[1] + attempts[2]) / 3

if(averageBest > qualificationDistance ){
qualified = true;
}else{
qualified = false;
}
}

Решил отсортировать не весь массив, а лишь наибольшие 3 элемента.

Мой код
var attemptsBest = [];
var n = 3;

//запускаем цикл, который отсортирует 3 наибольших значения
for (var i = 0; i <= n-1 ; i++) {
  attemptsBest[i] = attempts[i]; 
  for (var j = i; j <= attempts.length -1 ; j++) {
    if (attemptsBest[i] < attempts[j]) {
        var swap = attempts[j];
        attempts[j] = attemptsBest[i];
        attemptsBest[i] = swap; 
    }
  }
}

//находим среднее значение
for (var o = 0; o <= attemptsBest.length -1 ; o++) {
  averageBest += attemptsBest[o]; 
}
averageBest /= n; 

//делаем проверку
if (averageBest >= qualificationDistance) {
  qualified = true; 
}