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

发布于 2024-07-08 09:45:32 字数 277 浏览 12 评论 0原文

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

I've been reading up on conditional-style expressions in ruby. However I came across one I couldn't quite understand to define the classic FizzBuzz problem. I understand the FizzBuzz problem and even wrote my own before finding the following quick solution utilising the ternary operator. If someone can explain to me how this chain works to satisfy the FizzBuzz problem it would be very much appreciated :)

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

不…忘初心 2024-07-15 09:45:32

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

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。

Some parentheses might help:

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

So, if i is divisible by 3, then it checks whether i is also divisible by 5. If so, it prints "FizzBuzz" otherwise just "Buzz". If i is not divisible by three, then it checks divisibility by 5 again and prints "Fizz" if so, otherwise just i.

墨离汐 2024-07-15 09:45:32

以下是 Jeff Atwood 文章 中所述的 FizzBu​​zz 问题的描述。

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

三元运算符是 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
    }
}

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

Here is a description of the FizzBuzz problem as stated in this Jeff Atwood article.

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".

A ternary operator is shorthand writing for an if-else statement. The general format is:

cond ? evaluate_if_cond_is_true : evaluate_if_cond_is_false

So if I write:

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

Is equivalent to the following code:

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

Where cond is i % 2 == 0, evaluate_if_cond_is_true is 1 and evaluate_if_cond_is_false is 0.

The nice thing about ternary operators is that they can be combined. This means that the statement to execute when either condition evaluates to true or false can be another ternary operator.

Let put the entire condition in a more readable fashion:

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

And mapping this to if-else statements is easy with the rules explained above:

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

This is not valid code but because the result of the ternary operator is inlined in the result expression it is used as input for the puts command.

橘寄 2024-07-15 09:45:32

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

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}

For fun, here's another way:

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

And another:

(1..100).zip([nil,nil,"Fizz"]*34,[nil,nil,nil,nil,"Buzz"]*20).map {|a,b,c| b || c ? [b,c].join : a}
贪了杯 2024-07-15 09:45:32

三元是一个基本的 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 )

The ternary is a basic if-then structure.

The above is equivalent to...

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

Or, using some parens...

puts i%3==0 ? ( i%5==0 ? "FizzBuzz" : "Buzz" ) : ( i%5==0 ? "Fizz" : i )
水溶 2024-07-15 09:45:32

流程是:

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

the flow is:

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
    }
}
_畞蕅 2024-07-15 09:45:32

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

Just for fun. If you wanted to do it in C#. Here's a simple way. It basically starts with your for loop that will print numbers from 1 to 100. It then asks if your index "i" is divisible by 3 and 5 if true then print to the console "FizzBuzz". Else if your index "i" is divisible by 3 if true then print to the console "Fizz". Else if your index "i" is divisible by 5 if true then print to the console "Buzz". Else just print out "i" which is your integer. I added tabbing for better readability.

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);
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文