Skip to content

Instantly share code, notes, and snippets.

@MikeMKH
Created November 21, 2014 13:04
Show Gist options
  • Save MikeMKH/ea067c50297f31196e1c to your computer and use it in GitHub Desktop.
Save MikeMKH/ea067c50297f31196e1c to your computer and use it in GitHub Desktop.
FizzBuzz kata in C# using LINQ and "infinite" list.
using System;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace FizzBuzz
{
[TestClass]
public class FizzBuzzerTests
{
private static void AssertThat(string expected, int value)
{
Assert.AreEqual(expected, FizzBuzzer.ValueOf(value));
}
private static void AssertContainsFizz(int value)
{
AssertContains(value, "Fizz");
}
private static void AssertContainsBuzz(int value)
{
AssertContains(value, "Buzz");
}
private static void AssertContains(int value, string expected)
{
Assert.IsTrue(FizzBuzzer.ValueOf(value).Contains(expected));
}
[TestMethod]
public void GivenNumberNotDivisibleBy3Or5_ItMustReturnSelfAsString()
{
AssertThat("2", 2);
AssertThat("4", 4);
AssertThat("22", 22);
AssertThat("44", 44);
}
[TestMethod]
public void Given3_ItMustReturnFizz()
{
AssertThat("Fizz", 3);
}
[TestMethod]
public void GivenNumberDivisibleBy3_ResultMustContainFizz()
{
AssertContainsFizz(3);
AssertContainsFizz(9);
AssertContainsFizz(33);
AssertContainsFizz(333);
}
[TestMethod]
public void Given5_ItMustReturnBuzz()
{
AssertThat("Buzz", 5);
}
[TestMethod]
public void GivenNumberDivisibleBy5_ResultMustContainBuzz()
{
AssertContainsBuzz(5);
AssertContainsBuzz(25);
AssertContainsBuzz(55);
AssertContainsBuzz(555);
}
[TestMethod]
public void Given15_ItMustReturnFizzBuzz()
{
AssertThat("FizzBuzz", 15);
}
[TestMethod]
public void GivenNumberDivisibleByBoth3And5_ItMustReturnFizzBuzz()
{
AssertThat("FizzBuzz", 30);
AssertThat("FizzBuzz", 45);
AssertThat("FizzBuzz", 15000);
}
}
public class FizzBuzzer
{
public static string ValueOf(int n)
{
var fizzes = Enumerable.Range(0, int.MaxValue).Select(s => s%3 == 0 ? "Fizz" : string.Empty);
var buzzes = Enumerable.Range(0, int.MaxValue).Select(s => s%5 == 0 ? "Buzz" : string.Empty);
var result = fizzes.Zip(buzzes, (f, b) => f + b)
.Zip(Enumerable.Range(0, int.MaxValue).Select(s => s.ToString()),
(fb, d) => string.IsNullOrEmpty(fb) ? d : fb);
return result.Skip(n).First();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment