Anterior
Próximo
Coding Dojo Fizz Buzzpublicado em 10/02/2010
Para quem ainda não ouviu falar, Coding Dojo é o nome dado ao encontro onde um
grupo de programadores tenta resolver um desafio de programação a fim de se divertir e treinar suas habilidades.
O Coding Dojo possui diversas regras, as 2 principais ao meu ponto de vista são:
- Desenvolvimento guiado por testes: O uso de TDD é
obrigatório no Coding Dojo, antes de cada passo é necessário construir o teste
unitário para que em seguida seja desenvolvido o código que atenderá ao teste.
- Baby Steps ( Passos de Bebe ) : Devemos escrever o código mais simples possível apenas para que passe no teste realizado. Assim indo passo a passo vamos
refatorando o código e entendendo o problema mais facilmente.
Resolvi iniciar no mundo do Dojo resolvendo o problema FizzBuzz proposto no vídeo
disponibilizado pelo grupo .Net Architects.
Para quem não conhece, o FizzBuzz é um jogo muito comum
entre crianças que consiste em falar uma determinada palavra sempre que um determinado número aparecer.
As regras propostas para este Dojo são as seguintes:
- Sempre que um numero for divisível por 3 e por 5 escreve FizzBuzz
- Sempre que um numero contiver os números 3 ou 5 escreve FizzBuzz
- Sempre que um numero for divisível por 3 escreve Fizz
- Sempre que um numero contiver o números 3 escreve Fizz
- Sempre que um numero for divisível por 5 escreve Buzz
- Sempre que um numero contiver o números 5 escreve Buzz
- Caso não atenda nenhuma das regras citadas, escreve o mesmo numero passado.
Por exemplo, caso sejam passados os números 1,2,3,4,5,30 a resposta do programa deverá ser
1,2,Fizz,4,Buzz,FizzBuzz.
Ao longo do desenvolvimento criei os seguintes testes:
[TestClass]
public class DadoUmFizzBuzz
{
[TestMethod]
public void Quando_Passo_1_Retorno_1()
{
string retorno = FizzBuzz.VerificarFizzBuzz(1);
Assert.AreEqual("1", retorno);
}
[TestMethod]
public void Quando_Passo_2_Retorno_2()
{
string retorno = FizzBuzz.VerificarFizzBuzz(2);
Assert.AreEqual("2", retorno);
}
[TestMethod]
public void Quando_Passo_3_Retorno_Fizz()
{
string retorno = FizzBuzz.VerificarFizzBuzz(3);
Assert.AreEqual("Fizz", retorno);
}
[TestMethod]
public void Quando_Passo_4_Retorno_4()
{
string retorno = FizzBuzz.VerificarFizzBuzz(4);
Assert.AreEqual("4", retorno);
}
[TestMethod]
public void Quando_Passo_5_Retorno_Buzz()
{
string retorno = FizzBuzz.VerificarFizzBuzz(5);
Assert.AreEqual("Buzz", retorno);
}
[TestMethod]
public void Quando_Passo_6_Retorno_Fizz()
{
string retorno = FizzBuzz.VerificarFizzBuzz(6);
Assert.AreEqual("Fizz", retorno);
}
[TestMethod]
public void Quando_Passo_9_Retorno_Fizz()
{
string retorno = FizzBuzz.VerificarFizzBuzz(9);
Assert.AreEqual("Fizz", retorno);
}
[TestMethod]
public void Quando_Passo_10_Retorno_Buzz()
{
string retorno = FizzBuzz.VerificarFizzBuzz(10);
Assert.AreEqual("Buzz", retorno);
}
[TestMethod]
public void Quando_Passo_13_Retorno_Fizz()
{
string retorno = FizzBuzz.VerificarFizzBuzz(13);
Assert.AreEqual("Fizz", retorno);
}
[TestMethod]
public void Quando_Passo_30_Retorno_FizzBuzz()
{
string retorno = FizzBuzz.VerificarFizzBuzz(30);
Assert.AreEqual("FizzBuzz", retorno);
}
[TestMethod]
public void Quando_Passo_52_Retorno_Buzz()
{
string retorno = FizzBuzz.VerificarFizzBuzz(52);
Assert.AreEqual("Buzz", retorno);
}
[TestMethod]
public void Quando_Passo_58_Retorno_Buzz()
{
string retorno = FizzBuzz.VerificarFizzBuzz(58);
Assert.AreEqual("Buzz", retorno);
}
[TestMethod]
public void Quando_Passo_51_Retorno_Buzz()
{
string retorno = FizzBuzz.VerificarFizzBuzz(51);
Assert.AreEqual("Fizz", retorno);
}
[TestMethod]
public void Quando_Passo_53_Retorno_Buzz()
{
string retorno = FizzBuzz.VerificarFizzBuzz(51);
Assert.AreEqual("Fizz", retorno);
}
[TestMethod]
public void Quando_Passo_15_Retorno_FizzBuzz()
{
string retorno = FizzBuzz.VerificarFizzBuzz(15);
Assert.AreEqual("FizzBuzz", retorno);
}
[TestMethod]
public void Quando_Passo_1_2_3_Retorna_1_2_Fizz()
{
string retorno = FizzBuzz.Executar(1, 2, 3);
Assert.AreEqual("1,2,Fizz", retorno);
}
[TestMethod]
public void Quando_Passo_1_2_3_4_5_6_7_8_9_10_30_Retorna_1_2_Fizz_4_Buzz_Fizz_7_8_Fizz_Buzz_FizzBuzz()
{
string retorno = FizzBuzz.Executar(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 30);
Assert.AreEqual("1,2,Fizz,4,Buzz,Fizz,7,8,Fizz,Buzz,FizzBuzz", retorno);
}
}
E meu código ficou assim:
public class FizzBuzz
{
public static string Executar(params int[] numeros)
{
string retorno = null;
foreach (int numero in numeros)
{
string fizz = VerificarFizzBuzz(numero);
retorno += (String.IsNullOrEmpty(retorno)) ? fizz : "," + fizz;
}
return retorno;
}
public static string VerificarFizzBuzz(int numero)
{
bool divisivelPor3 = DivisivelPor(numero, 3);
bool divisivelPor5 = DivisivelPor(numero, 5);
bool contem3 = numero.ToString().Contains("3");
bool contem5 = numero.ToString().Contains("5");
if ((divisivelPor3 && divisivelPor5) || (contem3 && contem5))
return "FizzBuzz";
if (divisivelPor3 || contem3)
return "Fizz";
if (divisivelPor5 || contem5)
return "Buzz";
return numero.ToString();
}
private static bool DivisivelPor(int numero, int divisor)
{
return numero % divisor == 0;
}
}
Faça o download da Solution com tudo funcionando:
Referencias úteis:
Tags:
-
10/2/2010 22:26 - Diogo Menezes
Apenas para constar a mesma solução com linq.
public static string FizzBuzzComLinq(params int[] numeros)
{
string retorno = null;
var lista = numeros.Select(x => x % 3 == 0 ? "Fizz" + (x % 5 == 0 ? "Buzz" : "") :
(x % 5 == 0 ? "Buzz" : x.ToString())).ToList();
foreach(string item in lista)
retorno += (String.IsNullOrEmpty(retorno)) ? item : "," + item;
return retorno;
}
-
10/2/2010 23:46 - Vinicius Quaiato
Parabéns rapaz! Ficou bacana a solução e o código. Dojo é incrível! E é treinando que se aprende... e se diverte, hehehe! É isso aê! Abraços, Vinicius Quaiato.