# Roman Numerals Decoder [6 kyu]
[Roman Numerals Decoder](https://www.codewars.com/kata/51b6249c4612257ac0000005)
6 kyu
## Solution
```cpp=
/**
*** Author: R-CO
*** E-Mail: daniel1820kobe@gmail.com
*** Date: 2020-07-28
**/
#include <cctype>
#include <cstdlib>
#include <iostream>
using std::cout;
using std::endl;
#include <string>
using std::string;
#include <unordered_map>
using std::unordered_map;
/*
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
*/
using RefMap = unordered_map<char, int>;
RefMap ref_map({{'I', 1},
{'V', 5},
{'X', 10},
{'L', 50},
{'C', 100},
{'D', 500},
{'M', 1000}});
struct TestCaseStruct {
string input;
int expected_output;
};
class RomanNumeralsDecoder {
public:
int solution(const string &roman) {
int output = 0;
int previous_value = 0;
for (auto it = roman.rbegin(); it != roman.rend(); ++it) {
int current_value = ref_map[*it];
if (current_value >= previous_value) {
output += current_value;
} else {
output -= current_value;
}
previous_value = current_value;
}
return output;
}
};
int main(int argc, char *argv[]) {
/*
Assert::That(solution("XXI"), Equals(21)); }
It(should_work_for_a_few_other_examples) {
Assert::That(solution("I"), Equals(1));
Assert::That(solution("IV"), Equals(4));
Assert::That(solution("MMVIII"), Equals(2008));
Assert::That(solution("MDCLXVI"), Equals(1666));
*/
TestCaseStruct test_cases[] = {
{"XXI", 21}, {"I", 1}, {"IV", 4}, {"MMVIII", 2008}, {"MDCLXVI", 1666}};
RomanNumeralsDecoder solution;
for (const auto& test_case : test_cases) {
if (solution.solution(test_case.input) == test_case.expected_output) {
cout << "test case \"" << test_case.input << "\" is pass." << std::endl;
} else {
cout << "test case \"" << test_case.input << "\" is fail." << std::endl;
}
}
return EXIT_SUCCESS;
}
```
## Result
PASS
###### tags: `CodeWars` `C++`