FizzBu​​zz使用三元条件运算符

时间:2008-10-22 09:42:07

标签: ruby operators conditional-operator fizzbuzz

我一直在阅读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

6 个答案:

答案 0 :(得分:16)

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

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

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

答案 1 :(得分:11)

以下是此Jeff Atwood article中所述的FizzBu​​zz问题的说明。

  

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

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

cond ? 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

三元运算符的好处在于它们可以组合在一起。这意味着当条件计算为true或false时要执行的语句可以是另一个三元运算符。

让整个条件更具可读性:

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命令的输入。

答案 2 :(得分:7)

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

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}

答案 3 :(得分:3)

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

以上相当于......

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

或者,使用一些parens ......

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

答案 4 :(得分:1)

流程是:

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
    }
}

答案 5 :(得分:0)

只是为了好玩。如果您想用C#来做。这是一个简单的方法。它基本上从for循环开始,它将打印从1到100的数字。然后询问您的索引“ i”是否可以被3和5整除(如果为true),然后打印到控制台“ FizzBu​​zz”。否则,如果索引“ i”可被3整除(如果为true),则打印到控制台“ Fizz”。否则,如果索引“ i”可被5整除(如果为true),则打印到控制台“ 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);
    }