2013-05-18 46 views
2

有人可以糾正我的代碼FizzBu​​zz?似乎有一個小錯誤。下面這個代碼打印所有的號碼,而不是僅打印不屬於被3整除或5使用Javascript的FizzBu​​zz程序(詳細內容)

號編寫將輸出數字從1100的程序。但是,對於三的倍數,打印"Fizz"而不是數字,併爲五的倍數,打印"Buzz"。對於數字是三和五的倍數,請打印"FizzBuzz"

function isDivisible(numa, num) { 
    if (numa % num == 0) { 
    return true; 
    } else { 
    return false; 
    } 
}; 

function by3(num) { 
    if (isDivisible(num, 3)) { 
    console.log("Fizz"); 
    } else { 
    return false; 
    } 
}; 

function by5(num) { 
    if (isDivisible(num, 5)) { 
    console.log("Buzz"); 
    } else { 
    return false; 
    } 
}; 

for (var a=1; a<=100; a++) { 
    if (by3(a)) { 
    by3(a); 
    if (by5(a)) { 
     by5(a); 
     console.log("\n"); 
    } else { 
     console.log("\n"); 
    } 
    } else if (by5(a)) { 
    by5(a); 
    console.log("\n"); 
    } else { 
    console.log(a+"\n") 
    } 
} 
+2

'i%5 == 0'不需要變成函數。退後一秒,問自己,「我該怎麼辦?」 – Blender

+0

這是一個常見的問題..見http://c2.com/cgi/wiki?FizzBu​​zzTest – sachleen

+1

是的,該功能是不需要的@blender – pacmanfordinner

回答

5
/*Write a program that prints the numbers from 1 to 100. But for multiples of three print 「Fizz」 instead of the number and for the multiples of five print 「Buzz」. For numbers which are multiples of both three and five print 「FizzBuzz」*/ 

var str="",x,y,a; 
for (a=1;a<=100;a++) 
{ 
    x = a%3 ==0; 
    y = a%5 ==0; 
    if(x) 
    { 
     str+="fizz" 
    } 
    if (y) 
    { 
     str+="buzz" 
    } 
    if (!(x||y)) 
    { 
     str+=a; 
    } 
    str+="\n" 
} 
console.log(str); 

無論如何,您的函數都會返回falsy值,但無論如何都會打印。沒有必要使這個過於複雜。

小提琴:http://jsfiddle.net/ben336/7c9KN/

0

在你by3by5功能,您隱返回undefined如果是適用的,false如果它是不適用的,但你的if語句測試,如果它返回truefalse。如果適用,請返回true,以便您的if聲明可以收到它。

+0

好吧!,明白了。更正通過添加返回true ;. – pacmanfordinner

40
for (var i = 1; i <= 100; i++) { 
    var expletive = ''; 
    if (i % 3 === 0) expletive += 'Fizz'; 
    if (i % 5 === 0) expletive += 'Buzz'; 
    console.log(expletive || i); 
} 
+3

我喜歡console.log上的邏輯運算符用法。 –

+0

這是最好的解決方案。 – DanielaB67

5

與FizzBu​​zz和JavaScript鬼混作爲比較,以C#。

這裏是我的版本,通過更rigid語言嚴重影響:

function FizzBuzz(aTarget) { 
    for (var i = 1; i <= aTarget; i++) { 
     var result = ""; 
     if (i%3 === 0) result += "Fizz";   
     if (i%5 === 0) result += "Buzz"; 
     if (result.length ===0) result = i; 

     console.log(result); 
    } 
} 

我喜歡讀的結構和易用性。

現在,特雷弗·狄克遜巧妙所做的是繼電器的語言(falsenullundefined''(空字符串),0NaN(非數字))的假y值縮短碼。現在
,該if (result.length ===0) result = i;線是多餘的,在代碼如下:

function FizzBuzz(aTarget) { 
    for (var i = 1; i <= aTarget; i++) { 
     var result = ""; 
     if (i%3 === 0) result += "Fizz";   
     if (i%5 === 0) result += "Buzz"; 

     console.log(result || i); 
    } 
} 

在這裏,我們轉播的||經營者說:「如果result是假的,打印的迭代值(i)」。很酷的技巧,我想我需要更多地使用JavaScript來吸收這種邏輯。

你可以看到其他的例子(從GitHub),將範圍從之類的東西:

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

沒有在這裏變量,只是15,3 & 5(我上面的一個只有3分檢查師& 5,但有一個額外的變量,所以我想這是關心,或風格偏好的微基準。

要:

for(i=0;i<100;)console.log((++i%3?'':'Fizz')+(i%5?'':'Buzz')||i) 

其中,所有這一切在上線,中繼的事實,0是一個虛假的值,這樣你就可以使用,對於if-else缺兵少將的版本(? :),除||我們以前見過的詭計。

這裏是上面的一個更可讀的版本,有一些變量:

for (var i = 1; i <= 100; i++) { 
    var f = i % 3 == 0, b = i % 5 == 0; 
    console.log(f ? b ? "FizzBuzz" : "Fizz" : b ? "Buzz" : i); 
} 

一切的一切,你可以以不同的方式,我希望你拿起使用一些漂亮的提示在JavaScript: )

2
for(i = 1; i < 101; i++) { 
    if(i % 3 === 0) { 
     if(i % 5 === 0) { 
      console.log("FizzBuzz"); 
     } 
     else { 
      console.log("Fizz"); 
     } 
    } 
    else if(i % 5 === 0) { 
     console.log("Buzz"); 
    } 
    else { 
     console.log(i) 
    } 
} 
0
for (i=1; i<=100; i++) { 
    output = ""; 
    if (i%5==0) output = "buzz"; 
    if (i%3==0) output = "fizz" + output; 
    if (output=="") output = i; 
    console.log(output); 
} 
0

實用的風格! JSBin Demo

// create a iterable array with a length of 100 
// and map every value to a random number from 1 to a 100 
var series = Array.apply(null, Array(100)).map(function() { 
    return Math.round(Math.random() * 100) + 1; 
}); 

// define the fizzbuzz function which takes an interger as input 
// it evaluates the case expressions similar to Haskell's guards 
var fizzbuzz = function (item) { 
    switch (true) { 
    case item % 15 === 0: 
     console.log('fizzbuzz'); 
     break; 
    case item % 3 === 0: 
     console.log('fizz'); 
     break; 
    case item % 5 === 0: 
     console.log('buzz'); 
     break; 
    default: 
     console.log(item); 
     break; 
    } 
}; 

// map the series values to the fizzbuzz function 
series.map(fizzbuzz); 
1

Codeacademy今晚在我身上發射了一個FizzBu​​zz。我有一個模糊的記憶,它是「一件事」,所以我這樣做。不是最好的方式,也許,但不同於上面:

var data = { 
    Fizz:3, 
    Buzz:5 
}; 

for (var i=1;i<=100;i++) { 
    var value = ''; 
    for (var k in data) { 
     value += i%data[k]?'':k; 
    } 
    console.log(value?value:i); 
} 

它依賴於數據,而不是代碼。我認爲如果這種方法有一個優點,那就是你可以去FizzBu​​zzBing 3 5 7或者進一步添加額外的邏輯,只要你按規則指定的順序分配對象元素即可。例如:

var data = { 
    Fizz:3, 
    Buzz:5, 
    Bing:7, 
    Boom:11, 
    Zing:13 
}; 

for (var i=1;i<=1000;i++) { 
    var value = ''; 
    for (var k in data) { 
     value += i%data[k]?'':k; 
    } 
    console.log(value?value:i); 
} 
-1

不同功能的風格 - 幼稚

fbRule = function(x,y,f,b,z){return function(z){return (z % (x*y) == 0 ? f+b: (z % x == 0 ? f : (z % y == 0 ? b: z))) }} 

range = function(n){return Array.apply(null, Array(n)).map(function (_, i) {return i+1;});} 

range(100).map(fbRule(3,5, "fizz", "buzz")) 

,或者摻入結構如在上面的例子:即[[3, 「嘶嘶聲」],[5, 「嗡嗡」] ,...]

fbRule = function(fbArr,z){ 
    return function(z){ 
    var ed = fbArr.reduce(function(sum, unit){return z%unit[0] === 0 ? sum.concat(unit[1]) : sum }, []) 
    return ed.length>0 ? ed.join("") : z 
    } 
} 

range = function(n){return Array.apply(null, Array(n)).map(function (_, i) {return i+1;});} 

range(100).map(fbRule([[3, "fizz"],[5, "buzz"]])) 

或者,使用ramda [從https://codereview.stackexchange.com/questions/108449/fizzbuzz-in-javascript-using-ramda]

var divisibleBy = R.curry(R.compose(R.equals(0), R.flip(R.modulo))) 
var fizzbuzz = R.map(R.cond([ 
    [R.both(divisibleBy(3), divisibleBy(5)), R.always('FizzBuzz')], 
    [divisibleBy(3), R.aklways('Fizz')], 
    [divisibleBy(5), R.always('Buzz')], 
    [R.T, R.identity] 
])); 

console.log(fizzbuzz(R.range(1,101))) 
0

作爲ES6發生器:http://www.es6fiddle.net/i9lhnt2v/

function* FizzBuzz() { 

    let index = 0; 

    while (true) { 

     let value = ''; index++; 

     if (index % 3 === 0) value += 'Fizz'; 
     if (index % 5 === 0) value += 'Buzz'; 

     yield value || index; 

    } 

} 

let fb = FizzBuzz(); 
for (let index = 0; index < 100; index++) { 
    console.log(fb.next().value); 
} 
0

另一種解決方案,避免了多餘的部門和消除 「嘶嘶聲」 與 「嗡嗡」 之間多餘的空格:

var num = 1; 
    var FIZZ = 3; // why not make this easily modded? 
    var BUZZ = 5; // ditto 
    var UPTO = 100; // ditto 
        // and easily extended to other effervescent sounds 

    while (num < UPTO) 
    { 
     var flag = false; 
     if (num % FIZZ == 0) { document.write ("Fizz"); flag = true; } 
     if (num % BUZZ == 0) { document.write ("Buzz"); flag = true; } 
     if (flag == false) { document.write (num); } 
     document.write ("<br>"); 
     num += 1; 
    } 

如果你使用JScript中使用/ JSC /.net,使用Console.Write()。如果您使用的是Node.js,請使用process.stdout.write()。不幸的是,console.log()追加了換行符,並且忽略了後退空間,所以它無法用於此目的。你也可以追加到一個字符串並打印出來。 (我是一個完整的n00b,但我認爲(好吧,希望)我已經相當徹底。)

「Whaddya認爲,先生?「

0

那我怎麼沒它:

不是最好的代碼,但該訣竅

var numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; 

for(var i = 0 ; i <= 19 ; i++){ 

var fizz = numbers[i] % 3 === 0; 
var buzz = numbers[i] % 5 === 0; 
var fizzBuzz = numbers[i] % 5 === 0 && numbers[i] % 3 === 0; 

if(fizzBuzz){ 
    console.log("FizzBuzz"); 
    } 
else if(fizz){ 
    console.log("Fizz"); 
    } 
else if(buzz){ 
    console.log("Buzz"); 
    }  
else{ 
    console.log(numbers[i]); 
    } 

} 
0

檢查了這一點

function fizzBuzz(){ 
    for(var i=1; i<=100; i++){ 
     if(i % 3 ===0 && i % 5===0){ 
      console.log(i+' fizzBuzz'); 
     } else if(i % 3 ===0){ 
      console.log(i+' fizz'); 
     } else if(i % 5 ===0){ 
      console.log(i+' buzz'); 
     } else { 
      console.log(i); 
     } 
    } 
}fizzBuzz(); 
1

這是我寫的!

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

稍有不同的實現。

你可以把你自己的論據到函數。可以是非連續的數字,如[0,3,10,1,4]。默認設置僅爲1-15。

function fizzbuzz (set) { 
 
    
 
    var set = set ? set : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 
 
    var isValidSet = set.map((element) => {if (typeof element !== 'number') {return false} else return true}).indexOf(false) === -1 ? true : false 
 
    var gotFizz = (n) => {if (n % 3 === 0) {return true} else return false} 
 
    var gotBuzz = (n) => {if (n % 5 === 0) {return true} else return false} 
 
    
 
    if (!Array.isArray(set)) return new Error('First argument must an array with "Number" elements') 
 
    if (!isValidSet) return new Error('The elements of the first argument must all be "Numbers"') 
 

 
    set.forEach((n) => { 
 

 
    if (gotFizz(n) && gotBuzz(n)) return console.log('fizzbuzz') 
 
    if (gotFizz(n)) return console.log('fizz') 
 
    if (gotBuzz(n)) return console.log('buzz') 
 
    else return console.log(n) 
 
    }) 
 
}

0

var num = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; 
 

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

0

想和大家分享我的方式來解決這個

for (i = 1; i <= 100; 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

var limit = prompt("Enter the number limit"); 
 
var n = parseInt(limit); 
 
var series = 0; 
 
for(i=1;i<n;i++){  
 
    series = series+" " +check(); 
 
} 
 

 
function check() { 
 
    var result; 
 
    if (i%3==0 && i%5==0) { // check whether the number is divisible by both 3 and 5 
 
    result = "fizzbuzz "; // if so, return fizzbuzz 
 
    return result; 
 
    } 
 
    else if (i%3==0) { // check whether the number is divisible by 3 
 
    result = "fizz "; // if so, return fizz 
 
    return result; 
 
    } 
 
    else if (i%5==0) { // check whether the number is divisible by 5 
 
    result = "buzz "; // if so, return buzz 
 
    return result; 
 
    } 
 
    else return i; // if all the above conditions fail, then return the number as it is 
 
} 
 

 
alert(series);

0
for (var i = 1; i <= 100; 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);  
} 

一到FizzBu​​zz最簡單的方法。 多的3和5,在同一時間,指的多個15.

第二個版本:

for (var i = 1; i <= 100; i++) { 
    if (i % 15 === 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

如果有人正在尋找其他解決方案:這一個是遞歸,和可重複使用的功能任選定製參數值:

const fizzBuzz = (from = 1, till = 100, ruleMap = { 
 
    3: "Fizz", 
 
    5: "Buzz", 
 
}) => from > till || console.log(
 
    Object.keys(ruleMap) 
 
    .filter(number => from % number === 0) 
 
    .map(number => ruleMap[number]).join("") || from 
 
) || fizzBuzz(from + 1, till, ruleMap); 
 

 
// Usage: 
 
fizzBuzz(/*Default values*/);

  • from > till是打破遞歸的錨。由於它返回直到fromtill較高,它轉到下一條語句(console.log):
  • Object.keys返回對象屬性的給定ruleMap在默認情況下我們的情況是35的數組。
    • 然後,它遍歷數字並只返回可被from(0作爲休息)整除的數字。
    • 然後,它遍歷過濾後的數字並根據規則輸出該說法。
    • 然而,如果該filter方法返回一個空數組([],沒有找到結果),則因爲在端部的join方法最終返回只是一個空串(""),其是falsy value輸出只是當前from值。
  • 由於console.log總是返回undefined,它進入下一條語句,並調用自身再次1遞增from值。
相關問題