25

阅读编码恐怖,我又一次遇到了 FizzBu​​zz。

原帖在这里:编码恐怖:为什么程序员不能……编程?

对于那些不知道的人: FizzBu​​zz 是一款非常受欢迎的儿童游戏。从 1 数到 100,每当一个数字能被 3 整除时,就调用字符串“Fizz”,每当一个数字能被 5 整除时,就调用字符串“Buzz”,每次一个数字都能被 3 和 5 整除时串在一起的“FizzBu​​zz”被调用而不是数字。

这一次,我写了代码,花了我一分钟,但有几件事我不喜欢。

这是我的代码:

public void DoFizzBuzz()
{
    var combinations = new Tuple<int, string>[] 
    { 
        new Tuple<int, string> (3, "Fizz"), 
        new Tuple<int, string> (5, "Buzz"), 
    };

    for (int i = 1; i <= 100; ++i)
    {
        bool found = false;

        foreach (var comb in combinations)
        {
            if (i % comb.Item1 == 0)
            {
                found = true;
                Console.Write(comb.Item2);
            }
        }

        if (!found)
        {
            Console.Write(i);
        }

        Console.Write(Environment.NewLine);
    }
}

所以我的问题是:

  1. 如何摆脱找到的布尔值?
  2. 有没有比 foreach 更好的测试方法?
4

43 回答 43

195

我认为你的实现是不必要的复杂。这个可以完成工作并且更容易理解:

public void DoFizzBuzz()
{
    for (int i = 1; i <= 100; i++)
    {
        bool fizz = i % 3 == 0;
        bool buzz = i % 5 == 0;
        if (fizz && buzz)
            Console.WriteLine ("FizzBuzz");
        else if (fizz)
            Console.WriteLine ("Fizz");
        else if (buzz)
            Console.WriteLine ("Buzz");
        else
            Console.WriteLine (i);
    }
}
于 2012-08-01T17:39:21.567 回答
27

利用条件格式说明符获得一个很好的高尔夫版本:

public void DoFizzBuzz()
{
    for(int i=1;i<101;i++)Console.WriteLine("{0:#;}{1:;;Fizz}{2:;;Buzz}",i%3*i%5==0?0:i,i%3,i%5);
}
于 2012-08-01T17:57:20.010 回答
26

展开以获得最大效率。这个程序可以胜过所有其他程序。

public void FizzBuzz()
{
    const string FIZZ = "Fizz";
    const string BUZZ = "Buzz";
    const string FIZZBUZZ = "FizzBuzz";

    int i = 0;
    while (i < 150)
    {
        Console.WriteLine(++i);
        Console.WriteLine(++i);
        Console.WriteLine(FIZZ); ++i;
        Console.WriteLine(++i);
        Console.WriteLine(BUZZ); ++i;
        Console.WriteLine(FIZZ); ++i;
        Console.WriteLine(++i);
        Console.WriteLine(++i);
        Console.WriteLine(FIZZ); ++i;
        Console.WriteLine(BUZZ); ++i;
        Console.WriteLine(++i);
        Console.WriteLine(FIZZ); ++i;
        Console.WriteLine(++i);
        Console.WriteLine(++i);
        Console.WriteLine(FIZZBUZZ); ++i;
    }
}
于 2012-08-01T18:12:53.277 回答
22

我认为您要完成的是 FizzBu​​zz 的通用解决方案,它适用于任意数量的数字单词组合。

你有一个好的开始——我想我可以用这个例子回答你的问题:

public void DoFizzBuzz()
{
    var combinations = new List<Tuple<int, string>>
    { 
        new Tuple<int, string> (3, "Fizz"), 
        new Tuple<int, string> (5, "Buzz"), 
    };

    Func<int, int, bool> isMatch = (i, comb) => i % comb == 0;
    for (int i = 1; i <= 100; i++)
    {
        Console.Write(i);

        var matchingCombs = combinations.Where(c => isMatch(i, c.Item1)).ToList();
        if (matchingCombs.Any())
        {
            Console.Write(string.Join("", matchingCombs.Select(c => c.Item2)));
        }
        else
        {
            Console.Write(i);
        }
        Console.Write(Environment.NewLine);
    }
}

在实践中,您会传入combinations该方法,但为了简洁起见,我将其包含在其中。

于 2012-08-01T18:08:51.140 回答
20

第三次编辑:

这是从您的版本中“摆脱布尔”的一种方法(即用此替换原始问题中的 for 循环):

for (int i = 1; i <= 100; i++)
{
  var x = combinations.Where(n => i % n.Item1 == 0);

  if (x.Count() == 0)
    Console.Write(i);
  else
    Console.Write(string.Join("",x.Select(e => e.Item2)));

  Console.Write(Environment.NewLine);
}

之前的回答:

对于纯 C# 解决方案,请查看Keith Thompson 的解决方案。

using System;
class FizzBuzz {
    static void Main() {
        for (int n = 1; n <= 100; n ++) {
            if (n % 15 == 0) {
                Console.WriteLine("FizzBuzz");
            }
            else if (n % 3 == 0) {
                Console.WriteLine("Fizz");
            }
            else if (n % 5 == 0) {
                Console.WriteLine("Buzz");
            }
            else {
                Console.WriteLine(n);
            }
        }
    }
}

我使用 linq 在 FixBuzz 上做了一些工作。这些是我想出的解决方案——我相信它们代表了使用 Linq 来表达这个问题的解决方案的最佳方式。( GitHub )

using System;
using System.Linq;

class FizzBuzz {
  static void Main() {
    var list = Enumerable.Range(1,100)
                .Select(n => {
                      if (n % 15 == 0) {
                        return "FizzBuzz";
                      }
                      if (n % 3 == 0) {
                        return "Fizz";
                      }
                      if (n % 5 == 0) {
                        return "Buzz";
                      }
                      return n.ToString();
                    });

    foreach(string item in list)
      Console.WriteLine(item);
  }
}

和疯狂的单行版本:

using System;
using System.Linq;

class FizzBuzz {
    static void Main() {
      Console.WriteLine(
      String.Join(
        Environment.NewLine,
        Enumerable.Range(1, 100)
          .Select(n => n % 15 == 0 ? "FizzBuzz" 
                     : n % 3 == 0 ? "Fizz" 
                     : n % 5 == 0 ? "Buzz" 
                     : n.ToString())
      ));
    }
}
于 2012-08-01T17:36:42.113 回答
15
public void DoFizzBuzz()
{
    for (int i = 1; i <= 100; i++)
    {
        if (i % 3 == 0)
            Console.Write("Fizz");
        if (i % 5 == 0)
            Console.Write("Buzz");
        if (!(i % 3 == 0 || i % 5 == 0))
            Console.Write(i);

        Console.Write(Environment.NewLine);
    }
}

这摆脱了 bool found,但迫使您进行重复评估。i % 15 == 0它与用于 FizzBu​​zz 资格的其他一些答案略有不同。这是否更好还有待商榷。然而,这是一种方式。

于 2012-08-01T17:52:29.297 回答
13

有人已经做过这个了吗?

Enumerable.Range(1, 100).Select(x =>
                (x % 15 == 0) ? "FIZZBUZZ"
                : (x % 5 == 0) ? "BUZZ"
                : (x % 3 == 0) ? "FIZZ"
                : x.ToString()
                )
                .ToList()
                .ForEach(console.WriteLine);
于 2013-11-27T22:21:53.003 回答
9

我认为你从一个复杂的方式开始。改进该代码会更加复杂。您可以使用临时变量在 FizzBu​​zz 检查结束时跟踪和显示该变量。下面是代码,您还可以观看此详细信息 c# FizzBu​​zz youtube 视频 ( http://www.youtube.com/watch?v=OX5TM3q-JQg ),它解释了如何实现以下代码。

    for (int j = 1; j <= 100; j++)
    {
    string Output = "";

    if (j % 3 == 0) Output = "Fizz";// Divisible by 3 --> Fizz

    if (j % 5 == 0) Output += "Buzz"; // Divisible by 5 --> Buzz

    if (Output == "") Output = j.ToString(); // If none then --> number

    Console.WriteLine(Output); // Finally print the complete output
    }
于 2013-07-19T05:03:42.117 回答
9

将我的 5 美分添加到 Linq 的解决方案中。每个人都在使用 Select,它基本上是 Map 功能。恕我直言 foldl 功能更适合解决这个测验:

Console.WriteLine(
                Enumerable
                .Range(1, 100)
                .Aggregate(new StringBuilder(), (builder, i)
                    => i % 15 == 0 ? builder.AppendLine("FizzBuzz")
                     : i % 3 == 0 ? builder.AppendLine("Fizz")
                     : i % 5 == 0 ? builder.AppendLine("Buzz")
                     : builder.AppendLine(i.ToString()))
                .ToString());
于 2014-03-05T12:40:01.083 回答
8

林克:

Enumerable.Range(1, 100).ToList().ForEach(i => Console.WriteLine( i % 3 * i % 5 == 0 ? (i % 3 == 0 ? "Fizz" : "") + (i % 5 == 0 ? "Buzz" : "") : i.ToString()));
于 2015-04-12T04:39:24.647 回答
4

在我看来,FizzBu​​zz 问题总是对被采访者提出挑战,让 FizzBu​​zz 出现而不显式打印它。这是我在 C# 中的解决方案。

internal void PrintFizzBuzzAlternative(int num)
{
    if (num % 5 == 0)
        Console.Write("Fizz");
    if (num % 3 == 0)
        Console.Write("Buzz");
    if (num % 5 != 0 && num % 3 != 0)
        Console.Write(num);
    Console.WriteLine();
}
于 2014-06-08T00:42:28.130 回答
4

不是最有效的,但这是使用 C#-6字符串插值的方法:

void Main()
{
    for (int i = 1; i <= 100; i++)
    {
       Console.WriteLine($"{(i % 15 == 0 ? "FizzBuzz" : 
                             i % 3 == 0 ? "Fizz" : 
                             i % 5 == 0 ? "Buzz" : i.ToString())}");
    }
}
于 2015-11-23T13:30:39.143 回答
4
Enumerable.Range(1, 100).ToList().ForEach(i=>Console.WriteLine($"{(i%3*i%5==0?0:i):#;}{i%3:;;Fizz}{i%5:;;Buzz}"));

这个答案应有尽有:

  • LINQ
  • 条件格式
  • 字符串插值
  • 全部在一条线上

胜利!

于 2016-09-02T13:16:12.037 回答
3

FizzBu​​zz 问题是一个很好的面试问题。我们已经开始在面试过程中使用它。这么简单的问题竟然有多少人解决不了,真是令人吃惊。

请记住,由于大量人发布更多解决方案,原始博客文章最终被锁定。哈哈哈。

无论如何,这是我用 C++ 编写的!^_^

#include <iostream>
using namespace std;

int main(int argc, char** argv)
{
    for (int i = 1; i <= 100; ++i)
    {
        bool isMultipleOfThree = (i % 3) == 0;
        bool isMultipleOfFive = (i % 5) == 0;

        if (isMultipleOfThree) cout << "Fizz";
        if (isMultipleOfFive) cout << "Buzz";
        if (!isMultipleOfThree && !isMultipleOfFive) cout << i;

        cout << '\n';
    }

    return 0;
}
于 2012-08-01T18:05:03.383 回答
3

好吧,这到底是什么,这是我喜欢的解决方案:)

public void DoFizzBuzz()
{
    for (int i = 1; i <= 100; ++i)
    {
        bool isDivisibleByThree = i % 3 == 0;
        bool isDivisibleByFive = i % 5 == 0;

        if (isDivisibleByThree || isDivisibleByFive)
        {
            if (isDivisibleByThree)
                cout << "Fizz";

            if (isDivisibleByFive)
                cout << "Buzz";
        }
        else
        {
            cout << i;
        }
        cout << endl;
    }
}

显然,这不是最快的解决方案,但我喜欢它,因为它强调可读性,并使“FizzBu​​zz”案例不再是特例,而是通过代码路径自然发生的事情。

最后,每当这个问题出现时,我最喜欢的是我们可以看到 ppl 可以提出多少不同的解决方案。

于 2012-08-01T20:29:17.957 回答
3

我是初学者,这是我的尝试:

public void DoFizzBuzz()
   {
       for (int i = 1; i < 101; i++)
       {

           if ((i % 3 == 0) && (i % 5 == 0))
           {
               Console.WriteLine("{0} FizzBuzz", i);
           }
           else if (i % 3 == 0)
           {
               Console.WriteLine("{0} Fizz", i);
           }
           else if (i % 5 == 0)
           {
               Console.WriteLine("{0} Buzz", i);
           }
           else
           {
               Console.WriteLine(i);
           }

       }
       Console.ReadLine();
   }

我的方法有什么问题吗?我的方法似乎比其他人的方法简单得多,所以它一定是错误的。

于 2013-02-13T05:10:38.053 回答
3

您可能希望使其可配置,但问题是应该使什么可配置 - 我们不知道。也许我们应该使所有周期都可配置(FizzBu​​zz 有周期)。这是具有可配置周期的非常小而有趣的版本:

string[] fizzBuzzCycle = 
    "FizzBuzz,{0},{0},Fizz,{0},Buzz,Fizz,{0},{0},Fizz,Buzz,{0},Fizz,{0},{0}"
    .Split(',');

for (int i = 1; i <= 100; i++)
    Console.WriteLine(fizzBuzzCycle[i%fizzBuzzCycle.Length], i);

因此,如果要更改字符串或整个循环,则很容易更改。但是您只是不知道如何进行可配置。也许条件会改变:“对于素数打印 Pizz”,对于这个修改,@ThomasLevesque 的解决方案更好,因为它更容易改变。

于 2013-08-07T11:04:36.670 回答
3

我试图在不看答案的情况下解决这个问题。我花了3个小时才成功。(顺便说一句,我只是一个爱好程序员,所以请不要猛烈抨击我:))这是我的 c# 版本解决方案:

        static void Main(string[] args)
    {

        for (int i = 1; i <= 100; i++)
        {
            if(  ((i % 3) != 0) && ((i % 5) != 0))
            {
                WriteLine($"{i}");
            }
            else
            {
                if ((i % 15) == 0)
                {
                    WriteLine("FizzBuzz");
                }
                else if ((i % 3) == 0)
                {
                    WriteLine("Fizz");
                }
                else if ((i % 5) == 0)
                {
                    WriteLine("Buzz");
                }
            }                 
        }
    }
于 2016-07-10T18:45:52.183 回答
2

我建议在 for 循环中使用 ++i 而不是 i++,因为 i++ 需要制作副本;)

public void DoFizzBuzz()
{
    for (int i = 1; i < 101; ++i)
    {
        if (i % 15 == 0)
            Console.WriteLine ("FizzBuzz");
        else if (i % 3 == 0)
            Console.WriteLine ("Fizz");
        else if (i % 5 == 0)
            Console.WriteLine ("Buzz");
        else
            Console.WriteLine (i);
    }
}
于 2012-08-01T17:45:38.557 回答
2

在 Rob H 和 Jacob Krall 的帮助下,我目前拥有的就是这里。也许我将来会玩这个......只是想提供它。

public void DoFizzBuzz()
{
    // expect this to come in as parameter
    var combinations = new Tuple<int, string>[] 
    { 
        new Tuple<int, string> (3, "Fizz"), 
        new Tuple<int, string> (5, "Buzz"), 
    };

    Func<int, int, bool> isMatch = (i, comb) => i % comb == 0;

    // expect the borders 1, 100 to come in as parameters
    for (int i = 1; i <= 100; ++i)
    {
        var matchingCombs = combinations.Where(c => isMatch(i, c.Item1)).DefaultIfEmpty(new Tuple<int, string>(i, i.ToString())).Aggregate((v, w) => new Tuple<int, string>(v.Item1, v.Item2 + w.Item2)).Item2;
        Console.WriteLine(matchingCombs);
    }
}
于 2012-08-01T19:45:50.663 回答
2

我建议将这个紧凑的代码作为之前简单而漂亮的版本的补充。

for (int i = 1; i <= 100; i++) // i++ but not ++i as in your example, be careful here
{
    bool fizz = i % 3 == 0;
    bool buzz = i % 5 == 0;
    string output = fizz && buzz ? "FizzBuzz" :
                            fizz ? "Fizz" :
                            buzz ? "Buzz" :
                            i.ToString();

    Console.WriteLn(output);
}
于 2013-01-23T15:38:13.760 回答
2

一种功能性的方法...

Console.WriteLine(Enumerable
    .Range(1,100)
    .Aggregate("", 
        (a,i) => a + "\n" + (i%15==0 ? "fizzbuzz" : 
                                (i%5==0 ? "buzz" :
                                    (i%3==0 ? "fizz" : i.ToString())))));
于 2015-12-11T06:20:10.990 回答
2

使用 for 循环的相对简单的解决方案。

没有 Linq 或任何东西 - 只是基本的速记 if 语句

for(int x=1;x<101;x++)
    Console.WriteLine(x%3==0?"Fizz"+(x%5==0?"Buzz":""):x%5==0?"Buzz":x+"");

很像 csells(无字符串插值)并且适合一行的 Linq 解决方案是:

Enumerable.Range(1,100).ToList().ForEach(x=>Console.WriteLine(x%3==0?"Fizz"+(x%5==0?"Buzz":""):x%5==0?"Buzz":x+""));
于 2016-09-26T16:04:36.500 回答
2

显然,这有点超出了 FizzBu​​zz 挑战的精神。但在我的基准测试中,这是我在单线程时可以做到的最快速度,但仍以 100 终止。它是半展开的,使用StringBuilder. 它比标准方法快大约三倍。

const string FIZZ = " Fizz\n";
const string BUZZ = " Buzz\n";
const string FIZZBUZZ = " FizzBuzz\n";
    ...
var sb = new StringBuilder();
int i = 0;

while(true)
{       
    sb.Append(i+3);
    sb.Append(FIZZ);        
    sb.Append(i+5);
    sb.Append(BUZZ);        
    sb.Append(i+6);
    sb.Append(FIZZ);        
    sb.Append(i+9);
    sb.Append(FIZZ);        
    sb.Append(i+10);
    sb.Append(BUZZ);        
    if(i+12 > 100)
        break;
    sb.Append(i+12);
    sb.Append(FIZZ);    
    i+=15;
    sb.Append(i);
    sb.Append(FIZZBUZZ);
}

Console.Write(sb.ToString());
于 2016-10-16T18:16:34.177 回答
2

空合并运算符非常有用:

string output = null;
for (int i = 1; i <= 100; i++)
{
     if (i % 3 == 0) output += "fizz";
     if (i % 5 == 0) output += "buzz";
     Console.WriteLine(output ?? i.ToString());
     output = null;
}
Console.ReadKey();
于 2017-11-30T18:45:54.677 回答
2

即使已经编写了 20 个其他解决方案,我也会添加我的:它是这样的......

var x = 1;
while (x <= 100)
{
     if (x % 3 == 0 && x % 5 == 0)
        {Console.Writeline("FizzBuzz");}
     else if (x % 3 == 0)
        {Console.Writeline("fizz");}
     else if (x % 5 == 0)
        {Console.Writeline("Buzz");}
     else
        {Console.Writeline(x);}
     x++ 
}

我想出的第一个解决方案。简单,切中要害,完成工作。不需要布尔值。

于 2018-03-21T23:52:51.703 回答
2

这是我将 Func 与 IEnumerable 混合的努力

 class Program
{
    static void Main(string[] args)
    {
        foreach (var i in FizzBuzz(100))
        {
            Console.WriteLine(i);
        }
    }

    private static IEnumerable<string> FizzBuzz(int maxvalue)
    {
        int count = 0;
        //yield return count.ToString();
        Func<int, string> FizzBuzz = (x) => ((x % 5 == 0 && x % 3 == 0) ? "FizzBuzz" : null);
        Func<int, string> Buzz = (x) => ((x % 5 == 0) ? "Buzz" : null);
        Func<int, string> Fizz = (x) => ((x % 3 == 0) ? "Fizz" : null);
        Func<int, string> Number = (x) => x.ToString();

        while (count < maxvalue)
        {
            count++;

            yield return FizzBuzz(count) ?? Buzz(count) ?? Fizz(count) ?? Number(count);
        }
    }
}
于 2019-11-16T20:23:53.303 回答
1

最初的问题是:1.如何摆脱找到的布尔?2.有没有比foreach更好的测试方法?

这摆脱了 bool 和 foreach,我认为它仍然是可读的。

public static void DoFizzBuzz()
{
    var combinations = new Tuple<int, string>[]  
    {  
        new Tuple<int, string> (3, "Fizz"),  
        new Tuple<int, string> (5, "Buzz"),  
    };

    for (int i = 1; i <= 100; i++)
    {
        var fb = combinations.Where(t => {
            if (i % t.Item1 == 0)
            {
                Console.Write(t.Item2);
                return true;
            }
            return false;
        }).ToList();

        if (!fb.Any())
        {
            Console.Write(i);
        }

        Console.Write(Environment.NewLine);
    }
} 

谁能想到我们会对一个简单的儿童游戏如此兴奋?:)

于 2012-08-01T18:15:29.813 回答
1

您可以使用任何一种,只取您想要的量

static void Main(string[] args)
{
    GetFizzBuzz().Take(100).ToList().ForEach(Console.WriteLine);
}

private static IEnumerable<string> GetFizzBuzz()
{
    for (var i = 0; i < int.MaxValue; i++)
    {
        if (i % 3 == 0 && i % 5 == 0) yield return "FizzBuzz";
        if (i % 3 == 0) yield return "Fizz";
        yield return i % 5 == 0 ? "Buzz" : i.ToString(CultureInfo.InvariantCulture);
    }
}

或者干脆使用这个:

Enumerable.Range(1, 100).Select(s => {
    if (s % 3 == 0 && s % 5 == 0) return "FizzBuzz";
    if (s % 3 == 0) return "Fizz";
    return s%5 == 0 ? "Buzz" : s.ToString(CultureInfo.InvariantCulture);
}).ToList().ForEach(Console.WriteLine);
于 2013-06-28T17:47:55.303 回答
1

没有 if 条件,只有一个三元运算符。

string[] s = new string[6]{"Fizz", "Buzz", "", "", "", ""};
for (int i = 1; i <= 100; i++)
{
    string output = s[(i%3)*2] + s[(i%5)+1];
    Console.WriteLine(string.IsNullOrEmpty(output)? "" + i : output);
}
于 2017-02-24T20:14:00.667 回答
1

发现 Stringbuilder 是最快的。

我发现这个实现也是最容易阅读的。

public static void FizzBuzz() {

    StringBuilder sb = new StringBuilder();

    for (int i = 1; i <= 100; i++) {    
        if (i % 3 == 0 && i % 5 == 0) {
            sb.AppendLine($"{i} - FizzBuzz");
        } else if (i % 3 == 0) {
            sb.AppendLine($"{i} - Fizz");
        } else if (i % 5 == 0) {
            sb.AppendLine($"{i} - Buzz");
        } else {
            sb.AppendLine($"{i}");
        }
    }
    Console.WriteLine(sb);
}
于 2019-02-04T12:34:11.240 回答
0

不使用任何 If 的 C# 代码。

 //False = 0, True = 1.
    private void DivisibilityByFiveThreeTest(int num)
    {
        string[,] values = new string [2,2]{
                             {"None","Fizz"},
                             {"Buzz","FizzBuzz"}
                             };
        for(int i=1;i< num;i++)
        Console.WriteLine(values[Convert.ToInt32(i % 5 == 0), Convert.ToInt32(i%3==0)]);

    }
于 2014-08-18T20:54:29.160 回答
0

JavaScript 中的直接解决方案

var i = 1;
while (i <= 100){
    console.log((i % 3 === 0 && i % 5 === 0) ? "FizzBuzz" : (i % 3 === 0) ? "Fizz" : (i % 5 === 0 ? "Buzz" : i));
    i++;
}
于 2016-10-03T18:16:07.997 回答
0

在蟒蛇......

 for i in range(0, 100) :
        a = i % 3 == 0
        b = i % 5 == 0

        if(a & b):
            print("FizzBuzz")
        elif(a):
            print("Fizz")
        elif(b):
            print("Buzz")
        else:
            print(i)
于 2016-10-07T14:24:34.003 回答
0

C++ 实现

vector<string> FizzBuzz::execute(int n) {

    if(n == 0)
        return vector<string>();

    auto push = n % 15 == 0 ? "fizzbuzz" :
                n % 3 == 0 ? "fizz" :
                n % 5 == 0 ? "buzz" :
                to_string(n);

    auto execution = execute(n-1);
    execution.push_back(push);
    return execution;
}
于 2017-07-02T16:18:57.447 回答
0
In C#...

using System;
using System.IO;
class Solution {
    static void Main(String[] args) {        
        for(int i=1;i<=100;i++)
        {                       
         string result=(i%3==0 && i%5==0) ? "FizzBuzz" : 
               (i%5==0) ? "Buzz" :
                       (i%3==0) ? "Fizz" : i.ToString();            
         Console.WriteLine(res);
        }
    }
}


In VB.NET...

Imports System
Imports System.IO

Class Solution
    Private Shared Sub Main(ByVal args As String())
        For i As Integer = 1 To 100
            Dim res As String = If((i Mod 3 = 0 AndAlso i Mod 5 = 0), "FizzBuzz", If((i Mod 5 = 0), "Buzz", If((i Mod 3 = 0), "Fizz", i.ToString())))
            Console.WriteLine(res)
        Next
    End Sub
End Class
于 2018-09-18T11:00:11.790 回答
0

已被回答至死,但只是为了展示另一个回答实际问题的解决方案

public static void DoFizzBuzz()
{
    var combinations = new (int multiple, string output)[]
    {
        (3, "Fizz"),
        (5, "Buzz")
    };

    for (int i = 1; i <= 100; ++i)
    {
        // Seed the accumulation function with an empty string and add any 'matches' from each combination
        var fb = combinations.Aggregate("", (c, comb) => c + (i % comb.multiple == 0 ? comb.output : ""));

        Console.WriteLine(!string.IsNullOrEmpty(fb) ? fb : $"{i}");
    }
}
于 2018-10-15T19:21:37.043 回答
0

最短的答案!!!

读一读……看我的意思是:

for(;++$i<101;)print($i%15?$i%3?$i%5?$i:Buzz:Fizz:FizzBuzz)."\n"

语言 PHP。享受。

于 2019-01-25T02:46:58.813 回答
0

这是用 JavaScript 编写的答案

//returns true if modulus is zero and is reusable        
var isModulusZero = (challenge, modulator) => {
    let answer = challenge % modulator;

    if (answer == 0) {
        return true
    } else {
        return false
    }
}

var printOneToHundred = () => {
    var i = 1;

    for (i; i <= 100; i++) {

        if (isModulusZero(i, 3) && isModulusZero(i, 5)) {
            console.log('FizzBuzz')
        } else if (isModulusZero(i, 3)) {
            console.log('Fizz')
        } else if (isModulusZero(i, 5)) {
            console.log('Buzz')
        } else {
            console.log(i)
        }

    }
}
于 2019-01-29T10:11:10.270 回答
0

好的 - 我会咬人的。我在最近的一次初步编码面试中提出的 LINQ 重型解决方案。令人惊讶的是,这个简单的问题有多少不同的解决方案。

public static class FizzBuzzUtils
{
    private static List<KeyValuePair<int, string>> map = new List<KeyValuePair<int, string>> {
        new KeyValuePair<int, string>(3, "Fizz"),
        new KeyValuePair<int, string>(5, "Buzz")
    };

    public static string GetValue(int i)
    {
        var matches = map.Where(kvp => i % kvp.Key == 0)
            .Select(kvp => kvp.Value)
            .ToArray();
        return matches.Length > 0 ? string.Join(string.Empty, matches) : i.ToString();
    }

    public static IEnumerable<string> Range(int start, int count)
    {
        return Enumerable.Range(start, count)
            .Select(i => GetValue(i));
    }
}
于 2019-04-01T18:00:21.170 回答
0

Fizz Buzz Pattern(参见 CachedFizzBu​​zz 方法),结合策略模式。

using System;
interface IFizzBuzz
{
}
class NullFizzBuzz: IFizzBuzz
{
    public static int value;
     public override string ToString()
    {
        return value.ToString();
    }
}
class Buzz : IFizzBuzz
{
    public override string ToString()
    {
        return "Buzz";
    }
}
class Fizz: IFizzBuzz
{
    public override string ToString()
    {
        return "Fizz";
    }
}
class FizzBuzz : IFizzBuzz
{
    public override string ToString()
    {
        return "FizzBuzz";
    }
}

class FizzBuzzSolver
{
    public int Fizz { get; }
    public int Buzz { get; }
    public int Iterations { get; }
    public int FizzBuzz { get; }
    public int Quotient { get; }
    public int Remainder { get; }
    public FizzBuzzSolver(int fizz, int buzz, int iterations, int fizzbuzz, int quotient, int remainder)
    {
        Fizz = fizz;
        Buzz = buzz;
        Iterations = iterations;
        FizzBuzz = fizzbuzz;
        Quotient = quotient;
        Remainder = remainder;
    }

    internal void Solve(Action<FizzBuzzSolver> fizzBuzz)
    {
        fizzBuzz(this);
    }
}
class Program
{
    static void Main()
    {
        int fizz = 3;// int.Parse(Console.ReadLine());
        int buzz = 5;// int.Parse(Console.ReadLine());
        int iterations = 100;//int.Parse(Console.ReadLine());
        int fizzbuzz = fizz * buzz;
        int quotient = Math.DivRem(iterations, fizzbuzz, out var remainder);
        FizzBuzzSolver fb = new FizzBuzzSolver(fizz, buzz, iterations, fizzbuzz, quotient, remainder);
        switch (quotient)
        {
            case 0: fb.Solve(RemainderFizzBuzz); break;
            case 1: fb.Solve(NormalFizzBuzz);  break;
            default: fb.Solve(CachedFizzBuzz); break;
        };

        Console.Read();
    }

    private static void NormalFizzBuzz(FizzBuzzSolver fb)
    {
        for (int i = 1; i < fb.FizzBuzz; i++)
        {
            Console.WriteLine(i % fb.Fizz == 0 ? "Fizz" : i % fb.Buzz == 0 ? "Buzz" : i.ToString());
        }
        Console.WriteLine("FizzBuzz");
        for (int i = fb.FizzBuzz+1; i <= fb.Iterations; i++)
        {
            Console.WriteLine(i % fb.Fizz == 0 ? "Fizz" : i % fb.Buzz == 0 ? "Buzz" : i.ToString());
        }
    }

    private static void CachedFizzBuzz(FizzBuzzSolver fb)
    {
        var fizzbuzzArray = new IFizzBuzz[fb.FizzBuzz];

        for (int i = 0; i < fb.FizzBuzz - 1; i++)
        {
            int s = i + 1;
            if (s % fb.Fizz == 0)
            {
                fizzbuzzArray[i] = new Fizz();
                Console.WriteLine("Fizz");
            }
            else
            if (s % fb.Buzz == 0)
            {
                fizzbuzzArray[i] = new Buzz();
                Console.WriteLine("Buzz");
            }
            else
            {
                fizzbuzzArray[i] = new NullFizzBuzz();
                Console.WriteLine(s);
            }

        }
        fizzbuzzArray[fb.FizzBuzz - 1] = new FizzBuzz();
        Console.WriteLine("FizzBuzz");
        NullFizzBuzz.value = fb.FizzBuzz;
        for (int j = 1; j < fb.Quotient; j++)
        {
            for (int i = 0; i < fb.FizzBuzz; i++)
            {
                NullFizzBuzz.value++;
                Console.WriteLine(fizzbuzzArray[i]);
            }

        }
        for (int i = 0; i < fb.Remainder; i++)
        {
            NullFizzBuzz.value++;
            Console.WriteLine(fizzbuzzArray[i]);
        }
    }

    private static void RemainderFizzBuzz(FizzBuzzSolver fb)
    {
        for (int i = 1; i <= fb.Remainder; i++)
        {
            Console.WriteLine(i % fb.Fizz == 0 ? "Fizz" : i % fb.Buzz == 0 ? "Buzz" : i.ToString());
        }
    }
}
于 2019-12-28T16:12:44.293 回答
0

与此处的其他答案不同,此解决方案提供了轻松扩展它的可能性。如果面试官要求您也将 7 替换为“Woof”,则可以通过添加到地图中轻松完成。

var map = new Dictionary<int, string>
{
    {3*5*7, "FizzBuzzWoof"}, // Optional
    {5*7, "BuzzWoof"}, // Optional
    {3*7, "FizzWoof"}, // Optional
    {3*5, "FizzBuzz"},
    {7, "Woof"},
    {5, "Buzz"},
    {3, "Fizz"},
    {1, null} // For all numbers not evenly divisible
};

var words = Enumerable
    .Range(0, 154)
    .Select(i => (i == 0 ? null : map[map.Keys.First(k => i % k == 0)]) ?? i.ToString())
    .Dump("Words");

string.Join(' ', words).Dump("Result");

然而,识别所有排列成为一件苦差事,添加的额外单词越多,查找的次数就越多,但关键是要争论理解编码原则。

于 2021-02-26T15:24:04.840 回答
0

因为我们要使用通用的 FizzBu​​zz(我见过这个叫做Raindrops),所以有几个简单的修改来保持它的通用性和可读性:

  1. 将“组合”重命名为“primeFactors”使其更具描述性
  2. 元组字段名称使访问元组字段更具可读性
  3. Linq查询我们想要的显示字符串的素数列表(删除foreach
    • Where将列表过滤为当前整数的因子
    • Select将匹配因子转换为它们的显示字符串
    • DefaultIfEmpty处理“未找到匹配”的情况,允许我们删除该布尔值
    • Aggregate将所有匹配的显示字符串连接在一起

在线尝试!

public void DoFizzBuzz()
{
    var primeFactors = new (int Factor, string Display)[]
    {
        (3, "Fizz"),
        (5, "Buzz")
    };
    for (var integer = 1; integer <= 100; ++integer)
        Console.WriteLine(primeFactors
            .Where(tuple => integer % tuple.Factor == 0)
            .Select(tuple => tuple.Display)
            .DefaultIfEmpty($"{integer}")
            .Aggregate((first, second) => $"{first}{second}")
        );
}
于 2021-07-15T17:36:13.727 回答