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:

retweet

BBCode permitido - [code], [pre], [b], [i], [u], [del], [url], [left], [right], [center]

  • 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.


Ir direto para o topo