//Create a function taking a positive integer as its parameter and returning a string containing the Roman Numeral representation of that integer. //Modern Roman numerals are written by expressing each digit separately starting with the left most digit and skipping any digit with a value of zero.In Roman numerals 1990 is rendered: 1000=M, 900=CM, 90=XC; resulting in MCMXC. 2008 is written as 2000=MM, 8=VIII; or MMVIII. 1666 uses each Roman symbol in descending order: MDCLXVI. //Example: //RomanConvert.Solution(1000) -- should return "M" //Help: //Symbol Value //I 1 //II 2 //III 3 //IV 4 //V 5 //VI 6 //VII 7 //VIII 8 //IX 9 //X 10 //L 50 //C 100 //D 500 //M 1,000 //Remember that there can't be more than 3 identical symbols in a row. //More about roman numerals - http://en.wikipedia.org/wiki/Roman_numerals public static string Romanize(int n) { List <string> solutionStrings = new List <string>(); StringBuilder solution = new StringBuilder(); LinkedList <(char, int)> Translations = new LinkedList <(char, int)>(); Translations.AddLast(new ValueTuple <char, int>('I', 1)); Translations.AddLast(new ValueTuple <char, int>('V', 5)); Translations.AddLast(new ValueTuple <char, int>('X', 10)); Translations.AddLast(new ValueTuple <char, int>('L', 50)); Translations.AddLast(new ValueTuple <char, int>('C', 100)); Translations.AddLast(new ValueTuple <char, int>('D', 500)); Translations.AddLast(new ValueTuple <char, int>('M', 1000)); Dictionary <int, string> patterns = new Dictionary <int, string> { { 0, "" }, { 1, "l" }, { 2, "ll" }, { 3, "lll" }, { 4, "lm" }, { 5, "m" }, { 6, "ml" }, { 7, "mll" }, { 8, "mlll" }, { 9, "lh" } }; int workingNumber = n; var currentLevel = Translations.First.Next; for (int i = 10; workingNumber != 0;) { //havent reached over thousands (or max level) if (currentLevel != null) { solutionStrings.Add((patterns[workingNumber % i] .Replace('l', currentLevel.Previous.Value.Item1) .Replace('m', currentLevel.Value.Item1) .Replace('h', currentLevel.Next.Value.Item1))); workingNumber /= 10; currentLevel = currentLevel.Next.Next; } //reached thousands (or max level) else { solution.Append(Translations.Last.Value.Item1, workingNumber % i); workingNumber /= 10; } } solutionStrings.Reverse(); foreach (string str in solutionStrings) { solution.Append(str); } return(solution.ToString()); }
private void AddTranslation(PhraseAndTranslation translation) { // Здесь нет проверки на activeValue, потому что этот метод используется только в конструкторе if (!translation.activeValue) { throw new ArgumentException("Passed translation parameter has been deleted"); } if (!ContainsTranslation(translation)) { Translations.AddLast(translation); } }
public override void AddTranslation(string translation) { int translationListOldCount = Translations.Count(); // В этом методе происходит связывание только с теми объектами, которые содержатся в БД base.AddTranslation(translation); if (translationListOldCount == Translations.Count()) { // Если перевод не добавился, тогда проверяем содержался ли он уже в коллекции Translations if (ContainsTranslation(translation)) { return; } // Если перевода нет в Translations, значит этого объекта нет в translationsDb, поэтому необходимо создать его RuPhraseAndTranslation ruPhrase = new RuPhraseAndTranslation(translation, this, RuPhrasesDb, EnPhrasesDb); Translations.AddLast(ruPhrase); } }
// Связывает объект this и translation, если translation существует public virtual void AddTranslation(string translation) { if (!activeValue) { throw new InvalidOperationException("This object has been deleted"); } // Если перевод содержится в коллекции Translation, тогда завершаем работу метода if (ContainsTranslation(translation)) { return; } var found = translationDb.FirstOrDefault(pt => pt.Phrase.Equals(translation, StringComparison.OrdinalIgnoreCase)); if (found != null) { found.Translations.AddLast(this); Translations.AddLast(found); } }