Skip to content

Instantly share code, notes, and snippets.

@JanVoracek
Last active August 29, 2015 14:01
Show Gist options
  • Save JanVoracek/4a040e450382b3350afb to your computer and use it in GitHub Desktop.
Save JanVoracek/4a040e450382b3350afb to your computer and use it in GitHub Desktop.
Coding Dojo Pardubice #4 – Functional approach
using System;
using System.Collections.Generic;
using System.Linq;
using Xunit;
using Xunit.Extensions;
namespace CodingDojo
{
public class Dojo
{
internal struct ArabicRomanPair
{
internal readonly int Arabic;
internal readonly string Roman;
public ArabicRomanPair(int arabic, string roman)
{
Arabic = arabic;
Roman = roman;
}
}
private static readonly IEnumerable<ArabicRomanPair> RomanNumbers = new List<ArabicRomanPair>
{
new ArabicRomanPair(1000, "M"),
new ArabicRomanPair(900, "CM"),
new ArabicRomanPair(500, "D"),
new ArabicRomanPair(400, "CD"),
new ArabicRomanPair(100, "C"),
new ArabicRomanPair(90, "XC"),
new ArabicRomanPair(50, "L"),
new ArabicRomanPair(40, "XL"),
new ArabicRomanPair(10, "X"),
new ArabicRomanPair(9, "IX"),
new ArabicRomanPair(5, "V"),
new ArabicRomanPair(4, "IV"),
new ArabicRomanPair(1, "I"),
};
public static int RomanToArabic(string roman)
{
var highestMatch = RomanNumbers.FirstOrDefault(n => roman.StartsWith(n.Roman));
return String.IsNullOrEmpty(roman)
? 0
: highestMatch.Arabic + RomanToArabic(roman.Substring(highestMatch.Roman.Length));
}
public static string ArabicToRoman(int arabic)
{
var highestMatch = RomanNumbers.FirstOrDefault(n => arabic >= n.Arabic);
return arabic == 0
? ""
: highestMatch.Roman + ArabicToRoman(arabic - highestMatch.Arabic);
}
public static IEnumerable<object[]> RomanToArabicTestData
{
get
{
yield return new object[] {"I", 1};
yield return new object[] { "I", 1 };
yield return new object[] { "II", 2 };
yield return new object[] { "III", 3 };
yield return new object[] { "V", 5 };
yield return new object[] { "VI", 6 };
yield return new object[] { "XII", 12 };
yield return new object[] { "LX", 60 };
yield return new object[] { "XL", 40 };
yield return new object[] { "XX", 20 };
yield return new object[] { "IV", 4 };
yield return new object[] { "MCMXCIX", 1999 };
yield return new object[] { "DCLXVI", 666 };
yield return new object[] { "CDLIX", 459 };
yield return new object[] { "", 0 };
}
}
[Theory]
[PropertyData("RomanToArabicTestData")]
public void ForArabicNumberReturnRomanRepresentation(string romanNumber, int arabicNumber)
{
Assert.Equal(romanNumber, ArabicToRoman(arabicNumber));
}
[Theory]
[PropertyData("RomanToArabicTestData")]
public void ForRomanRepresentationReturnArabicNumber(string romanNumber, int arabicNumber)
{
Assert.Equal(arabicNumber, RomanToArabic(romanNumber));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment