2015-02-13 2 views
0

Вот моя попытка FizzBuzzМои FizzBuzz пытаются

for (i=1;i<=20;i++) { 
 
    if (i % 3 == 0 && i % 5 !== 0) { 
 
     console.log ("Fizz"); 
 
    } 
 
    else if (i % 3 ==0 && i % 5 == 0) { 
 
     console.log ("FizzBuzz"); 
 
    } 
 
    else if (i % 5 ==0 && i % 3 !== 0){ 
 
     console.log ("Buzz"); 
 
    } 
 
    else { 
 
     console.log (i); 
 
    } 
 
    
 
};

Codecademy принял это как правильный, но я хотел бы, чтобы убедиться, что это действительно так. Спасибо вам большое заблаговременно. P.S. Я искренне надеюсь, что на этот раз мой вопрос не слишком расплывчатый или абстрактный или не по теме :)

+0

Условие 'еще если (я% 5 == 0 && я% 3! == 0)' избыточна, 'иначе, если (я% 5 == 0)' достаточно –

+0

Если ваш код работает, то он не по теме. Я думаю, что это слишком расплывчато для codereview.SE –

+5

Если вопрос задает нечеткие комментарии к рабочему коду, он может быть оффтопным и лучше подходит для http://codereview.stackexchange.com/ – Codor

ответ

1

Это правильно, но подробно.

Давайте немного сломаем задачу. У вас есть два фактора: он кратен 3, и он кратен 5? Разумеется, это может быть и то, и другое, или нет, в общей сложности четыре случая. Как так:

 | Not x5 | x5 
-------+--------+--------- 
Not x3 | number | Buzz 
    x3 | Fizz | FizzBuzz 

Вы можете представить это в коде очень просто:

function getFizzBuzz(n) { 
    if(n%5) { // not x5 
     if(n%3) // not x3 either 
      return n; 
     else // x3 
      return 'Fizz'; 
    } 
    else { 
     if(n%3) 
      return 'Buzz'; 
     else 
      return 'FizzBuzz'; 
    } 
} 

Тогда просто сделать петлю:

for(i=1; i<=20; i++) console.log(getFizzBuzz(i)); 

Если вы действительно хотите, вы можете сделать свой код супер -compact. Разумеется, гораздо менее понятно.

function getFizzBuzz(n) { 
    return n%5?(n%3?n:'Fizz'):(n%3?'Buzz':'FizzBuzz'); 
} 

Существует много способов выполнить эту задачу. Разница в том, как легко другому программисту прочитать ваш код позже.

+0

Я бы сказал, что использование комментариев предполагает, что это не простое решение. Если бы это было просто и легко понять, они не были бы необходимы. Это минималистский и умный, но не такой простой. Использование некоторых '&&' и только четырех операторов if/else вместо вложенных if/else может помочь с ясностью. –

0

Я думаю, что это может быть несколько решений, дело в том, чтобы сделать его более читаемым, как указал Нит.

Вот моя версия с Working Fiddle

Код:

for (var a = 1; a <= 20; a++) { 
    var log = (a % 3 == 0 && a % 5 == 0) ? 'fizzbuzz' : null; 
    if (!log) log = a % 3 == 0 ? 'fizz' : null; 
    if (!log) log = a % 5 == 0 ? 'buzz' : null; 
    if (log) console.log(log); 
    else console.log(a); 
} 
+0

Я не считаю это особенно читаемым, лично ... –

0

Я думаю, что ваше решение хорошо. Это также довольно легко читается, как есть - это big сделка в программировании.

Единственное, что я хотел бы предложить, это начать с нескольких проверок 3 и 5 (чтобы вы могли удалить несколько проверок), используя оператор сравнения равных сравнений (===) и немного изменив стиль кода - снова , читаемость огромный. (Некоторые изменения стиля я предлагаю не может быть рекомендован в зависимости от того, кто вы в конечном итоге работает или так взять их с зерном соли.)

Вот эти предложения в виде кода:

for (i = 1; i <= 20; i++) { 
    if (i % 3 === 0 && i % 5 === 0) 
     console.log("FizzBuzz") 
    else if (i % 3 === 0) 
     console.log("Fizz") 
    else if (i % 5 === 0) 
     console.log("Buzz") 
    else 
     console.log(i) 
}; 
0

там это много способов сделать это, но важно соблюдать правила кодирования и сделать его более простым и понятным.

class fizzbuzz { 
 
\t 
 
\t constructor(fizz,buzz,length){ 
 
\t \t this.fizz = fizz; 
 
\t \t this.buzz = buzz; 
 
\t \t this.length = length; 
 
\t } 
 

 
\t output() { 
 
\t \t for(let i = 0; i < this.length; i++){ 
 
\t \t \t console.log(this.getFizzBuzz(i)); 
 
\t \t } 
 
\t } 
 

 
\t getFizzBuzz(i) { 
 
\t \t if(i % this.fizz == 0 && i % this.buzz == 0) 
 
\t \t \t return 'fizzbuzz' 
 
\t \t else 
 
\t \t \t return i % this.fizz == 0 ? 'fizz' : 'buzz'; 
 
\t } 
 
} 
 

 
new fizzbuzz(3,5,100).output();