Algorithm 是否可以只使用两次检查就写出fizzbuzz?

Algorithm 是否可以只使用两次检查就写出fizzbuzz?,algorithm,Algorithm,显而易见的解决方案是: 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(); 或 因此,问

显而易见的解决方案是:

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();

因此,问题在于换行,在上述所有情况下,我们执行3项检查

假设在“嘶嘶”或“嗡嗡”之后需要换行,那么如何只使用两次检查就可以完成呢?

不检查如何

string[] output = { "fizzbuzz", "", "", "fizz", "", "buzz", "fizz", "", "", "fizz", "buzz", "", "fizz", "", "" };
print("%s", output[x % 15]);
请注意,这当然只会从此代码中删除
if
语句。底层代码很可能包含一两条跳转指令

如果要更清楚地了解发生了什么,可以创建两个阵列:

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的倍数的数字应该写“嘶嘶”而不是数字,对于5的倍数的数字应该写“嘶嘶”而不是数字。如果一个数字同时是3和5的倍数,请写出“fizzbuzz”而不是数字
由于你的问题根本没有涉及“而不是数字”部分,我的回答也没有

因此,如果我们忽略了循环通常包含一个“检查”的事实,那么我们可以在没有if语句的情况下编写整个fizzbuzz测试吗

通过一点魔法,是的,我们可以,这是C代码中的循环,您可以使用或验证这一点:

void Main()
{
字符串[]fizzbuzz=new[]
{
“fizzbuzz”、“{0}”、“fizz”、“{0}”、“buzz”、“fizz”,
“{0}”、“嘶嘶声”、“嗡嗡声”、“嘶嘶声”、“嘶嘶声”、“嘶嘶声”、“嘶嘶声”、“0}”、“0}”
};
对于(int index=1;index“仅两次检查”可能是针对这样一个事实,即如果一个数字可以被3和5除,这意味着该数字可以被15除

示例代码(仅进行一次检查):

附言

因为你要的是两张支票:

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


jsfizzbuzz(包括打印数字)的完整提示:

有点代码高尔夫,但它可以工作

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

来源:

这里有一个解决方案,没有任何用c编写的条件表达式(短路计算除外)

#包括
国际汽笛(国际一级)
{
const char*f[]={“%i\n”、“fizz\n”、“buzz\n”、“fizbuzz\n”};
返回i&&fizzbuzz(i-1)和&printf(f[!(i%3)|!(i%5)*2],i)| 1;
}
int main()
{
返回嘶嘶声(100);
}

当我做FizzBuzz时,这就是我想做的,这就是我想到的:

        string[] p = { "", "Fizz", "Buzz", "FizzBuzz" };
        int n = 0;
        for (int i = 1; i <= 100; i++)
        {
            p[0] = i.ToString();
            if (i % 3 == 0)
                n += 1;
            if (i % 5 == 0)
                n += 2;
            Console.WriteLine(p[n]);
            n = 0;
        }
string[]p={”、“嘶嘶声”、“嗡嗡声”、“嘶嘶声”};
int n=0;

对于(int i=1;i什么是“检查”?一个人必须付出惊人的努力来保持所需的最小数量不为零。“fizzbuzz”是一个流行的面试问题,网上有大量关于它的信息。它通常测试申请人是否能够阅读规范、验证规范(它的措辞通常有点模棱两可,即你是否需要同时输出嘶嘶声和嗡嗡声,以确保应聘者知道需要澄清),以及应聘者能够编写工作代码。你会惊讶地发现,有多少求职者的简历中没有发出嘶嘶声(或类似的声音)tests.checks不仅仅是3个,实际上是300个(考虑到没有编译器优化)
??
不是“如果”对我来说不能通过嗅觉测试。如果只在索引中打开逻辑运算结果(或者只使用C或C++),可以做得更简单。这样你需要3个len 2数组。@LukaRahne请发布这样一个解决方案,我不确定你在这里的意思。你也可以通过使用switch/case来避免数组中的冗余。或者直接向上投票我的答案,它只是一个一行,并且可以更好地扩展到更大的数字…:)不确定你所说的“switch/case”是什么意思,但是一个普通的C#switch{}block当然充满了“检查”。我冒昧地充实了你的代码,包括完整的FizzBuzz测试(也就是数字),这里:谢谢。我也为此添加了一个JSFIDLE。基于你链接的域/URL与您的用户名相同或包含您的用户名,您似乎已链接到您自己的网站。如果您这样做,您必须披露这是您的网站。如果您不披露这是您自己的网站,它通常被视为垃圾邮件。请参阅:和。鉴于您确实声明了“我的思考过程…”,这真的很接近于披露,但最好是像“我的思想过程可以在我的网站上找到:”。考虑到这是一种结构化的方式,感觉有点像你打算作为一个领导者吸引人们进入你的网站(即垃圾邮件),而不是真正尝试回答这里的问题。当然,如果有一些东西在这里的可用格式和空间有限的情况下很难解释,那么可以链接到一个外部网站,并提供更完整的解释,但基本知识应该在这里。现在,这就像是一个让人们点击to你的网站。感谢你们两位。我感谢你们的理解,我还不完全熟悉如何以最好的方式回答问题的所有细微差别。我编辑了答案,希望我已经纠正了你提出的所有问题。我的意图根本不是推广我的博客,我根本没有从中获得任何收入,而且它是免费的这只是我收集想法的一种方式。在完成FizzBuzz挑战后,我只是想看看其他人是否以类似的方式解决了这个问题,在这个过程中我发现了这个问题。我只是愚蠢地认为代码是不言自明的。干杯=)
print(["fizzbuzz\n", "buzz\n", "fizz\n", ""]
         [Math.min(x % 3, 1) + Math.min(x % 5, 1) * 2]);
print(["fizzbuzz\n", "buzz\n", "fizz\n", ""]
         [(x % 3 == 0 ? 0 : 1) + (x % 5 == 0 ? 0 : 2)]);
for x in range(1,101):print"Fizz"[x%3*4:]+"Buzz"[x%5*4:]or x
#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); 
}
        string[] p = { "", "Fizz", "Buzz", "FizzBuzz" };
        int n = 0;
        for (int i = 1; i <= 100; i++)
        {
            p[0] = i.ToString();
            if (i % 3 == 0)
                n += 1;
            if (i % 5 == 0)
                n += 2;
            Console.WriteLine(p[n]);
            n = 0;
        }