8

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
4

6 に答える 6

16

いくつかの括弧が役立つ場合があります:

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 だけを表示します。

于 2008-10-22T09:47:36.873 に答える
11

これは、このJeffAtwoodの記事で述べられているFizzBu​​zzの問題の説明です。

1から100までの数字を印刷するプログラムを作成します。ただし、3の倍数の場合は数字の代わりに「Fizz」を印刷し、5の倍数の場合は「Buzz」を印刷します。3と5の両方の倍数である数の場合は、「FizzBu​​zz」を印刷します。

三項演算子は、if-elseステートメントの省略形です。一般的な形式は次のとおりです。

cond?Evaluation_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と評価されたときに実行するステートメントが、別の3項演算子になる可能性があることを意味します。

条件全体をより読みやすい方法で配置しましょう。

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コマンドの入力として使用されます。

于 2008-10-22T09:58:42.637 に答える
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}
于 2008-10-22T19:57:29.730 に答える
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 )
于 2008-10-22T09:49:01.707 に答える
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
    }
}
于 2008-10-22T09:47:45.403 に答える