Dictionary<int, string> ra = new Dictionary<int, string> { { 1000, "M" }, { 900, "CM" }, { 500, "D" }, { 400, "CD" }, { 100, "C" }, { 90 , "XC" }, { 50 , "L" }, { 40 , "XL" }, { 10 , "X" }, { 9 , "IX" }, { 5 , "V" }, { 4 , "IV" }, { 1 , "I" } };
string ToRoman(int number) => ra .Where(d => number >= d.Key) .Select(d => d.Value + ToRoman(number - d.Key)) .FirstOrDefault();
int ToArabic(string number) => number.Length == 0 ? 0 : ra .Where(d => number.StartsWith(d.Value)) .Select(d => d.Key + ToArabic(number.Substring(d.Value.Length))) .FirstOrDefault();
static class RomanNum { // (c) 2015, Alexey Danov | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY ... static Dictionary<int, string> ra = new Dictionary<int, string> { { 1000, "M" }, { 900, "CM" }, { 500, "D" }, { 400, "CD" }, { 100, "C" }, { 90 , "XC" }, { 50 , "L" }, { 40 , "XL" }, { 10 , "X" }, { 9 , "IX" }, { 5 , "V" }, { 4 , "IV" }, { 1 , "I" } }; public static string ToRoman(int number) => ra .Where(d => number >= d.Key) .Select(d => d.Value + ToRoman(number - d.Key)) .FirstOrDefault(); public static int ToArabic(string number) => number.Length == 0 ? 0 : ra .Where(d => number.StartsWith(d.Value)) .Select(d => d.Key + ToArabic(number.Substring(d.Value.Length))) .First(); }
int o = 1; string w = "IVXLCDM"; Dictionary<char, int> ra = w.ToDictionary(ch => ch, ch => (o = ("" + o)[0] == '1' ? o * 2 : o * 5) / 2); int ToArabic(string num) => num.Select((c, i) => ++i < num.Length && ra[c] < ra[num[i]] ? -ra[c] : ra[c]).Sum();
string W(int k, int l = 1) => w.Substring(k, l); string R(char m, int k) => m == '9' ? W(k-2)+W(k) : m == '5' ? W(k-1) : m == '4' ? W(k-2, 2) : W(k-2); string ToRoman(int num) => num < 1 ? "" : (from z in "000100101".Split('1') from m in "9541" select m + z) .Where(z => num >= (o = int.Parse(z))) .Select(z => R(z[0], z.Length * 2)).First() + ToRoman(num - o);
static class RomanNumEx { // (c) 2015, Alexey Danov | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY ... static int o = 1; static string w = "IVXLCDM"; static Dictionary<char, int> ra = w.ToDictionary(ch => ch, ch => (o = ("" + o)[0] == '1' ? o * 2 : o * 5) / 2); public static int ToArabic(string num) => num .Select((c, i) => ++i < num.Length && ra[c] < ra[num[i]] ? -ra[c] : ra[c]).Sum(); static string W(int k, int l = 1) => w.Substring(k, l); static string R(char m, int k) => m == '9' ? W(k-2)+W(k) : m == '5' ? W(k-1) : m == '4' ? W(k-2, 2) : W(k-2); public static string ToRoman(int num) => num < 1 ? "" : (from z in "000100101".Split('1') from m in "9541" select m + z) .Where(z => num >= (o = int.Parse(z))) .Select(z => R(z[0], z.Length * 2)).First() + ToRoman(num - o); }
Source: https://habr.com/ru/post/271035/
All Articles