Writing FizzBuzz

后端 未结 30 1915
庸人自扰
庸人自扰 2020-12-04 08:50

Reading the coding horror, I just came across the FizzBuzz another time.

The original post is here: Coding Horror: Why Can\'t Programmers.. Program?

For thos

相关标签:
30条回答
  • 2020-12-04 09:20
    Enumerable.Range(1, 100).ToList().ForEach(i=>Console.WriteLine($"{(i%3*i%5==0?0:i):#;}{i%3:;;Fizz}{i%5:;;Buzz}"));
    

    This answer has it all:

    • LINQ
    • Conditional formatting
    • String interpolation
    • All on a single line

    Victory!

    0 讨论(0)
  • 2020-12-04 09:22

    I recommend using the ++i instead of the i++ in a for loop because i++ requires a copy to be made ;)

    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);
        }
    }
    
    0 讨论(0)
  • 2020-12-04 09:22

    Obviously this is a bit outside the spirit of the FizzBuzz challenge. But in my benchmark this was the fastest I could make it while single threaded and still terminating at 100. It is semi-unrolled and uses a StringBuilder. It is approximately three times faster than the standard approach.

    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());
    
    0 讨论(0)
  • 2020-12-04 09:24

    3rd edit:

    Here is one way to "get rid of the bool" from your version (that is replace the for loop in your original question with this):

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

    Prior answers:

    For a pure C# solution check out Keith Thompson's solution.

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

    I worked a bit on FixBuzz using linq. These are the solutions I came up with -- I believe they represent the best way to express the solution to this problem using 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);
      }
    }
    

    and the crazy one line version:

    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())
          ));
        }
    }
    
    0 讨论(0)
  • 2020-12-04 09:24

    Did anyone do this one already?

    Enumerable.Range(1, 100).Select(x =>
                    (x % 15 == 0) ? "FIZZBUZZ"
                    : (x % 5 == 0) ? "BUZZ"
                    : (x % 3 == 0) ? "FIZZ"
                    : x.ToString()
                    )
                    .ToList()
                    .ForEach(console.WriteLine);
    
    0 讨论(0)
  • 2020-12-04 09:27

    I think what you're trying to accomplish is a generic solution to FizzBuzz, that will work for any number of number-word combinations.

    You have a good start - I think I can answer your questions with this example:

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

    In practice, you would pass combinations in to the method, but I included it inside just to be concise.

    0 讨论(0)
提交回复
热议问题