Mar*_*tus 22 c# optimization fizzbuzz
阅读编码恐怖,我刚刚遇到了FizzBuzz.
原帖是在这里:编码恐怖:为什么程序员不能..程序?
对于那些不知道的人:FizzBuzz是一款非常受欢迎的儿童游戏.从1到100计数,每次一个数字可以被3调用"Fizz"整除,每次一个数字可以被5调整为"Buzz",并且每次数字可以被3和5整除时,调用"FizzBuzz而不是数
但这一次,我刚刚开始编码.这是一分钟的工作,但有几件我不喜欢的事情.
这是我的代码
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);
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
Tho*_*que 181
我认为您的实施不必要地复杂.这个工作做得很好,更容易理解:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
Mik*_*keP 24
利用条件格式说明符来获得一个漂亮的高尔夫版本:
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);
}
Run Code Online (Sandbox Code Playgroud)
Wug*_*Wug 23
展开以获得最高效率.这个程序可以超越所有其他人.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Hog*_*gan 19
第3编辑:
这是从你的版本中"摆脱bool"的一种方法(用你的原始问题替换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);
}
Run Code Online (Sandbox Code Playgroud)
先前的答案:
对于纯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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
和疯狂的一行版本:
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())
));
}
}
Run Code Online (Sandbox Code Playgroud)
Rob*_*b H 19
我认为你要完成的是FizzBuzz的通用解决方案,它适用于任意数量的数字组合.
你有一个良好的开端 - 我想我可以用这个例子回答你的问题:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
在实践中,你会传入combinations方法,但我把它包含在内部只是为了简洁.
Jas*_*own 13
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);
}
}
Run Code Online (Sandbox Code Playgroud)
这摆脱了bool found,但迫使你做重复评估.它与i % 15 == 0用于FizzBuzz认证的其他一些答案略有不同.这是否更好是有争议的.但是,这是一种不同的方式.
she*_*nku 11
有人做过这个吗?
Enumerable.Range(1, 100).Select(x =>
(x % 15 == 0) ? "FIZZBUZZ"
: (x % 5 == 0) ? "BUZZ"
: (x % 3 == 0) ? "FIZZ"
: x.ToString()
)
.ToList()
.ForEach(console.WriteLine);
Run Code Online (Sandbox Code Playgroud)
Linq将为我的解决方案增加5美分.每个人都在使用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());
Run Code Online (Sandbox Code Playgroud)
LINQ:
Enumerable.Range(1, 100).ToList().ForEach(i => Console.WriteLine( i % 3 * i % 5 == 0 ? (i % 3 == 0 ? "Fizz" : "") + (i % 5 == 0 ? "Buzz" : "") : i.ToString()));
Run Code Online (Sandbox Code Playgroud)
我想你是从一个复杂的方式开始的.改进代码会更复杂.您可以使用temp变量在FizzBuzz检查结束时跟踪和显示该变量.下面是代码,您还可以观看此详细信息c#FizzBuzz youtube video(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
}
Run Code Online (Sandbox Code Playgroud)