3

明らかな解決策は次のようなものです。

if (x % 15 == 0) println("fizzbuzz");
else if (x % 3 == 0) println ("fizz");
else if (x % 5 == 0) println ("buzz");

次に、コツはフィズとバズを連結することだと言えます。

if (x % 3 == 0) print("fizz");
if (x % 5 == 0) print("buzz");
if (x % 15 == 0) println();

また

print("%s%s%s", x % 3 == 0 ? "fizz" : "", x % 5 == 0 ? "buzz" : "", x % 15 == 0 ? "\r\n" : "");

問題は改行であり、上記のすべてのケースで 3 つのチェックを実行しています。

「fizz」または「buzz」のいずれかの後に改行が必要であると仮定すると、2 つのチェックのみを使用してどのように行うことができますか?

4

5 に答える 5

23

ノーチェックはどうですか?

string[] output = { "fizzbuzz", "", "", "fizz", "", "buzz", "fizz", "", "", "fizz", "buzz", "", "fizz", "", "" };
print("%s", output[x % 15]);

もちろん、これはこのコードifからステートメントを削除するだけであることに注意してください。基になるコードには、1 つまたは 2 つのジャンプ命令が含まれている可能性があります。

何が起こっているのかをもう少し明確にしたい場合は、2 つの配列を作成できます。

string[] fizz = { "fizz", "", "" };
string[] buzz = { "buzz", "", "", "", "" };
print("%s%s", fizz[x % 3], buzz[x % 5]);

これらの実装はどちらも負の数を処理しないことに注意してください。これを行うバージョンは次のとおりです。

string[] fizz = { "fizz", "", "" };
string[] buzz = { "buzz", "", "", "", "" };
print("%s%s", fizz[((x % 3) + 3) % 3], buzz[((x % 5) + 5) % 5]);

コードに追加した改行をきれいにスキップしたことに注意してください。それが必要な場合は、上記のコードを同じ方法で変更して追加する方法を理解できると確信しています:)

さらに重要なこと:これは実際には「公式の」フィズバズテストに合格しないことに注意してください。質問に答えるだけです。

fizzbuzz テストは次のとおりです。

  • 1 から 100 までのすべての数字を書き出します。ただし、3 の倍数の数字は数字の代わりに「fizz」と書き、5 の倍数の数字は数字の代わりに「buzz」と書きます。数字が 3 と 5 の両方の倍数である場合は、数字の代わりに「fizzbuzz」と書きます。

あなたの質問は「数字の代わりに」の部分をまったく処理しなかったので、私の答えも処理しませんでした。

では、ループには通常「チェック」が伴うという事実をスキップすると、if ステートメントなしで fizzbuzz テスト全体を記述できるでしょうか?

ちょっとした魔法で、はい、できます。これが C# コードのループです。LINQPadまたはIdeoneを使用してこれを確認できます。

void Main()
{
    string[] fizzbuzz = new[]
    {
        "fizzbuzz", "{0}", "{0}", "fizz", "{0}", "buzz", "fizz",
        "{0}", "{0}", "fizz", "buzz", "{0}", "fizz", "{0}", "{0}"
    };
    for (int index = 1; index <= 100; index++)
    {
        Debug.WriteLine(string.Format(fizzbuzz[index % 15], index));
    }
}

string.Formatここでは、実際には、に送信される書式文字列に引数への参照が含まれている必要がないという事実に依存しています。

編集: コメントに記載されているように、パラメーターで??を取得し、配列のエントリを に残していましたが、実際には変装した if ステートメントであるため、編集して削除しました。"{0}"string.Formatnull??

于 2013-07-06T12:36:25.987 に答える
1

「チェックは 2 つだけ」は、数値が 3 と 5 で割り切れる場合、その数値が 15 で割り切れることを意味するという事実をおそらく狙っています。

それを利用したサンプルコード (チェックは 1 つだけ):

var words = ["fizzbuzz", "buzz", "fizz"];
var index = Math.min(x % 3, 1) + Math.min(x % 5, 1) * 2;
if (index < words.length) println(words[index]);

ラッセの「チェックなしについて」の回答でも、空の文字列が出力されることに注意してください。これは、元のコードとは異なり、質問に記載されている主な問題の1つとは異なるようです。

println() を使用する代わりにテキストに改行を含めても問題ない場合、これはチェックなしで作業を行います:

print(["fizzbuzz\n", "buzz\n", "fizz\n", ""]
         [Math.min(x % 3, 1) + Math.min(x % 5, 1) * 2]);

PS

正確に2つのチェックを要求したため:

print(["fizzbuzz\n", "buzz\n", "fizz\n", ""]
         [(x % 3 == 0 ? 0 : 1) + (x % 5 == 0 ? 0 : 2)]);

PPS:

完全な FizzBu​​zz の jsfiddle (印刷番号を含む): http://jsfiddle.net/QxDfh/

于 2013-07-06T19:17:47.247 に答える
1

これは、c で書かれた条件式のない 1 つのソリューションです。(短絡評価を除く)

#include <stdio.h>
int fizzbuzz(int i)
{
    const char* f[]={"%i\n","fizz\n","buzz\n","fizbuzz\n"};
    return i&&fizzbuzz(i-1)&&printf(f[!(i%3)|!(i%5)*2],i)||1;
}
int main()
{
    return fizzbuzz(100); 
}
于 2013-07-07T11:03:26.173 に答える
1

ちょっとしたコードゴルフですが、うまくいきます

for x in range(1,101):print"Fizz"[x%3*4:]+"Buzz"[x%5*4:]or x

ソース: http://maxburstein.com/blog/python-shortcuts-for-the-python-beginner/

于 2013-07-06T20:30:07.693 に答える