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
RoYaL avatar RoYaL Trainer 6849 Точки

Да, така е наистина - резултатът от два 32bit integer-а е нов 32bit integer. Тук решението е като това, когато искаш да разделиш две целочислени числа и да получиш число с плаваща запетая. Достатъчно е единият аргумент да е кастнат към по-големия тип - не е нужно да е деклариран като такъв тип.

            var x = int.MaxValue;
            var y = int.MaxValue;

            long result = 0;

            result = x + (long)y;
            Console.WriteLine(result);

Ако целият експрешън се кастне към по-големия тип (long)(x + y) - това означава първо да се извърши събирането, т.е. да се получи -2 и след това -2 да се присвои към long. Стойността му няма да се промени и ще остане -2, т.е. грешната.

 

0
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Здрасти пак,

прав си че ако навсякъде се кастне единия операнд към long пак си дава 100 точки, ама съвсем навсякъде, включително при result = (long)operandOne - 1;, за да се избегне int.MaxValue - 1 явно.

-2
NikolayUzunov avatar NikolayUzunov 7 Точки

Здравейте ! Някой има ли представа какви са тестовете след нулевите ? Какви числа са и в какъв ред се въвеждат ? Минавам нулевите и още на първия гърми . Ето го кода http://pastebin.com/FtCHUwXy . Така и немога да разбера къде е проблема . Накрая сложих double и пак гърми . Някакви идеи или критики към кода ? 

Благодаря !

0
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Здравей Николай,

не знам какви са тестовете, но понеже в задачата има условие:

  • The operands will be valid integers in the range [−2 147 483 648 … 2 147 483 647].

тествах програмата ти с този пример - това е output-a на твоята програма:

MLA 2147483647 2147483647
4.61168601413242E+18
END
Press any key to continue . . .

а това печата като output моята програмаЛ

MLA 2147483647 2147483647
4611686014132420609
END
Press any key to continue . . .

Понеже judge ми дава 100 точки, можеш да използваш моят output за ориентир - при големи числа type double променя формата на отпечатване, по-добре работи с long.

 

1
NikolayUzunov avatar NikolayUzunov 7 Точки

Аз си мисля , че пробвах и с long и ми даде грешка . Сега го промених навсякъде с long и тръгна без проблем . Всъщност теста е само 1 и май наистина дават MLA int*int  и отговора не се събира в int . Благодаря много !

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