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

Глючит проверка. Вызываю @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;
}
9 Симпатий

Вот мой вариант, через 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;
}

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

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;
    }
  }
}
2 Симпатий

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

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);
2 Симпатий

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

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;
}

зачем эти конструкты в виде 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).

2 Симпатий

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

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);
};

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

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 Симпатия