Форматируйте код с помощью кнопки </> пожалуйста.
хорошо, буду знать
Добавил две переменные, чтобы программа стала более универсальна, переменная 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;
У меня проблема возникла при проверке кода ботом. Вот мой код:
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/
Чтобы этого избежать, необходимо в цикле найти сумму элементов, а деление на их количество выполнить отдельным действием вне цикла.
выполнил по-возрастанию и по убыванию. Вариант с убыванием. Вопрос: Следовало ли здесь использовать оператор “?” при сравнении?
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;
}
Мой вариант
Рекорды по прыжкам в длину
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('К сожалению Вам нужно больше тренироваться, вы не проходите, Сэр');
}
Вроде не много кода получилось и понятно все. Главное что сам дошел.
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 < maxResult.length; i++){
sum+=attempts[i];
}
averageBest = sum/3;
averageBest > 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
Хороший вариант, но можно немного универсализировать программу:
- Вместо длинной строки присваивания averageBest можно вести цикл на n первых элементов отсортированного массива (где n - количество элементов для среднего);
- Можно заметить, что в 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;}