Exemple #1
0
        //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());
        }
Exemple #2
0
 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);
            }
        }
Exemple #4
0
        // Связывает объект 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);
            }
        }