Nodejs 一句代码的FizzBuzzWhizz ,求分解。

Nodejs 一句代码的FizzBuzzWhizz ,求分解。

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

4 回复

当然可以。让我们来详细分析一下这段代码,并将其逐步分解。

原始代码

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

分解步骤

1. 初始化变量

首先,我们需要将 i 的初始化从循环条件中分离出来:

let i = 0;

2. 循环条件

接下来,我们处理循环条件部分:

while (i < 100) {

3. 增量操作

在原始代码中,i 在每次循环时递增。我们需要将这个操作放在循环体内部:

    console.log(
        (++i % 3 ? '' : 'Fizz') +
        (i % 5 ? '' : 'Buzz') ||
        i
    );
}

4. FizzBuzz逻辑

现在我们来看一下核心的 FizzBuzz 逻辑部分:

(++i % 3 ? '' : 'Fizz') + (i % 5 ? '' : 'Buzz') || i
4.1 检查是否为3的倍数
++i % 3 ? '' : 'Fizz'

这里使用了三元运算符(? :)。如果 ++i 是3的倍数,返回空字符串 '',否则返回 'Fizz'

4.2 检查是否为5的倍数
(i % 5 ? '' : 'Buzz')

类似地,如果 i 是5的倍数,返回空字符串 '',否则返回 'Buzz'

4.3 合并结果
('Fizz' 或 'Buzz' 或 i)

最后,我们用 + 运算符将两个字符串连接起来。如果结果是一个空字符串,那么整个表达式的结果将是 i

完整的分解代码

let i = 0;

while (i < 100) {
    let result = '';
    
    if (i % 3 === 0) {
        result += 'Fizz';
    }
    
    if (i % 5 === 0) {
        result += 'Buzz';
    }
    
    console.log(result || i);
    
    i++;
}

总结

通过上述分解,我们可以看到原始代码虽然简洁,但不容易理解。分解后的代码更易读,也更容易维护。希望这些解释对你有所帮助!


这个代码输出的结果本身就不正确的,没必要分解了。

我也来玩玩~

!function (p, m, i, c, l) {
  while (i++ < c) {
    l(((i + '').indexOf(p[0]) + 1) ? m[0] : (p.map(function (n, j) {
      return i % n ? '' : m[j]
    }).join('') || i))
  }
}([ 3, 5, 7 ], [ 'Fizz', 'Buzz', 'Whizz' ], 0, 100, console.log)

好的,我将为你解析这段代码并提供一个更清晰的版本。

原始代码

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

分解步骤

  1. 循环结构

    for (i = 0; i < 100; ) {
      // 主逻辑
    }
    

    这段代码使用了一个for循环,从0开始到99结束。每次循环会自增i的值,并且没有显式的自增语句在循环体中。

  2. 主逻辑

    console.log((++i % 3 ? '' : 'Fizz') + (i % 5 ? '' : 'Buzz') || i);
    

    这一行是整个逻辑的核心。我们将其拆分成多个部分来理解:

    • ++i:每次循环开始时,先自增i
    • i % 3 ? '' : 'Fizz':如果i能被3整除,则返回'Fizz',否则返回空字符串。
    • i % 5 ? '' : 'Buzz':如果i能被5整除,则返回'Buzz',否则返回空字符串。
    • (++i % 3 ? '' : 'Fizz') + (i % 5 ? '' : 'Buzz'):将上述两个条件的结果拼接起来。
    • || i:如果上述结果为空(即既不是Fizz也不是Buzz),则输出当前的i

解释

这段代码实现了FizzBuzz的基本逻辑,但只处理了35的情况。为了扩展到7Whizz),我们可以稍微修改一下代码。

更完整的实现

如果你希望扩展到7(即Whizz),可以参考以下代码:

for (i = 1; i <= 100; i++) {
  let result = '';
  if (i % 3 === 0) result += 'Fizz';
  if (i % 5 === 0) result += 'Buzz';
  if (i % 7 === 0) result += 'Whizz';
  console.log(result || i);
}

总结

原始代码是用一行代码实现的FizzBuzz逻辑,但它有些复杂且难以维护。上面的分解和完整实现提供了更清晰的理解和更好的可读性。

回到顶部