Nodejs CoffeeScript版FizzBuzzWhizz

Nodejs CoffeeScript版FizzBuzzWhizz

[fizz, buzz, whizz] = [3, 5, 7]
wordOf = (num) ->
if ~"#{num}".indexOf fizz
‘Fizz’
else
[‘Fizz’ unless num % fizz] + [‘Buzz’ unless num % buzz] + [‘Whizz’ unless num % whizz]
console.log (wordOf num) or num for num in [1…100]


4 回复

Nodejs CoffeeScript版FizzBuzzWhizz

问题背景

FizzBuzzWhizz 是一个经典的编程问题的变种。原始的 FizzBuzz 游戏要求你从 1 数到 N,对于能被 3 整除的数字输出 “Fizz”,能被 5 整除的数字输出 “Buzz”,能同时被 3 和 5 整除的数字则输出 “FizzBuzz”。而 FizzBuzzWhizz 在此基础上增加了一个新的规则,即对于能被 7 整除的数字输出 “Whizz”。

示例代码

# 定义三个因子
[fizz, buzz, whizz] = [3, 5, 7]

# 定义一个函数 wordOf,根据输入的数字返回对应的字符串
wordOf = (num) ->
  # 检查数字是否包含特定的字符
  if "#{num}".indexOf(fizz.toString()) >= 0
    return 'Fizz'
  else
    # 使用列表推导式来生成结果列表
    result = [
      'Fizz' unless num % fizz is 0
      'Buzz' unless num % buzz is 0
      'Whizz' unless num % whizz is 0
    ]
    # 过滤掉空字符串,并将结果列表合并为一个字符串
    result = (str for str in result when str?).join('')
    return result or num

# 输出从 1 到 100 的结果
console.log (wordOf num) or num for num in [1..100]

解释

  1. 定义因子

    [fizz, buzz, whizz] = [3, 5, 7]
    

    这里定义了三个因子 fizzbuzzwhizz,分别代表 3、5 和 7。

  2. 定义 wordOf 函数

    wordOf = (num) ->
      if "#{num}".indexOf(fizz.toString()) >= 0
        return 'Fizz'
      else
        result = [
          'Fizz' unless num % fizz is 0
          'Buzz' unless num % buzz is 0
          'Whizz' unless num % whizz is 0
        ]
        result = (str for str in result when str?).join('')
        return result or num
    
    • 首先检查数字 num 是否包含因子 fizz(例如,数字中是否包含字符 ‘3’)。
    • 如果包含,则直接返回 “Fizz”。
    • 否则,使用列表推导式生成一个包含可能的结果的列表(如 “Fizz”, “Buzz”, “Whizz”),并过滤掉空字符串。
    • 将过滤后的结果列表合并成一个字符串,并返回该字符串或原数字 num
  3. 循环输出结果

    console.log (wordOf num) or num for num in [1..100]
    

    这行代码遍历从 1 到 100 的所有数字,并调用 wordOf 函数来获取每个数字的输出结果,然后打印出来。

通过上述代码,你可以看到如何使用 CoffeeScript 来实现一个扩展的 FizzBuzzWhizz 游戏。


我讨厌这种强制缩进的语法…

有可能最后生成的js不是你想要的,也有可能使用姿势不对 哈哈

这个CoffeeScript代码实现了一个扩展版本的FizzBuzz问题,称为FizzBuzzWhizz。在这个问题中,除了通常的Fizz(3的倍数)和Buzz(5的倍数)之外,还增加了一个新的条件Whizz(7的倍数)。如果一个数字同时满足多个条件,则结果为这些词的组合。

下面是代码的详细解释:

# 定义规则因子
[fizz, buzz, whizz] = [3, 5, 7]

# 定义函数 wordOf,输入一个数字 num,返回对应的字符串或数字
wordOf = (num) ->
  # 如果 num 的字符串表示包含 '3',则返回 'Fizz'
  if "#{num}".includes(fizz.toString())
    'Fizz'
  else
    result = []
    # 如果 num 是 fizz 的倍数,则添加 'Fizz'
    result.push('Fizz') unless num % fizz
    # 如果 num 是 buzz 的倍数,则添加 'Buzz'
    result.push('Buzz') unless num % buzz
    # 如果 num 是 whizz 的倍数,则添加 'Whizz'
    result.push('Whizz') unless num % whizz
    # 如果结果为空,则返回 num;否则返回结果数组中的所有元素拼接后的字符串
    result.join('') or num

# 对于从 1 到 100 的每个数字,调用 wordOf 函数并打印结果
console.log (wordOf num) for num in [1..100]

这段代码使用了 CoffeeScript 语法,定义了一个名为 wordOf 的函数,该函数根据输入数字的不同条件返回不同的字符串。对于从 1 到 100 的每个数字,调用 wordOf 函数并将其结果打印到控制台。

回到顶部