コーディングの恐怖を読んで、もう一度FizzBuzzに出会いました。
オリジナルの投稿はこちらです: Coding Horror:Why Ca n't Programmers .. Program?
知らない人のために:FizzBuzzは非常に人気のある子供向けゲームです。 1から100までカウントし、「Fizz」を呼び出す3で数字が割り切れるたびに、「バズ」を呼び出す5で数字が割り切れるたびに、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);
}
}
だから私の質問は:
あなたが達成しようとしているのは、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);
}
}
実際には、combinations
をメソッドに渡しますが、簡潔にするために内部に含めました。
あなたの実装は不必要に複雑だと思います。これは仕事をし、理解しやすいです:
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);
}
}
条件付き書式指定子を利用して、ゴルフのバージョンを取得します。
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);
}
効率を最大化するために展開されます。このプログラムは、他のすべてを凌fすることができます。
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;
}
}
3番目の編集:
バージョンから「boolを取り除く」ための1つの方法を次に示します(元の質問の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'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);
}
}
}
}
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);
}
}
クレイジーな1行バージョン:
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())
));
}
}
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
を取り除きますが、重複した評価を強制します。 FizzBuzz資格にi % 15 == 0
を使用する他の回答の一部とは若干異なります。これが良いかどうかは議論の余地があります。ただし、これはdifferentの方法です。
誰かこれをもうやったの?
Enumerable.Range(1, 100).Select(x =>
(x % 15 == 0) ? "FIZZBUZZ"
: (x % 5 == 0) ? "BUZZ"
: (x % 3 == 0) ? "FIZZ"
: x.ToString()
)
.ToList()
.ForEach(console.WriteLine);
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());
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()));
複雑な方法から始めたと思います。そのコードを改善することはより複雑になります。一時変数を使用して、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
}
最も効率的ではありませんが、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())}");
}
}
Enumerable.Range(1, 100).ToList().ForEach(i=>Console.WriteLine($"{(i%3*i%5==0?0:i):#;}{i%3:;;Fizz}{i%5:;;Buzz}"));
この答えにはすべてがあります:
勝利!
わかりました、これは私が気に入った解決策です:)
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;
}
}
明らかに、これは最速の解決策ではありませんが、読みやすさを強調し、「FizzBuzz」ケースを特別なケースではなく、コードパスを通じて自然に発生するものにするため、私はそれが気に入っています。
最後に、この質問について私が一番気に入っているのは、pplがいくつのソリューションを思いつくことができるかを知ることです。
あなたはおそらくそれを設定可能にしたいのですが、質問は何を設定可能にすべきかです-私たちはそれを知りません。おそらく、すべてのサイクルで構成可能にする必要があります(FizzBuzzにはサイクルがあります)。構成可能なサイクルを備えた非常に小さくて楽しいバージョンを次に示します。
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による解決策の方が変更が容易であるため、より優れています。
私は答えを見ずにこの問題を解決しようとしました。成功するのに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");
}
}
}
}
私は初心者です、私の試みはここにあります:
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();
}
私のアプローチに何か問題はありますか?私の方が他の人のアプローチよりもずっとシンプルだから、間違っているに違いない。
機能的なアプローチ...
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())))));
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(文字列補間なし)によく似ていて、1行に収まるLinqソリューションは次のようになります。
Enumerable.Range(1,100).ToList().ForEach(x=>Console.WriteLine(x%3==0?"Fizz"+(x%5==0?"Buzz":""):x%5==0?"Buzz":x+""));
私の意見では、FizzBuzzの問題は、Word FizzBuzzを明示的に印刷せずに表示するために、インタビュー対象者に常に課題として提示されます。 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();
}
他に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++
}
私が思いついた最初の解決策。シンプルで、要点を説明し、仕事を完了させます。ブールの必要はありません。
Null合体演算子は本当に便利です:
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();
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);
}
}
このコンパクトなコードを、以前のシンプルバージョンとニースバージョンに追加することをお勧めします。
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);
}
FizzBuzzの質問は、素晴らしいインタビューの質問です。インタビュープロセスで使用し始めました。 驚くべきそのような単純な問題を解決できない人が何人いるかです。
元のブログ投稿は最終的にロックされ、多くのソリューションを投稿する人々が殺到したためです。ハハハ。
とにかく、ここに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;
}
明らかに、これはFizzBuzzチャレンジの精神から少し外れています。しかし、私のベンチマークでは、これは、シングルスレッドで100で終了している最中に作成できました。それは、セミアンロールされ、StringBuilder
を使用します。標準的なアプローチよりも約3倍高速です。
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());
あなたはこれを使用するか、あなたが望む量だけを取ることができます
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);
If条件なしで、1つの三項演算子のみ。
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);
}
元の質問は次のとおりです。1。見つかったboolを取り除く方法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);
}
}
シンプルな子供向けゲームに興奮するだろう誰がサンクだろうか? :)
I ++ではコピーを作成する必要があるため、forループで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);
}
}
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);
}
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
最短回答!!!
読んでください...
for(;++$i<101;)print($i%15?$i%3?$i%5?$i:Buzz:Fizz:FizzBuzz)."\n"
言語PHP。楽しい。
死に答えられたが、実際の質問に答える別の解決策を示すためだけに
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}");
}
}
これは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)
}
}
}
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;
}
わかりました-噛みます。 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));
}
}
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)]);
}
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++;
}