Loading...
viktorlazarov avatar viktorlazarov 16 Точки

[Lab] C# Advanced Debuging lab проблем с задача InstructionSet

Здравейте колеги,вчера се пробвах в състезанието за дебъгване в judge системата.Първите няколко кода,които качих наистина не работеха както трябва,но последният код ,който качих си работи перфектно в VS,но в judge системата ми гърми изцяло.Въпросът ми е къде бъркам?Ето това е моята версия

http://pastebin.com/qe7esZy0

ModEdit: Моля преди да пускаш нови теми прочети правилата на форума - по-конкретно т.9 и т.12

Тагове:
1
C# Advanced 14/05/2015 22:09:56
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Здравей Викторе,

Решението ти е много добре започнато: решен е проблемът с умножение, с increase и decrease. Judge обаче очаква и да не печаташ нито един символ в повече от това, което има в примерите:

Ако вземем първия пример, програмата ти дава следния output:

INC 0
1
END
0

T.e. след INC 0 печата 1, дотук добре(judge точно и само 1 очаква като output тук), но после въвеждам END, и програмата отпечатва 0, и продължава да чака за още входни данни, не излиза стандартното Press any key to continue . . . А тази нула е защото като програмата не е прочела "END", защото входът е с главни букви - а кодът очаква малки if (opCode != "end"), опитва да вкара "end" в switch-a, но го няма там като case, разбира се и result = 0; си остава 0, и се печата 0.

Когато смених if (opCode != "end") с if (opCode != "END") - вече започна да го разпознава, но печата приятното Have a nice day, което judge не разбира :)

INC 0
1
END
Have a nice day
Press any key to continue . . .

После закометирах поздрава:

            //else
            //{
            //    Console.WriteLine("Have a nice day");
            //}

И в Details в judge пишеше, че всички нулеви тестове са минали, а още има 0/100 точки. И тогава промених всяко int и long на BigInteger, и програмата ти даде 100 точки в judge - при изчисления с крайните стойност явно се получават големи числа.

Прав си, наистина работи - само 3 съвсем малки детаила промених: end стана END, махнах поздрава, и направих абсолютно всяка променлива BigInteger.

-2
viktorlazarov avatar viktorlazarov 16 Точки

Благодаря много за критиката :) Казаното от вас много ме радва,защото разбирам,че почти съм се справил със задачата,което за мен означава много :) За напред ще се опитвам да обръщам повече внимание на такива "малки" детайли :) Поздрави

0
RoYaL avatar RoYaL Trainer 6849 Точки

Правенето на всяка променлива на BigInteger е overkill. При положение, че двата операдна могат да бъдат най-много int.MaxValue, то операндите е достатъчно да са int, а резултатът е достатъчно да побира int.MaxValue на квадрат, т.е.long. Ако никъде по кода не увеличаваш или амаляш операндите би трябвало да проработи. Сигурни ли сте, че само с long-ове не става?

1
15/05/2015 01:52:40
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Здравей RoYal,

честно казано и на мене ми е много странно, и започвам да се чудя дали подадените числа са не са int, или пък в

а = b + c всъщност b + c не правят едно число по-голямо от int, и чак след това го присвояват на a.

Ако направя само BigInteger result = 0; или long result = 0;, и оставя всички операнди да са int - judge дава 0 точки.

Направиха ми впечатление още две подробности: написах var x = operandOne + 1; за да проверя типа данни на operandOne + 1, и като сложа курсора на var, чета 32-bit signed integer (което ще рече че при int.MaxValue + 1 резултата се чупи още преди да е присвоен?!

Виктор е измислил нещо любопитно: result = (long)(operandOne * operandTwo); или в моя вариант става

BigInteger result = 0;

result = (BigInteger)(operandOne * operandTwo);

И ReSharper ми посивява това (BigInteger) и пише Type cast is redundant - това ако значи че int.MaxValue * int.MaxValue си остава int (т.е. съвсем погрешен резултат от умножението) и чак после се каства към BigInteger - това би обяснило защо ако само резултата е long или BigInteger, а операндите са int - резултата от изчисленията е грешен и judge дава 0 точки? Ти какво мислиш?

 

-2
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.