public class RomanToHexPalindrome
public static string IsHexadecimalPalindrome(string romanNumber)
if (string.IsNullOrEmpty(romanNumber))
return "Error: Roman numeral cannot be null or empty.";
romanNumber = romanNumber.ToUpper();
if (!IsValidRomanNumeral(romanNumber))
return "Error: Invalid Roman numeral format.";
catch (ArgumentException e)
return "Error: " + e.Message;
decimalNumber = RomanToDecimal(romanNumber);
catch (ArgumentException e)
return "Error: " + e.Message;
if (decimalNumber > 10000)
return "Error: Number exceeds the maximum allowed value of 10000.";
string hexNumber = decimalNumber.ToString("X");
if (IsPalindrome(hexNumber))
return $"{romanNumber} is \"{hexNumber}\" which is a hexadecimal palindrome.";
for (int i = 1; i <= 4; ++i)
string paddedHex = new string('0', i) + hexNumber;
if (IsPalindrome(paddedHex))
return $"{romanNumber} is \"{hexNumber}\" which is a hexadecimal palindrome.";
return $"{romanNumber} is \"{hexNumber}\" which is not a hexadecimal palindrome.";
private static bool IsPalindrome(string str)
=> str.SequenceEqual(str.Reverse());
private static int RomanToDecimal(string roman)
for (int i = roman.Length - 1; i >= 0; i--)
char currentChar = roman[i];
int currentValue = GetValue(currentChar);
if (currentValue < prevValue)
prevValue = currentValue;
private static int GetValue(char romanChar)
default: throw new ArgumentException("Invalid Roman numeral character: " + romanChar);
private static bool IsValidRomanNumeral(string roman)
if (roman.Contains("IIII") || roman.Contains("VV") || roman.Contains("LL") || roman.Contains("DD") || roman.Contains("VX") || roman.Contains("VL") || roman.Contains("VC") || roman.Contains("VD") || roman.Contains("VM") || roman.Contains("XD") || roman.Contains("XM") || roman.Contains("LC") || roman.Contains("LD") || roman.Contains("LM") || roman.Contains("DM"))
for (int i = 0; i < roman.Length - 1; i++)
int currentValue = GetValue(roman[i]);
int nextValue = GetValue(roman[i + 1]);
if (currentValue < nextValue)
if (currentValue == 5 || currentValue == 50 || currentValue == 500)
if (i > 0 && GetValue(roman[i - 1]) < currentValue)
if (nextValue / currentValue > 10)
public static int Main(string[] args)
return new AutoRun().Execute(args);
public class RomanToHexPalindromeTests
public void IsHexadecimalPalindrome_ValidPalindrome_ReturnsTrue()
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("MMDCCXLVI"), Is.EqualTo("MMDCCXLVI is \"ABA\" which is a hexadecimal palindrome."));
public void IsHexadecimalPalindrome_ValidNonPalindrome_ReturnsFalse()
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("MMDCC"), Is.EqualTo("MMDCC is \"A8C\" which is not a hexadecimal palindrome."));
public void IsHexadecimalPalindrome_ValidPalindromeWithPadding_ReturnsTrue()
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("MMDCCXX"), Is.EqualTo("MMDCCXX is \"0AA0\" which is a hexadecimal palindrome."));
public void IsHexadecimalPalindrome_NullInput_ReturnsError()
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome(null), Is.EqualTo("Error: Roman numeral cannot be null or empty."));
public void IsHexadecimalPalindrome_EmptyInput_ReturnsError()
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome(""), Is.EqualTo("Error: Roman numeral cannot be null or empty."));
public void IsHexadecimalPalindrome_InvalidRomanNumeral_ReturnsError()
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("IIII"), Is.EqualTo("Error: Invalid Roman numeral format."));
public void IsHexadecimalPalindrome_NumberOutOfRange_ReturnsError()
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("MMMMMMMMMMMI"), Is.EqualTo("Error: Number exceeds the maximum allowed value of 10000."));
public void IsHexadecimalPalindrome_NonRomanCharacters_ReturnsError()
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("XYZ"), Does.StartWith("Error: Invalid Roman numeral character:"));
public void IsHexadecimalPalindrome_CaseInsensitiveInput_ReturnsCorrectResult()
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("mmdccxlvi"), Is.EqualTo("MMDCCXLVI is \"ABA\" which is a hexadecimal palindrome."));
public void IsHexadecimalPalindrome_EdgeCaseMinimumValue_ReturnsCorrectResult()
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("I"), Is.EqualTo("I is \"1\" which is a hexadecimal palindrome."));
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("II"), Is.EqualTo("II is \"2\" which is a hexadecimal palindrome."));
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("III"), Is.EqualTo("III is \"3\" which is a hexadecimal palindrome."));
public void IsHexadecimalPalindrome_EdgeCaseMaximumValue_ReturnsCorrectResult()
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("MMMMMMMMMM"), Is.EqualTo("MMMMMMMMMM is \"2710\" which is not a hexadecimal palindrome."));
public void IsHexadecimalPalindrome_InvalidSubtractiveNotation_ReturnsError()
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("VX"), Is.EqualTo("Error: Invalid Roman numeral format."));
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("VL"), Is.EqualTo("Error: Invalid Roman numeral format."));
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("VC"), Is.EqualTo("Error: Invalid Roman numeral format."));
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("VD"), Is.EqualTo("Error: Invalid Roman numeral format."));
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("VM"), Is.EqualTo("Error: Invalid Roman numeral format."));
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("XD"), Is.EqualTo("Error: Invalid Roman numeral format."));
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("XM"), Is.EqualTo("Error: Invalid Roman numeral format."));
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("LC"), Is.EqualTo("Error: Invalid Roman numeral format."));
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("LD"), Is.EqualTo("Error: Invalid Roman numeral format."));
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("LM"), Is.EqualTo("Error: Invalid Roman numeral format."));
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("DM"), Is.EqualTo("Error: Invalid Roman numeral format."));
public void IsHexadecimalPalindrome_LeadingZerosNeeded_ReturnsCorrectResult()
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("DCCCXXXVI"), Is.EqualTo("DCCCXXXVI is \"344\" which is not a hexadecimal palindrome."));
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("DCCCXXXVII"), Is.EqualTo("DCCCXXXVII is \"345\" which is not a hexadecimal palindrome."));
Assert.That(RomanToHexPalindrome.IsHexadecimalPalindrome("DCCCXXXVIII"), Is.EqualTo("DCCCXXXVIII is \"346\" which is not a hexadecimal palindrome."));