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

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

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

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

Мой вариант :lion:

Рекорды по прыжкам в длину
console.log('Программа "Рекорды по прыжкам в длину" by Nerealist');

//Входные данные
var qualificationDistance = 200;
var attempts = [120, 150, 160, 201, 203, 180, 202];
var qualified = false;
var averageBest = 0;
console.log('Квалификационное значение прыжка: ' + qualificationDistance);
console.log('Ваши прыжки за тренировку : ' + attempts);

// Сортируем массив по возрастанию
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[attempts.length - 1]) + (attempts[attempts.length - 2]) + (attempts[attempts.length - 3])) / 3;

//Сравниваем среднее значение с квалификационным
if (averageBest > qualificationDistance) {
  qualified = true;
  console.log('С такими прыжками вы в лёгкую пройдете квалификацию, Сэр');
}else {
  qualified = false;
  console.log('К сожалению Вам нужно больше тренироваться, вы не проходите, Сэр');
}
1 лайк

Вроде не много кода получилось и понятно все. Главное что сам дошел.

var qualificationDistance = 200;
var attempts = [201,199,191,150];
var qualified = false;
var averageBest = 0;
for (var i = 0; i < attempts.length; i++) {
  for (var j = i + 1; j < attempts.length; j++) {
    if (attempts[j] > attempts[i]) {
      var swap = attempts[i];
      attempts[i] = attempts[j];
      attempts[j] = swap;
    }
  }
}
console.log(attempts);
for (var k = 0; k < 3; k++) {
  averageBest += attempts[k];
}
averageBest /= 3;
qualified = averageBest > qualificationDistance;

Хай, всем!

А как такой вариант?

function searchMax(a, b) {
return b-a;
}
attempts.sort(searchMax);
var maxResult = attempts.slice(0,3);
var sum = 0;
for (var i = 0; i &lt; maxResult.length; i++){
sum+=attempts[i];
}
averageBest = sum/3;
averageBest &gt; qualificationDistance ? qualified = true : qualified = false;
console.log(qualified);

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

for (var i=0;i <= n - 1;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;
}
}
averageBest += attempts[i];
}
averageBest /= n;
qualified = averageBest > qualificationDistance;

Нашел два решения.
С сортировкой на увеличение:

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 min=attempts[i];
for (var j=i+1; j<=attempts.length-1; j++) {
if (attempts[j]<min){
min=attempts[j];
var swap=attempts[i];
attempts[i]=min;
attempts[j]=swap;
}
}
}
console.log(attempts);
averageBest=(attempts[attempts.length-1]+attempts[attempts.length-2]+attempts[attempts.length-3])/3

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

С сортировкой на уменьшение (изменил знак с меньше на больше в условии во внутреннем цикле):

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

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 max=attempts[i];
for (var j=i+1; j<=attempts.length-1; j++) {
if (attempts[j]>max){
max=attempts[j];
var swap=attempts[i];
attempts[i]=max;
attempts[j]=swap;
}
}
}
console.log(attempts);
averageBest=(attempts[0]+attempts[1]+attempts[2])/3

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

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


for (var j = 0; j < attempts.length-1; j++) {
var maxJump = attempts[j];

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

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

Мой вариант

//Start

for (var i = 0; i < attempts.length - 1; i++) {
  for (var j = i + 1; j < attempts.length; j++) {    
    if (attempts[i] > attempts[j]) {
      var startNumber = attempts[i];
     
      attempts[i] = attempts[j];
      attempts[j] = startNumber;
    }
  }
}

averageBest = (attempts[attempts.length - 3] + attempts[attempts.length - 2] + attempts[attempts.length - 1]) / 3

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

//End

Хороший вариант, но можно немного универсализировать программу:

  1. Вместо длинной строки присваивания averageBest можно вести цикл на n первых элементов отсортированного массива (где n - количество элементов для среднего);
  2. Можно заметить, что в qualified можно вставить прямое значение неравенства:

qualified = averageBest > qualificationDistance;

Короткий вариант

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

for (var j = 0; j < 3; j++) {
BestNum[j] = Math.max(…attempts);
attempts.splice(attempts.indexOf(BestNum[j]), 1);
averageBest += BestNum[j];
}

averageBest /= 3;

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

вот мое решение с сортировкой по возрастанию

for(var i = 0; i <= attempts.length-2; i++){
var minValue = attempts[i];
for(var j = i+1; j <= attempts.length-1; j++){
if(minValue > attempts[j]){
minValue = attempts[j];
var swap = attempts[i];
attempts[i] = minValue;
attempts[j] = swap;
}
}
}

averageBest = (attempts[attempts.length-1] + attempts[attempts.length-2] + attempts[attempts.length-3])/3;

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

а вот с сортировкой по убыванию

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];
var swap = attempts[i];
attempts[i] = maxValue;
attempts[j] = swap;
}
}
}

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

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

У меня вопрос, а переменные minValue, swap не лучше обьявлять внутри цыкла?
Они обьявлены глобально, если я буду сортировать разные масивы, код будет работать, но не правильно?

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

//Сортировка массив от большего к меньшему
for(var i = 0; i <= attempts.length-1; i++ ){
  var averageMax = attempts[i];
  
  for(var j = i + 1; j <= attempts.length-1; j++)
  
    if(averageMax < attempts[j]){
      averageMax = attempts[j];
      var swap = attempts[i]
      attempts[i] = averageMax;
      attempts[j] = swap;
    }
}


//Количество лучших прижков
var amountBestJump = 3; 

//Сумма лучших прижков
for(var i = 0; i < amountBestJump; i++){
  averageBest += attempts[i];
}

//Среденее значение cуммы лучших прижков
averageBest /= amountBestJump;

if( averageBest >= qualificationDistance){
    qualified = true;
    console.log("Поздравляю, Вы годны к призыву, куда выезжать?");
}else{
  qualified = false;
  console.log("Не огорчайтесь, армия улучшит ваши результаты")
}

var att = attempts.sort();

for (var i =0; i<= att.length-1; i++){averageBest = (att[att.length-1]+att[att.length-2]+att[att.length-3])/3;}

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