Быстрее, выше, сильнее

Глючит проверка. Вызываю @GreenLera
Первый тест. Список показателей — [“выносливость”,“скорость”,“ловкость”,“гибкость”,“сила”], уровни характеристик — [7,12,5,15,11], время тренировки — 60. Ожидаю результат: [7,12,5,18,11]

Ваше значение levels равное [7,12,5,17,11] не совпадает с ожидаемым значением [7,12,5,18,11].

хотя в условии

Если тренировка от 30 минут (не включая это значение) до одного часа (включая это значение), увеличивай гибкость на 2.

Скорей всего опечатка

Здравствуйте. Да, была опечатка, мы её уже исправили. Проверяйте)

Решила таким образом, но хотелось бы знать, может у кого-нибудь получилось более лаконичное решение?

Summary
var indicators = ['сила', 'гибкость', 'выносливость', 'скорость', 'ловкость'];
var levels = [8, 15, 9, 12, 11];
var trainingTime = 30;

 if(trainingTime <= 30) {
  levels[indicators.indexOf('скорость')] += 3;
  levels[indicators.indexOf('ловкость')] += 3;
    }
  else if(trainingTime > 30 && trainingTime <= 60) {
    levels[indicators.indexOf('гибкость')] += 3;
    }
  else if(trainingTime > 60) { 
    levels[indicators.indexOf('сила')] += 2;
    levels[indicators.indexOf('выносливость')] += 2;
}
15 лайков

Вот мой вариант, через if и for

Summary
var indicators = ['сила', 'гибкость', 'выносливость', 'скорость', 'ловкость'];
var levels = [8, 15, 9, 12, 11];
var trainingTime = 30;

if (trainingTime <= 30) {
  for (var i = 0; i < indicators.length; i++){
    if (indicators[i] == 'скорость' || indicators[i] == 'ловкость') {
      levels[i] += 3;
    }
  }
} else if (trainingTime > 30 && trainingTime <= 60) {
  for (var i = 0; i < indicators.length; i++){
    if (indicators[i] == 'гибкость') {
      levels[i] += 3;
    }
  }
} else if (trainingTime > 60) {
  for (var i = 0; i < indicators.length; i++){
    if (indicators[i] == 'сила' || indicators[i] == 'выносливость') {
      levels[i] += 2;
    }
  }
}
4 лайка

Я не приследовал лаконичность, но:
var power = indicators.indexOf(‘сила’);
var flexibility = indicators.indexOf(‘гибкость’);
var endurance = indicators.indexOf(‘выносливость’);
var speed = indicators.indexOf(‘скорость’);
var agility = indicators.indexOf(‘ловкость’);

if (trainingTime<=30){
levels[speed]+=3;
levels[agility]+=3;
}else if(trainingTime<=60){
levels[flexibility]+=3;
}else if(trainingTime>60){
levels[power]+=2;
levels[endurance]+=2;
}

1 лайк

Сами условия можно записать проще:

if (trainingTime <= 30) {
...
} else if (trainingTime <= 60) {
...
} else {
...
}
1 лайк

Решил тоже через цикл, который использовал один раз:

Summary
for (var i = 0; i < levels.length; i++) {
  if (trainingTime <= 30) {
    if (indicators[i] === 'скорость' || indicators[i] === 'ловкость') {
      levels[i] += 3;
    }
  } else if (trainingTime <= 60) {
    if (indicators[i] === 'гибкость') {
      levels[i] += 3;
    }
  } else {
    if (indicators[i] === 'сила' || indicators[i] === 'выносливость') {
      levels[i] += 2;
    }
  }
}
8 лайков

А я почему то через функцию сделал.

var indicators = [‘сила’, ‘гибкость’, ‘выносливость’, ‘скорость’, ‘ловкость’];
var levels = [8, 15, 9, 12, 11];
var trainingTime = 30;

var findIndex = function (indicator) {
for (var i = 0; i < indicators.length; i++ ) {
if (indicators[i].indexOf(indicator) !== -1) {
return i; }}};

if (trainingTime <= 30) {
levels[findIndex(‘скорость’)] +=3;
levels[findIndex(‘ловкость’)] +=3;
}
if (trainingTime > 30 && trainingTime <= 60) {
levels[findIndex(‘гибкость’)] +=3;
}
if (trainingTime > 60) {
levels[findIndex(‘сила’)] +=2;
levels[findIndex(‘выносливость’)] +=2;
}

Сначала нагородил кучу переменных, искал индексы, мудрил ппц, потом подсмотрел у Jankelbrod , как она находила индексы и все стало на свои места , но на самом деле мудрил из за непонимания работы indexOf с массивами, т.к. было объяснение только по поводу работы со строкой этой функции ,потом разобрался…

Быстрее, выше, сильнее
console.log('Программ "Быстрее, выше, сильнее" by Nerealist');

var indicators = ['сила', 'гибкость', 'выносливость', 'скорость', 'ловкость'];
var levels = [8, 15, 9, 12, 11];
var trainingTime = 30;
console.log('Ваши характеристики соответственно : ' + indicators + ' ' + levels);

if (trainingTime <= 30) {
  levels[indicators.indexOf('скорость')] += 3;
  levels[indicators.indexOf('ловкость')] += 3;
}else if (trainingTime > 30 && trainingTime <= 60) {
  levels[indicators.indexOf('гибкость')] += 3;
}else {
  levels[indicators.indexOf('сила')] += 2;
  levels[indicators.indexOf('выносливость')] += 2;
}

console.log('Ваши характеристики после тренировки длительность ' + trainingTime + ' мин, Сэр : ' + levels);
5 лайков

У меня по ходу самое Не лаконичное решение получилось((

if (trainingTime <= 30) {
  
  for (i = 0; i <= indicators.length - 1; i ++) {

if (indicators[i] == 'скорость') {
  levels[i] += 3;
  }
 if (indicators[i] == 'ловкость') {
  levels[i] += 3;
  }
}
  }
if (trainingTime > 30 && trainingTime <= 60) {
  
  for (i = 0; i <= indicators.length - 1; i ++) {

if (indicators[i] == 'гибкость') {
  levels[i] += 3;
  }
}
  }
  
if (trainingTime > 60) {
  
  for (i = 0; i <= indicators.length - 1; i ++) {

if (indicators[i] == 'сила') {
  levels[i] += 2;
  }
   if (indicators[i] == 'выносливость') {
  levels[i] += 2;
  }
}
  }

Видимо надо использовать indexOf, но мы использовали его только со строками, но не с массивами…

Сводка

var indicators = [‘сила’, ‘гибкость’, ‘выносливость’, ‘скорость’, ‘ловкость’];
var levels = [8, 15, 9, 12, 11];
var trainingTime = 45;

var levelUp = 0;
var firstSkill = ‘’;
var secondSkill = ‘’;

if (trainingTime <= 30) {
levelUp = 3;
firstSkill = ‘скорость’;
secondSkill = ‘ловкость’;
} else if (trainingTime > 30 && trainingTime <= 60) {
levelUp = 3;
firstSkill = ‘гибкость’;
} else if (trainingTime > 60) {
levelUp= 2;
firstSkill = ‘сила’;
secondSkill = ‘выносливость’;
}

for (var i = 0; i < indicators.length; i ++) {
console.log(indicators[i], firstSkill);
if ((indicators[i] === firstSkill) || (indicators[i] === secondSkill)) {
levels[i] += levelUp;
}

}

Немного громоздко вышло

Сводка

var indicators = [‘сила’, ‘гибкость’, ‘выносливость’, ‘скорость’, ‘ловкость’];
var levels = [8, 15, 9, 12, 11];
var trainingTime = 30;
var p = ‘сила’;
var f = ‘гибкость’;
var st = ‘выносливость’;
var sp = ‘скорость’;
var a = ‘ловкость’;

for (var i=0; i<indicators.length; i++){
if (trainingTime <= 30 && (indicators[i].indexOf(sp)>=0 || indicators[i].indexOf(a)>=0)){
levels[i]+=3;
}
if ((trainingTime > 30 && trainingTime <= 60) && indicators[i].indexOf(f)>=0){
levels[i]+=3;

}
if (trainingTime > 60 && (indicators[i].indexOf§>=0 || indicators[i].indexOf(st)>=0)){
levels[i]+=2;
}
}

решил отказаться от цикла в этом решении, но с циклом тоже можно интересно сделать:

var indicators = ['сила', 'гибкость', 'выносливость', 'скорость', 'ловкость'];
var levels = [8, 15, 9, 12, 11];
var trainingTime = 30;

  if (trainingTime <= 30) {
    levels[indicators.indexOf('скорость')] += 3;
    levels[indicators.indexOf('ловкость')] += 3;
  } else if (trainingTime > 30 && trainingTime <= 60) {
    levels[indicators.indexOf('гибкость')] += 3;
  } else  if (trainingTime > 60) {
    levels[indicators.indexOf('сила')] += 2;
    levels[indicators.indexOf('выносливость')] += 2;
}
1 лайк

зачем эти конструкты в виде else? можно же обойтись безальтернативными проверками.
остальные вообще походу подвисли на циклах и суют их куда ни глядя… :rofl:
переменные какие то промежуточные вводят еще.

моё рабочее (самое простое на форуме на данный момент)
var indicators = ['сила', 'гибкость', 'выносливость', 'скорость', 'ловкость'];
var levels = [8, 15, 9, 12, 11];
var trainingTime = 30;

if (trainingTime <= 30) {
  levels[indicators.indexOf('скорость')]+=3;
  levels[indicators.indexOf('ловкость')]+=3;
}
if (trainingTime > 30 && trainingTime <= 60) {
  levels[indicators.indexOf('гибкость')]+=3;
}
if (trainingTime > 60) {
  levels[indicators.indexOf('сила')]+=2;
  levels[indicators.indexOf('выносливость')]+=2;
}

объясняю: индекс слова-ключа является индексом шифра. мы его смещаем (т.е. добавляем к значению) в зависимости от прохождения проверки значения времени тренировки. притом проверки независимые, т.е. прибавляется либо к одному, либо к двум, либо к двум(2). Т.е. не нужно использовать else. Просто перезаписываем исходный шифр (levels).

3 лайка

*Мне так пока понятней что и откуда взялось. *
Конечно можно теперь сократить.

var indicators = [‘сила’, ‘гибкость’, ‘выносливость’, ‘скорость’, ‘ловкость’];
var levels = [8, 15, 9, 12, 11];
var trainingTime = 30;
var i=0;

if (trainingTime <=30) {
i= indicators.indexOf(‘скорость’);
levels[i] +=3;
i= indicators.indexOf(‘ловкость’);
levels[i] +=3;

}
if (trainingTime >30 && trainingTime <=60) {
i= indicators.indexOf(‘гибкость’);
levels[i] +=3;
}
if (trainingTime >60) {
i= indicators.indexOf(‘сила’);
levels[i] +=2;
i= indicators.indexOf(‘выносливость’);
levels[i] +=2;
}

Убрал у себя else, но с переменными мне просто как то приятнее код читать, менее громоздко ИМХО (строки короче что ли, возможно просто вкусовщина):

Те же яйца но с переменными
var indicators = ['сила', 'гибкость', 'выносливость', 'скорость', 'ловкость'];
var levels = [8, 15, 9, 12, 11];
var trainingTime = 30;

var strength = indicators.indexOf('сила');
var flexibility = indicators.indexOf('гибкость');
var stamina = indicators.indexOf('выносливость');
var speed = indicators.indexOf('скорость');
var agility = indicators.indexOf('ловкость');

if (trainingTime <= 30) {
  levels[agility] += 3;
  levels[speed] += 3;
};
if (trainingTime > 30 && trainingTime <= 60) {
  levels[flexibility] += 3;
}; 
if (trainingTime > 60) {
  levels[strength] += 2;
  levels[stamina] += 2;
};
Moй вариант

let levelUp = (hr,ball) => levels[indicators.indexOf(hr)] += ball;
let [a,b] = [2,3];

if(trainingTime>60){
levelUp(‘сила’, a);
levelUp(‘выносливость’, a)
}else{
(trainingTime<=30)?(levelUp(‘скорость’, b),levelUp(‘ловкость’, b)):levelUp(‘гибкость’, b);
};

1 лайк

Мне нравиться ваш вариант!
А вот код курильщика ))

var indicators = ['сила', 'гибкость', 'выносливость', 'скорость', 'ловкость'];
var levels = [8, 15, 9, 12, 11];
var trainingTime = 30;

if(trainingTime > 0 && trainingTime <= 30){
  for(var i = 0; i < indicators.length; i++){
   if(indicators[i] === 'скорость'){
      levels[i] += 3;
     }
     
    if(indicators[i] === 'ловкость'){
      levels[i] += 3;
     }
  }
}

if(trainingTime > 30 && trainingTime <= 60){
  for(var i = 0; i < indicators.length; i++){
   if(indicators[i] === 'гибкость'){
      levels[i] += 3;
     }
  }
}


if(trainingTime > 60){
  for(var i = 0; i < indicators.length; i++){
   if(indicators[i] === 'сила'){
      levels[i] += 2;
     }
     
    if(indicators[i] === 'выносливость'){
      levels[i] += 2;
     }
  }
}

Добрый день! Может вы сможете подсказать, понимаю, что решение точно неверное (нет связи между массивами), начинал с него и хотел протестировать, но не работает.
Но, по идее, оно должно работать и выводить нужные числа?

var indicators = ['сила', 'гибкость', 'выносливость', 'скорость', 'ловкость'];
var levels = [8, 15, 9, 12, 11];
var trainingTime = 30;

    if (trainingTime <= 30) {
      levels[3] += 3;
      levels[4] += 3;
      }
      if (trainingTime > 30 && trainingTime <= 60) {
        levels[1] += 3;
        }
        if (trainingTime > 60) {
          levels[0] += 2;
          levels[2] += 2;
          }
1 лайк

у нас в первом массиве рандомно меняется порядок слов, а статы к ним привязаны. вам нужно это реализовать. программа абы как работать не будет, ТЗ четкое
это собственно единственная сложность, условия проходят в другой теме

3 лайка