Taras_Serevann
@Taras_Serevann
веб-разработчик, автор

Есть ли более элегантное решение у этой задачи?

ТЗ:
Print out the numbers from 1 - 20.
The rules:
For numbers divisible by 3, print out "Fizz".
For numbers divisible by 5, print out "Buzz".
For numbers divisible by both 3 and 5, print out "FizzBuzz" in the console.
Otherwise, just print out the number.

Мой код:
for (var i = 1; i <= 20; i++) {
    if (i % 3 === 0 && i % 5 != 0) {
        console.log("Fizz");
    } else if (i % 5 === 0 && i % 3 != 0) {
        console.log("Buzz");
    } else if (i % 5 === 0 && i % 3 === 0) {       console.log("FizzBuzz");
    } else {
    console.log(i);
    
}
}

Что можете сказать о моем коде? Хорошо или у этой задачи есть более элегантное/понятное/красивое решение?
  • Вопрос задан
  • 4534 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
for (var i = 1; i <= 20; i++) {
   var str = (i%3 ? '' : 'Fizz')+(i%5 ? '' : 'Buzz');
   console.log(str == '' ? i : str);
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Можно чуть упростить условия:
for(var i = 0;i<20;i++) {
  var str = '';
  if (i % 3 === 0) {
    str += 'Fizz';
  }
  if (i % 5 === 0) {
      str += 'Buzz';
  }

  console.log(str ? str : i);
}


Последовательности чисел еще можно генерить как-то так:
var range  = Array.apply(0, Array(20)).map(function(n , i) { return i; });

но это уже мелочи.
Ответ написан
@dj_raphael
а каковы критерии элегантности?
если хорошо читаемый код, то оставить как есть.
если оптимизировать по времени выполнения то завести булевые переменные и вложенные if
if (b3){
   if (b5) {
      console.log("FizzBuzz");
   } else {
      console.log("Fizz");
   }
} else if (b5) {
      console.log("Buzz");
} else {
      console.log(i);
}

либо просто тупо написать 20 строк console.log и кодогенератор приложить..
Ответ написан
KEKSOV
@KEKSOV
Очевидный минус вашего решения - многократное вычисление остатка от деления и лишние проверки. Это можно упростить так:
for( var i = 1, div_3 = false, div_5 = false; i <= 20; i++ ) {
  div_3 = ( i % 3 == 0 );
  div_5 = ( i % 5 == 0 );

  if ( div_3 && div_5 ) {
    console.log( "FizzBuzz" );
  }
  else if ( div_3 ) {
    console.log("Fizz");
  }
  else if ( div_5 ) {
    console.log("Buzz");
  }
  else {
    console.log(i);
  }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы