c# - nodejs - Escribiendo FizzBuzz
fizzbuzz nodejs (30)
¿Alguien hizo esto ya?
Enumerable.Range(1, 100).Select(x =>
(x % 15 == 0) ? "FIZZBUZZ"
: (x % 5 == 0) ? "BUZZ"
: (x % 3 == 0) ? "FIZZ"
: x.ToString()
)
.ToList()
.ForEach(console.WriteLine);
Leyendo el horror de la codificación, acabo de encontrarme con FizzBuzz en otra ocasión.
La publicación original está aquí: Codificación del horror: ¿Por qué no pueden los programadores ... el programa?
Para aquellos que no lo saben: FizzBuzz es un juego para niños muy popular. Contando de 1 a 100, y cada vez que un número es divisible por 3 llamando a "Fizz", cada vez que un número es divisible por 5 llamando a "Buzz" y cada vez que un número es divisible por 3 y 5, llamando a "FizzBuzz en lugar de número
Pero esta vez, comencé a codificarlo. Fue un trabajo de un minuto, pero hay varias cosas que no me gustan.
Aqui esta mi codigo
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);
}
}
Así que mis preguntas son:
- ¿Cómo deshacerse del bool encontrado?
- ¿Hay una mejor manera de probar que el foreach?
3ª edición:
Aquí hay una forma de "deshacerse del bool" de su versión (que es reemplazar el bucle for en su pregunta original con esto):
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);
}
Respuestas previas:
Para una solución pura de C # revisa la solución de 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);
}
}
}
}
Trabajé un poco en FixBuzz usando linq. Estas son las soluciones que se me ocurrieron; creo que representan la mejor manera de expresar la solución a este problema utilizando 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);
}
}
y la versión loca de una línea:
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())
));
}
}
Agregaré el mío aunque hay otras 20 soluciones ya escritas: Funciona así ...
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++
}
Primera solución que se me ocurrió. Simple, al punto y hace el trabajo. No hay necesidad de bool.
Agregaré mis 5 centavos a la solución por Linq. Todo el mundo está utilizando Select, que es básicamente la función de mapa. En mi opinión, la función de plegado se adapta mejor a esta prueba:
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());
Aproveche los especificadores de formato condicional para obtener una versión bien jugada:
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);
}
Con el aporte de Rob H y Jacob Krall aquí es lo que tengo en este momento. Quizás jugaré con eso en el futuro ... solo quería proporcionarlo.
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);
}
}
Creo que empezaste de una manera complicada. Mejorar ese código sería más complicado. Puede usar una variable temporal para rastrear y mostrar esa variable al final de la verificación de FizzBuzz. A continuación se muestra el código y también puede ver este video detallado de C # FizzBuzz youtube ( http://www.youtube.com/watch?v=OX5TM3q-JQg ) que explica cómo se implementa el código siguiente.
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
}
Creo que lo que estás tratando de lograr es una solución genérica para FizzBuzz, que funcionará para cualquier número de combinaciones de números y palabras.
Tiene un buen comienzo. Creo que puedo responder sus preguntas con este ejemplo:
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);
}
}
En la práctica, pasaría combinations
al método, pero lo incluí dentro solo para ser conciso.
Creo que su implementación es innecesariamente compleja. Este hace el trabajo y es más fácil de entender:
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);
}
}
Desenrollado para máxima eficiencia. Este programa puede outfizzbuzz todos los demás.
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;
}
}
El operador de unión nula es realmente útil:
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();
En mi opinión, el problema de FizzBuzz siempre se presenta como un desafío para el entrevistador para hacer que aparezca la palabra FizzBuzz sin imprimirla explícitamente. Aquí está mi solución en 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();
}
Intenté resolver este problema sin mirar las respuestas. Me tomó 3 horas para tener éxito. (Por cierto, solo soy un programador de pasatiempos, así que no me golpees con fuerza, por favor :)) Esta es mi solución para la versión 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");
}
}
}
}
La pregunta de FizzBuzz es una gran entrevista. Hemos empezado a utilizarlo en nuestro proceso de entrevista. Es sorprendente la cantidad de personas que no pueden resolver un problema tan simple.
Tenga en cuenta que la publicación original del blog finalmente se cerró debido a una avalancha de personas que publicaron más soluciones. Jajaja.
En cualquier caso, aquí está el mío en 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;
}
Las preguntas originales fueron: 1. ¿Cómo deshacerse del boole encontrado? 2. ¿Hay una mejor manera de probar que el foreach?
Esto elimina el bool y el foreach, y creo que todavía es legible.
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);
}
}
¿A quién le importaría que estuviéramos tan entusiasmados con un juego simple para niños? :)
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()));
No es el más eficiente, pero aquí hay uno que usa interpolación de cadenas 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())}");
}
}
Obviamente, esto está un poco fuera del espíritu del desafío FizzBuzz. Pero en mi punto de referencia, esto fue lo más rápido que pude hacerlo con un solo hilo y aún terminando en 100. Es semi-desenrollado y utiliza un StringBuilder
. Es aproximadamente tres veces más rápido que el enfoque estándar.
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());
Ok, qué diablos, aquí está la solución que me ha gustado :)
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;
}
}
Obviamente, esta no es la solución más rápida, pero me gusta porque enfatiza la legibilidad y hace que el caso "FizzBuzz" ya no sea un caso especial, sino algo que sucederá naturalmente a través de la ruta del código.
Al final, lo que más me gusta de esta pregunta siempre que surge es que podemos ver cuántas soluciones diferentes puede aportar ppl.
Probablemente desee configurarlo, pero la pregunta es qué debería configurarse, no lo sabemos. Tal vez deberíamos hacer todo el ciclo configurable (FizzBuzz tiene el ciclo). Aquí está la versión muy pequeña y divertida con ciclo configurable:
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);
Entonces, si las cadenas o el ciclo completo deberían cambiarse, es fácil de cambiar. Pero simplemente no sabes qué hacer configurable. Tal vez la condición cambie: "para los números primos imprima Pizz" y para esta modificación, la solución de @ThomasLevesque es mejor, porque es más fácil de cambiar.
Puedes usar cualquiera de estos y solo tomar la cantidad que quieras
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);
}
}
O simplemente use esto:
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);
Recomiendo usar el ++ i en lugar del i ++ en un bucle for porque i ++ requiere que se haga una copia;)
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);
}
}
Sin condiciones, solo un operador ternario.
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);
}
Sin usar ningún If''s, código 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)]);
}
Solución relativamente simple utilizando un bucle for.
Sin Linq ni nada, solo una abreviatura básica si las declaraciones
for(int x=1;x<101;x++)
Console.WriteLine(x%3==0?"Fizz"+(x%5==0?"Buzz":""):x%5==0?"Buzz":x+"");
La solución Linq, que es muy parecida a csells (sin interpolación de cadenas) y encaja en una línea, sería:
Enumerable.Range(1,100).ToList().ForEach(x=>Console.WriteLine(x%3==0?"Fizz"+(x%5==0?"Buzz":""):x%5==0?"Buzz":x+""));
Soy un principiante, aquí está mi intento:
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();
}
¿Hay algo malo con mi enfoque? El mío parece mucho más simple que el enfoque de todos los demás, por lo que debe estar equivocado.
Sugeriría este código compacto como una adición a las versiones anteriores simples y agradables.
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);
}
Un enfoque funcional ...
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())))));
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);
}
}
Esto elimina el error found
, pero te obliga a hacer una evaluación duplicada. Es ligeramente diferente de algunas de las otras respuestas usando i % 15 == 0
para la calificación de FizzBuzz. Si esto es mejor o no, está en discusión. Sin embargo, es una forma diferente .
Enumerable.Range(1, 100).ToList().ForEach(i=>Console.WriteLine($"{(i%3*i%5==0?0:i):#;}{i%3:;;Fizz}{i%5:;;Buzz}"));
Esta respuesta lo tiene todo:
- LINQ
- Formato condicional
- Interpolacion de cuerdas
- Todo en una sola línea.
¡Victoria!