[Homework] C# Basics - Conditional Statements - Problem {13}
Колеги,
При решаването на задача 13. Triangle от домашното за Условни конструкции срещнах една неочаквана трудност. При изчислението на страните на триъгълника се получава закръгление (15-16 знак при double), в следствие на което за определени входни данни се получава некоректен резултат.
Тествах и авторското решение, качено в judge - също връща грешен отговор в някои случаи.
Всеки може да го тества с точки A(0,0), B(2,2) и C(6,6) - това е само един от множеството примери, които дават грешка. Тези три точки са на една линия и не могат да образуват триъгълник. Но програмата казва, че могат. С включването на дебъгера лесно се вижда защо се получава така - от закръгление едното от неравенствата на триъгълника става вярно.
Опитах да го избегна чрез работа с decimal, но Math.Sqrt си иска double, което оттам насетне обезсмисля работата с decimal.
И тъй като всичко това се случва преди да го кача в judge, пробвах няколко други варианта като с още малко геометрия в крайна сметка стана (без да се ползват неравенствата на триъгълника). Не гледайте, че имам качени няколко грешни решения в judge - на друго се дължат.
В коментарите към домашното ми е препоръчано (и съвсем основателно) да ползвам неравенствата на триъгълника, както ни съветва самото условие на задачата. Надявам се това да не се е отразило на оценката, макар и да не смятам, че се е отразило. По никакъв начин не искам да дискредитирам оценката на домашното, колегата е дал добри препоръки и забележката не е насочена към неговата работа.
Но, това, което ме притеснява повече, е следното - възможно ли е в judge системата да не се тестват достатъчно изчерпателно решенията и в крайна сметка да може да се признае невярно решение. Под невярно имам предвид даващо грешен резултат, а не грешно като концепция. Защото тук е точно такъв случаят - аз изгубих около час да се боря със заобикаляне на закръгленията, а се оказва, че това изобщо не е било необходимо. Допускам, че judge системата проверява дали каченото решение дава същите отговори, както авторското, и затова дава 100 точки.
Надявам се някой да вземе предвид този проблем и да се избегнат подобни случаи занапред.
Поздрави,
Пламен Митов
P.S. Ако някой има решение само с неравенствата на триъгълника, което да дава верен отговор с цитираните по-горе входни данни, нека да покаже как го е постигнал.
Проблемът на колегата идва оттам, че е намерил точки, за които авторското решение и Judge дават грешен отговор (не че не му признават точки, а самият отговор подаден на Judge не е верен).
Трите точки с координати (0, 0), (2, 2) и (6, 6) лежат на една права, но проверката чрез неравенствата на триъгълника връща true и лице на "триъгълника" - 0.0 или нещо такова. Т.е. заради неточностите при работа с floating point числа неравенствата на триъгълника излизат верни по грешка.
Аз лично след като получих 100 точки хич не съм се заглеждал дали има някъде такива несъответствия, макар че със сигурност проверих поне няколко точки, които лежат на една права, но явно не съм уцелил такива, за които се получава грешка (вероятно има и други освен посочената тройка).