понеделник, 24 юни 2013 г.

C# програмиране - част I - Problem 2 – Drunken Numbers - Изпит на 23.06.2013

Задача 1
Задача 2
Задача 3
Задача 4
Задача 5

Здравейте,
Ето и впечатленията ми от втората задача на изпита.

Условието на задачата може да изтеглите от тук: 2. Drunken Numbers.doc

Тази задача ми се стори лесна и започнах с нея, но не я направих от първия път :).
Искаше ми се да опиша целия път на всяка от задачите и трудностите които срещнах, но в момента нямам достъп в bgcoder до всички предадени варианти и техния код ще го карам малко наизуст.

Първо я направих с тип int за сумата на бирите за всеки от участниците. В последствие се оказа че не стига и сложих long, дори в крайна сметка го оставих с ulong понеже си е положително число.
В началото си запазвах входа в стринг. След това чистех нулите отпред както е описано и обхождах  стринга един път до средата и натрупвах сумите едновремено за двата играча. Накрая просто сравнявах и печатах правилното в случаите.

Но все на 70 точки стоях.

Пренаписах програмата да взимам числата с int.Parse - тук беше момента в който разбрах че int не стига. Това добре но типа не помогна, дори опитах с BigInteger и пак не помогна.

По едно време ми хрумна че може да има други символи, макар че BigInteger.Parse и ulong.Parse минаваха. Опитах да извлека от стринга само символите от 0 до 9. Тук една грешка ми изигра лоша шега и ми отне много още мислене и чудене защо още съм на 70 точки.
След доста лутане забелязах че първо чистя нулите отпред и после извличам от стринга само цифрите. След като им смених местата и най-накрая 10 мин. преди края на изпита - 100 точки.
Евала. Невероятно облекчение.

Ето и моето решение:

using System;
using System.Text;

class DrunkenNumbers
{
    static void Main()
    {
        int rounds = int.Parse(Console.ReadLine());
        ulong countMitko = 0;
        ulong countVladko = 0;
        for (int round = 0; round < rounds; round++)
        {
            string drunkenNumber = Console.ReadLine();
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < drunkenNumber.Length; i++)
            {
                if (drunkenNumber[i] >= '0' && drunkenNumber[i] <= '9')
                {
                    sb.Append(drunkenNumber[i]);
                }
            }
            drunkenNumber = sb.ToString().TrimStart(new Char[] { '0' });
            int length = drunkenNumber.Length / 2 + drunkenNumber.Length % 2;
            for (int index = 0; index < length; index++)
            {
                if (drunkenNumber[index] >= '0' && drunkenNumber[index] <= '9')
                {
                    countMitko += (ulong)(drunkenNumber[index] - '0');
                }
                if (drunkenNumber[drunkenNumber.Length - 1 - index] >= '0' && drunkenNumber[drunkenNumber.Length - 1 - index] <= '9')
                {
                    countVladko += (ulong)(drunkenNumber[drunkenNumber.Length - 1 - index] - '0');
                }
            }
        }
        if (countMitko > countVladko)
        {
            Console.WriteLine("M {0}", (countMitko - countVladko));
        }
        else if (countMitko < countVladko)
        {
            Console.WriteLine("V {0}", (countVladko - countMitko));
        }
        else
        {
            Console.WriteLine("No {0}", (countMitko + countVladko));
        }
    }
}

1 коментар:

  1. Здравей, колега!!! Поздравления за блога.

    Според мен причината хората с верен алгоритъм да са масово с по 70 точки е че гърмят три теста с вход, в който има отрицателно число. Аз също бях на 70% и се усетих, че реално нас ни интересува цифрата на последния остатък при деление на 10 и ако той е с минус реално ще го извадим а не съберем. След това парснах числото по абсолютна стойност и резултата ми се промени на 100.

    Успех в академията....

    ОтговорИзтриване