【问题标题】:FizzBuzz using ternary conditional operatorFizzBu​​zz 使用三元条件运算符
【发布时间】:2010-09-18 12:15:37
【问题描述】:

我一直在阅读 ruby​​ 中的条件式表达式。然而,我遇到了一个我不太明白定义经典 FizzBu​​zz 问题的问题。我了解 FizzBu​​zz 问题,甚至在使用三元运算符找到以下快速解决方案之前编写了自己的问题。如果有人可以向我解释这个链是如何解决 FizzBu​​zz 问题的,那将不胜感激:)

for i in 0...100
  puts i%3==0 ? i%5==0 ? "FizzBuzz" : "Buzz" : i%5==0 ? "Fizz" : i
end

【问题讨论】:

    标签: ruby operators conditional-operator fizzbuzz


    【解决方案1】:

    一些括号可能会有所帮助:

    puts (i%3 == 0) ? ((i%5 == 0) ? "FizzBuzz" : "Buzz") : ((i%5 == 0) ? "Fizz" : i)
    

    所以,如果 i 可以被 3 整除,那么它会检查 i 是否也可以被 5 整除。如果是,则打印“FizzBu​​zz”,否则只打印“Buzz”。如果 i 不能被 3 整除,则再次检查是否能被 5 整除,如果是则打印“Fizz”,否则只打印 i。

    【讨论】:

    • 非常感谢 - 括号和您的解释已经解决了这个问题
    【解决方案2】:

    流程是:

    if (i%3 == 0) {              // multiple of 3
        if (i%5 == 0) {          // multiple of 3 and 5
            puts "FizzBuzz"
        } else {                 // not multiple of 5, only of 3
            puts "Buzz"
        }
    } else (                     // not multiple of 3
        if (i%5 == 0) {          // multiple of 5, not of 3
            puts "Fizz"
        } else {                 // multiple of neither 5 nor 3
            puts i
        }
    }
    

    【讨论】:

      【解决方案3】:

      三元是一个基本的 if-then 结构。

      以上等价于...

      if i%3 ==0
          if i%5 == 0
              "FizzBuzz"
          else
              "Buzz"
      else
          if i%5 == 0
              "Fizz"
          else
              i
      

      或者,使用一些括号...

      puts i%3==0 ? ( i%5==0 ? "FizzBuzz" : "Buzz" ) : ( i%5==0 ? "Fizz" : i )
      

      【讨论】:

      • 对不起。我只是懒惰。
      【解决方案4】:

      这里是对 Jeff Atwood article 中所述的 FizzBu​​zz 问题的描述。

      编写一个程序来打印 从 1 到 100 的数字。但是对于 三的倍数打印“Fizz” 而不是数字和 五的倍数打印“嗡嗡声”。为了 两者的倍数 三个和五个打印“FizzBu​​zz”。

      ternary operator 是 if-else 语句的简写。一般格式为:

      条件 ? evaluate_if_cond_is_true : evaluate_if_cond_is_false

      所以如果我写:

      int isEven = (i % 2 == 0) ? 1 : 0;
      

      相当于下面的代码:

      if (i % 2 == 0) {
          isEven = 1;
      } else {
          isEven = 0;
      }
      

      cond 是i % 2 == 0,evaluate_if_cond_is_true 是1,evaluate_if_cond_is_false 是0

      三元运算符的好处是它们可以组合。这意味着当任一条件评估为真或假时要执行的语句可以是另一个三元运算符。

      让整个条件更易读:

      i%3==0 ?
          i%5==0 ?
              "FizzBuzz"
              : "Buzz"
          : i%5==0 ?
              "Fizz"
              : i
      

      使用上面解释的规则很容易将其映射到 if-else 语句:

      if (i%3==0) {
          if (i%5==0) {
              "FizzBuzz"
          } else {
              "Buzz"
          }
      } else {
          if (i%5==0) {
              "Fizz"
          } else {
              i
          }
      }
      

      这不是有效的代码,但是因为三元运算符的结果被内联在结果表达式中,它被用作 puts 命令的输入。

      【讨论】:

        【解决方案5】:

        为了好玩,这里有另一种方式:

        puts (1..100).map {|i| (fb = [["Fizz"][i%3],["Buzz"][i%5]].compact.join).empty? ? i : fb}
        

        还有一个:

        (1..100).zip([nil,nil,"Fizz"]*34,[nil,nil,nil,nil,"Buzz"]*20).map {|a,b,c| b || c ? [b,c].join : a}
        

        【讨论】:

        • 这是错误的。规范规定只有在不打印嘶嘶声或嗡嗡声时才应打印数字。
        【解决方案6】:

        只是为了好玩。如果您想在 C# 中执行此操作。这是一个简单的方法。它基本上从您的 for 循环开始,它将打印从 1 到 100 的数字。然后询问您的索引“i”是否可被 3 和 5 整除,如果为真,则打印到控制台“FizzBu​​zz”。否则,如果您的索引“i”可以被 3 整除,则打印到控制台“Fizz”。否则,如果您的索引“i”可以被 5 整除,则打印到控制台“Buzz”。否则只需打印出“i”,这是您的整数。我添加了标签以提高可读性。

        for(int i = 1; i <= 100; i++) {
                string result = (i % 3 == 0 && i % 5 == 0) ? 
                "FizzBuzz" :  
                    (i % 3 == 0) ? 
                        "Fizz" : 
                            (i % 5 == 0) ? 
                                "Buzz" : 
                                    i.ToString();
            Console.WriteLine(result);
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-15
          • 1970-01-01
          • 1970-01-01
          • 2010-09-28
          相关资源
          最近更新 更多