IT Blog
RSS icon Email icon
  • Изпит в Софтуерната Академия на Телерик – C# втора част

    Posted on February 11th, 2013 Krasi Nikolov No comments

    Записах се за изпит за първата възможна дата, защото напоследък съм затрупан от ангажименти и ми се щеше да отпиша поне C# от списъка с проблеми за решаване. Като подготовка за изпита, реших няколко задачи от миналогодишните и не бях особено обнадежден. От една страна, за решаването на всяка задача ми отиваха поне 2-3 часа, от друга страна стигаха до 80-90%. Нямах нито една задача на 100%, всеки път достигах до time limit.
    От пръв поглед, задачите на изпита не изглеждаха много трудни. Прегледах ги набързо и реших да започна от първа стори ми се най- лесна. Прехвърляне на числа от 10-на към 256-на с-ма. Най- сложното нещо тук беше да се генерират съответствията на числото с неговото представяне в 256-на с-ма като букви от азбуката.
    Отделих си един метод за прехвърляне на число от 0 до 255 и останалото беше простичко.

        static string DecimalToKaspichan(ulong number)
        {
            ulong firstNumber = number / 26;
            ulong secondNumber = number % 26;
            string firstLetter = "";
            if (firstNumber > 0)
            {
                char letter = (char)(96 + firstNumber);
                firstLetter = "" + letter;
            }
            char secondLetter = (char)(65 + secondNumber);
            return firstLetter + secondLetter;
        }
    

    Първи тест в БгКодер и бум само 20%. Бърз поглед и видях, че int не стига. Коригирах на ulong и 90%. Сетих се че грешката идва от 0-та, беше ми по сложно да коригирам целият код затова го добавих отпред с един if и готово 100%. Бях загубил само 30 мин, така че се поуспокоих.
    Бърз поглед в класирането ми показа, че има вече хора решили и втората задача, така че направо се захванах с нея. Тя не беше нищо сложно, едномерен масив и намиране на най- добрата сума от няколко варианта. Най- сложното нещо тук беше нацепването на входа и вкарването му в матрица, останалото беше по лесно от доста от задачите за домашно. Показвам метода с който обикалям матрицата, като единственото хитро нещо е, че когато мина от някъде, променям стойността на полето на 1002. Когато стигна до 1002 или излезна от масива, връщам резултат.

        static int Walk(List pattern)
        {
            List currentValley = valley.ToList();
            int result = 0;
            int index = 0;
            int patternIndex = 0;
            while ((index >=0) && (index < currentValley.Count) && (currentValley[index] < 1001))
            {
                result += currentValley[index];
                currentValley[index] = 1002;
                index += pattern[patternIndex];
                patternIndex++;
                if (patternIndex == pattern.Count)
                {
                    patternIndex = 0;
                }
            }
            return result;
        }
    

    До тук общо един час, бърз поглед в класирането и направо към задачата със стрингове. Стори ми се лесничка пък и тази с кубовете изглеждаше доста обемна за писане.
    Кода при стринговете не е труден и го написах бързо, но изчистването на проблеми ми отне доста време. Никога не съм обичал този тип задачи, пипкав код, лесен за омазване. След повече от час борба с разни грешки имах готово решение, на уж лесната задача. Като решение кода е простичък, чета думите в един списък с думи. След това въртя един цикъл през списъка с думи и като стигна по- голяма дължина от дължината на реда. Пращам думите в един StringBuilder и им разпределям интервалите.

            for (int i = 0; i < text.Count; i++)         {             currentLetters += text[i].Length;             if (currentLetters + lastInLine - firstInLine+1 > w)
                {
                    AddToJustify(firstInLine, lastInLine, countLetters);
                    firstInLine = i;
                    lastInLine = i;
                    countLetters = text[i].Length;
                    currentLetters = countLetters;
                }
                else
                {
                    countLetters = currentLetters;
                    lastInLine = i;
                }
            }
    

    Бяха минали 3 часа от началото на изпита и имах 300 точки, така че спокойно се насочих към задачата с кубовете. Този тип задачи също не ми са от най- любимите, за мен е трудно да се ориентирам кое е ляво и кое дясно, камо ли да мисля за 3 измерения. Както и да е с много търпение, написах входа, отделих още един метод за изпълнение на командите. Добавих една променлива inGame за да следя дали топчето е все още в кубойда и решението беше готово. Няколко теста оправяне на малка неточност с Front i Back. Тест в БгКодер и 400 точки.
    От тук до края се започна с ходенето по мъките с 5-та задача. Почти безпроблемно написах решение за първата част, което работеше абсолютно правилно и много бавно.

        static int FindLast(int n)
        {
            bool[] lampsArray = new bool[n];
            List lamps = lampsArray.ToList();
            int lastIndex = 0;
            int step = 2;
            int found = 0;
            int index = lamps.FindIndex(a => a == false);
            while (index >= 0)
            {
                while (index >= 0)
                {
                    if (found % step == 0)
                    {
                        lamps[index] = true;
                        lastIndex = index;
                    }
                    index = lamps.FindIndex(index + 1, a => a == false);
                    found++;
                }
                index = lamps.FindIndex(a => a == false);
                step++;
                found = 0;
            }
            return lastIndex;
        }
    

    Тест в БгКодер и 10%. Последва дълъг период на напразни усилия да измъкна нещо от главата си, като очевидно нищо не ми хрумваше. Направих още едно решение, което освен бавно беше и грешно. реших, че докато не преборя, тази част няма смисъл да правя 2-рата част от задачата. Ако не ми стигнеше времето за накрая, даже си бях приготвил рандом генератори за 2-рата част. С малко късмет, можех да го докарам до 50% с няколко теста. В последните 30-на минути се сетих, че мога да търся в нета, но така и не открих нищо подобно.
    В крайна сметка постигнах добър резултат и съм доволен от представянето си. Дълбае ме съзнанието за прословутата 5-та задача, би трябвало да е нещо очевидно, но така и не се сетих за това.
    Тук съм показал пълните решения на задачите.
    https://github.com/nikolovk/CSharpSecondExam

    Leave a reply