fork(4) download
  1. #include <cassert>
  2. #include <initializer_list>
  3. #include <iostream>
  4. #include <string>
  5. #include <utility>
  6. #include <vector>
  7.  
  8. using namespace std;
  9.  
  10. int fromRoman(const string& x) {
  11. auto first = crbegin(x);
  12. const auto last = crend(x);
  13.  
  14. auto decimalDigitFromRoman = [&](char unit, char five, char ten) {
  15. int num = 0;
  16. for (; first != last && *first == unit; ++first) ++num;
  17. while (first != last && (*first == ten || *first == five)) {
  18. num += *first == ten ? 10 : 5;
  19. for (++first; first != last && *first == unit; ++first) --num;
  20. }
  21. return num;
  22. };
  23.  
  24. int num = 0, pow = 1;
  25. for (auto syms : {"IVX", "XLC", "CDM"}) {
  26. num += decimalDigitFromRoman(syms[0], syms[1], syms[2]) * pow;
  27. pow *= 10;
  28. }
  29.  
  30. return num;
  31. }
  32.  
  33. int main() {
  34. vector<pair<string, int>> testRomans{
  35. {"I", 1}, {"II", 2}, {"III", 3}, {"IV", 4}, {"V", 5},
  36. {"VI", 6}, {"VII", 7}, {"VIII", 8}, {"IX", 9}, {"X", 10},
  37. {"XI", 11}, {"XII", 12}, {"XIII", 13}, {"XIV", 14}, {"XV", 15},
  38. {"XVI", 16}, {"XVII", 17}, {"XVIII", 18}, {"XIX", 19}, {"XX", 20},
  39. {"XXI", 21}, {"XXII", 22}, {"XXIII", 23}, {"XXIV", 24}, {"XXV", 25},
  40. {"XXVI", 26}, {"XXVII", 27}, {"XXVIII", 28}, {"XXIX", 29}, {"XXX", 30},
  41. {"XL", 40}, {"L", 50}, {"LIX", 59}, {"LX", 60}, {"LXIV", 64},
  42. {"XCIX", 99}, {"C", 100}, {"MCMXCIX", 1999}, {"MMXIV", 2014}, {"IIII", 4},
  43. {"VIIII", 9}, {"XIIX", 18}, {"XIIIII", 15}, {"MDCCCCX", 1910}, {"MDCDIII", 1903},
  44. {"XXXXXX", 60}};
  45.  
  46. for (const auto& x : testRomans) {
  47. auto num = fromRoman(x.first);
  48. assert(num == x.second);
  49. cout << num << ", ";
  50. }
  51. cout << endl;
  52. }
  53.  
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 40, 50, 59, 60, 64, 99, 100, 1999, 2014, 4, 9, 18, 15, 1910, 1903, 60,