Loading...
NikolayLiubomirov avatar NikolayLiubomirov 82 Точки

ТОП 10 причини за FAIL на единичен тест в Judge системата

Най-неприятното нещо, което може да Ви се случи на изпит, е единичен тест да даде грешка в Judge системата. Ето защо направих списък с най-честите и неподозрителни причини за това. Направих поста специално за  предстоящите изпити. Тук са само случаи, в които Visual Studio няма да ни подчертае с червено, защото ще се компилират, но не както ние желаем и е описано в условието на задачата.

 

1. Граничен случай
                Пример:  ">", вместо ">=". Четете внимателно условията дали не се иска проверката до числото включително.

 

2. Грешка при copy-paste
                Пример:  "-" дефисът е всъщност дълго тире "" или нещо друго се е объркало при copy-paste, като "Аutumn" с "А" на кирилица (наистина се е случвало по време на изпит). Възможно е и заради едва забележим space в string-a да ви гръмне някой тест ("June ", вместо "June".)

 

3. Не Parse-вате правилно числата в правилния формат

Пример:  

double n = int.Parse(Console.ReadLine());

Куриозът е, че когато се случи IDE-то не го подчертава, а програмата гърми.

 

4. Не сте избрали Current Selection и се компилира друг код от Solution-а

Ако не сте направили това, то няма смисъл да си говорим и въобще да разглеждаме другите възможни причини.

 

5. Пропуснали сте нещо в условието

Дори да сте изпуснали и една дума, може да се обърка цялата логика, затова четете внимателно.

 

6. Делителят е int, делимото също е int, а ние очакваме резултатът да е дробно число.

Пример:

double x = 25 / 100;

вместо

double x = 25 / 100.0;

 

или

 

int y = 100;

double x = 25 / y;

вместо

int y = 100;

double x = 25 / (double)y;

Проверявайте интервала в условието [1.00 ... 1 000 000.00] - щом има десетична точка (.), значи се иска конзолата да чете дробно число и трябва да го сложите в double, decimal или float.

 

7. Някой placeholder или масив не работи

В програмирането броим от нула, така че да не се чудите, ако Ви излизат грешни резултати.

 

8. Няма къдрави скоби след if проверката, for или while цикъла 

Така влиза само в следващия ред.

Пример: Тук имаме и случай, в който не сме си форматирали кода добре. 

if (n > 10)
    Console.Write("n is bigger than: ")
    Console.WriteLine(10); // неправилно форматиране (с абзац навътре)

вместо:

if (n > 10)
{
    Console.Write("n is bigger than: ")
    Console.WriteLine(10);
}

 

9. Кодът ни не работи само в някои изключения

                Пример: Чертаем някаква фигурка на конзолата (например ромб), но когато въведем 1 или 2, програмата гърми... Най-вероятно някой new string смята отрицателен резултат, но вместо да си играем да го оправяме, за да спестим време, разглеждаме изключенията като отделни случаи и с return спираме изпълнението на програмата:

if (n == 1)

{

    Console.WriteLine("*");

    return;

}

else if (n == 2)

{

    Console.WriteLine(" *");

    Console.WriteLine("***");

    Console.WriteLine(" *");

    return;

}

 

10. Объркали сме име на променлива или поредността на четене от конзолата

Пример:  productKG, вместо productPrice.

Да, случва се и някой път се чудим с часове какво става. Логиката на задачата ни се струва без грешка, а то какво било – някакво си объркано име, заради невнимание или неправилна последователност на четене от конзолата…

 

Проверете тези случаи, ако смятате, че ще откриете грешката си по-бързо, отколкото с дебъгъра, или пък въобще няма да стане с дебъгъра, понеже fail-a в Judge не е на нулев тест и не Ви дава да видите вход/очакван изход, наш изход. Опитах се да съм колкото се може по-изчерпателен, но няма как да обхвана всичко, затова добавяйте и Вие варианти за грешки в коментарите, та с Ваша помощ да направим този пост извор на причини за бъгове!

И разбира се - успех на изпита! heart

Тагове:
18
Programming Basics 02/04/2018 14:59:37
MartinBG avatar MartinBG 4803 Точки
Best Answer

Поздравления за идеята и за споделената информация!

 

Ето и няколко други причини, с които реално се сбъсках при решаването с Java на задачи от по-стари изпити:

 

1. Препълване на променлива, когато избрания тип не е достатъчно голям за приемане или съхраняване на текущи резултати при големи входни стойности. Случва се най-често с long, защото при Java няма unsigned тип и съответно макс. положителна стойност е наполовина по-малка от тази в C# (някои задачи очакват unsigned long). Решението за Java е да се ползва BigInteger.

 

2. Загуба на точност при "дълги" сметки с реални числа. Това е много малко вероятно и евентуално би се случило, ако изхода е необработено реално число. Все пак си имайте едно на ум за тази възможност, и ако не откривате друг проблем в логиката на програмата си, пробвайте да замените float с double или BigDecimal (Java), които имат по-висока прецизност.

 

3. Проблем с Judge и Java, когато изхода е неформатирано реално число. Очаквания резултат за някои от по-старите задачи е според изхода на C#, който се различава от този на Java. Например:

Expected output: 569.668717948718

Your output: 569.6687179487179

Тук съм описал по-подробно проблема и съм предложил решение.

 

4. Очаква се реалните числа да се изкарат с точност до X знака след десетичната запетая. Освен тривиалното форматиране, трябва да се вземат предид и някои специфики на двата езика:

Console.WriteLine(1.00d); // C# -> 1

System.out.println(1.00d); // Java -> 1.0

За заобикаляне на този проблем в Java може да се използва DecimalFormat:

DecimalFormat df = new DecimalFormat("0.##");
System.out.println(df.format(1.00d)); // -> 1

 

Май това са най-честите проблеми с Java и Judge, с които съм се сблъсквал.

 

Поздрави и успех на изпита! :)

 

ЕДИТ:

Сетих се за още един проблем - преминаване на лимита от време, даден за изпълнение на задачата в Judge.

За сега съм открил само една такава задача - Problem 06. Letters Combinations, която изискваше оптимизация на кода (използване на StringBuilder или char[] масив) за Java, за да минат 2 от 10-те теста.

10
15/03/2017 21:17:08
NikolayLiubomirov avatar NikolayLiubomirov 82 Точки

Благодаря за допълнението, сигурен съм, че ще е много полезно за Java кодерите!

1
Mariesmith99 avatar Mariesmith99 -2 Точки

In spite of the fact that we imagine something else, quite a bit of what we do in the law is mystery. For instance, we like to flaunt that our criminal equity framework is intensely inclined for criminal litigants. white leather jacket - TheLeatherMakers

-2
MariaTomovich avatar MariaTomovich 20 Точки

Между другото аз ли съм единственият идиот, който супер често като принтира нещо прави един вид правописни грешки, ей така от бързане и не доглеждане :ДДДДД

0
andriiburka avatar andriiburka -1 Точки

Да, само ти

-2
t_zhelev avatar t_zhelev 24 Точки

4 и 10 няма как да са верни.

4 - Джъджа хич не му дреме, коя програма си компилираш във VS. Интересува го само на него какво му пействаш. 

10 - за имената на променливите пак не му пука. Ако искаш ги кръщават Пешо и Гошо, той гледа само изхода на програмата.

2
NikolayLiubomirov avatar NikolayLiubomirov 82 Точки

Така е за 4-то, но просто нямаше как да не го спомена. 


За 10-то е възможно да даде грешка на единичен тест, понеже ако напишем в някоя условна конструкция:

double area = a * b;

А пък "b" ни е "price", или нещо съвсем друго, то на някой тест може да извади грешни резултати. 
 

Иначе мерси за забележката, може би просто не съм си форматирал текста правилно, трябваше да ги напиша тези два случая като въведение и да са Топ 8, не Топ 10 smiley

0
16/03/2017 19:39:43
KrasimiraGeorgieva avatar KrasimiraGeorgieva 39 Точки

За да забравите за "4. Не сте избрали Current Selection и се компилира друг код от Solution-а"

Включвате си Visual Studio -> Tools -> Options -> Projects and Solutions - > Build and Run -> в дясната част на прозореца, кликвате в празното квадратче  For new solutions use the currently selected project as the startup project -> OK

4
NikolayLiubomirov avatar NikolayLiubomirov 82 Точки

Мерси за информацията, наистина е много полезна! 

1
emilia98 avatar emilia98 92 Точки

Аз мога да допълня с нещо, заради което можеш да си блъскаш главата дълго време.
Time Limit при използване на някои от методите (Abs,Pow) на класа Math, особено когато имаме вложени цикли.

Правих тази задача, на която Judge ми даваше 90/100, като на последния тест имах Time Limit. В един момент ми светна, че може би вложените цикли + Math.Abs, бавят програмата. С Math.Abs исках да се подсигуря, но кой да ти чете ограниченията, дадени в задачата.

//area = Math.Abs(left - right) * Math.Abs(top - bottom);
area = (right - left) * (bottom - top);


Извод:
Ако имате възможност (и в условието има някакви ограничения, които биха могли да ви помогнат), не използвайте класа Math, защото някой от тестовете може да гръмне заради Time Limit. линк с обяснение

2
18/03/2017 13:54:50
svilen_ivanov avatar svilen_ivanov 2 Точки

Допълнително ми се е случвало да гърми с mermory/time limit ако използвам ненужно големи променливи навсякъде, с ненужно голяма точност.

Демек да не използваме decimal вместо double (или дори float), особено ако имаме 10 променливи и някои от тях трабва сериозно да ги "зациклим" :)

 

 

0
ss3434 avatar ss3434 3 Точки

Благодаря за добрите обяснения

 

0
15/10/2019 23:41:19
dZf1aeA-patsm00re18 avatar dZf1aeA-patsm00re18 1 Точки

This is one of the good topc you can find in the net explaining everything in detail regarding about this. Then you can play the paper io online 2 for as long as you can!

0
simona_st avatar simona_st 38 Точки

За какво още може да се оглеждаме:

При string:

  • Празен string
  • Прекалено дълъг string
  • Unicode string (специални символи)
  • Ползване на симвoли, които не са позволени (ако имаме зададено някакво ограничение)
  • Дължината на string-а е четно/ нечетно число
  • Зададен аргумент null

Числа:

  • 0
  • Min / Max на int/long/dec и тн.
  • Положително/ отрицателно число

Още гранични случаи:

  • Празен вход
  • Въвежда се само един елемент
  • Прекалено дълъг input
  • Неверни данни
  • Вход null
  • Дублиране на елементи
  • Колекция, на която всички елементи са равни
  • Дължината на въведененият елемент е четно/ нечетно число
  • Празна колекция
  • Null collection

Източник: https://softwareengineering.stackexchange.com/questions/72761/how-do-you-identify-edge-cases-on-algorithms. Сега остава и да се сещаме за тези гранични случаи...

 

P.S. супер идея за темата.

 

1
23/06/2018 16:46:52
marony avatar marony 9 Точки

Много полезни съвети.Ще се опитам да ги следвам!

 

0
Petya_koleva avatar Petya_koleva 104 Точки

Страхотно. Поздравления, за обяснението!  Много добре е написано. Благодаря!

0
snaikeee avatar snaikeee 54 Точки

Супер

0
dZf1aeA-minion89 avatar dZf1aeA-minion89 9 Точки

The 10 reasons you have given me are very convincing, I agree with the reasons you give.
 

vex 3

0
rhysfaulkner avatar rhysfaulkner 13 Точки

When it comes to the profession of law, not every local laptop can able to the full fill the requirements for you. As a law student, you need to get the best laptop for law student that should able to provide you with the better screen resolution along with other major features.

 

 

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