Loading...
valiobar avatar valiobar 29 Точки

Java Retake 08.05 проблем със задача 4 Royal Accounting

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

Вчера на изпита ми се случи нещо доста странно .

Това е решението ми http://pastebin.com/y6mU992g.

Проблема ми е с първият нулев тест.Когато пусна задачата при мен излиза вярно решение, но когато я кача в judge  output-a е различен  http://postimg.org/image/4trt01x35/.Като цяло judge ми дава 20 точки , тъй като не са качени още тестовете не знам дали това оказва влияние в/у точките ,но е интересен казус.Ще се радвам ако някой може да му обясни каква е причината.

Благодаря предварително.

 

Тагове:
0
Java Advanced
vpl2001 avatar vpl2001 54 Точки

Относно темата - дали някой може да покаже решение със 100 от 100, че доста я мъчих тая задача. Благодаря предварително!

0
Mhristoforova avatar Mhristoforova 166 Точки

http://pastebin.com/R0VhjhWR :)

1
vpl2001 avatar vpl2001 54 Точки

Супер е! Накрая функционалната част e яка! :)

0
geiff avatar geiff 71 Точки

Добро решение, браво. А дали някои е решил 2 - ра задача за 100 точки?

0
Alex0101 avatar Alex0101 374 Точки

Eто код на втора за 100

http://pastebin.com/q0K5Y3UE

1
09/05/2016 13:56:39
kaloyannikov avatar kaloyannikov 531 Точки

@Mhristoforova ,сега ти видях решението дори няма смисъл от if else при слагането в map-a.

if (!allDataList.containsKey(team)) {
      allDataList.put(team, new TreeMap<>());
      totalIncome.put(team,0d);
}        
allDataList.get(team).put(name, new ArrayList<>());
allDataList.get(team).get(name).add(Double.parseDouble(matchIs.group(2)));
allDataList.get(team).get(name).add((currPayment * currHours) / 24.0);
totalIncome.put(team, totalIncome.get(team)+((currPayment*currHours)/24.0)*30.0);

иначе е доста добра идеята за array list за 2та признака по които се сортира , аз подходих селската като направих нов мап :D 

0
cone8 avatar cone8 8 Точки

Така, тестовете и авторското решение вече са качени и забелязах нещо много интересно:

  1. В тестовете няма нито една стойност за dailyPayment, която поне малко да се доближава до граничните стойности ("valid daily payment will be a floating number in range [-2^64, 2^64]").
  2. Авторското решение използва тип double за dailyPayment, което при въвеждане на стойности близки до граничните връща резултат който е ужасно неточен (double има точност 16, а резулатата е с над 30 цифри). 2 на 64та е 9223372036854775808, умножете го по 2147483647 и разделете на 24 и ще получите  825293359139279681730467157.333333, изчислено с double това ще върне  825293359139279700000000000.000000. Открийте 10+ разлики.

 

Решението с тип double не е правилно според условието на задачата!

Много ми е любопитно защо трябваше да дават такива стойности и да се налага да се мъчим със BigDecimal, със спецификите на divide метода и закръглянето, като съм сигурен че много от хората на изпита не са били добре запознати с този клас и в лекциите се разглежда съвсем повърхностно. Или това е грешка в условието на задачата. Каквато и да е истината, това е доста некоректно и лично на мен това ми отне много време и нерви, вместо да се концентрирам върху алгоритъма на задачата.

2
13/05/2016 15:24:45
cone8 avatar cone8 8 Точки

Не казвам че не може да се реши с double, а че условието е подвеждащо. Ако се придържаме към него трябва да използваме BigDecimal, за да може да побере евентуално големи входни данни. Или условието е сгрешено, или тестовете не са коректни и са направени така че да минават с мноооого по-малки стойности. Тествай със максимални стойности и виж дали резултатът ще е верен. Пробвай дори само с един ред вход да въведеш 9223372036854775808, което е 2^64  и да видиш какво ще ти изведе. Самия double не може да запази такава стойност, а ще ти смени всяка цифра след 16тата с 0.

0
13/05/2016 16:17:43
kaloyannikov avatar kaloyannikov 531 Точки

Прав си , но за мен е още по-некоректно това , че payment-a и hours-а могат да бъдат негативни , което е абсолютно нелогично , кой работи отриц. часове или надник . Мен това ми коства 20т не е кой зн кво ама все пак.

0
StaVykoV avatar StaVykoV 169 Точки

не би трябвало да гледаш меко казано безсмисления текст когато решаваш задача. Той е сложен за забавление и отпускане. Гледаш си какви са ти входовете и кви изходи искат от тебе и не те интересува логично ли е или не. Все пак изрично пише, от минус еди колко си до плюс еди колко си...също така може да питаш и квестор за възможните входове...

1
cone8 avatar cone8 8 Точки

С опита съм установил, че преди да започнеш да пишеш код е важно да избереш правилно типа данни, които ще  използваш - първо да могат да поберат входните данни и второ да поберат най-голямата (съотв. най-малката за отрицателни стойности) възможна стойност в програмата. Това ти спестява много главоболия, особено когато се наложи да смениш примитивен тип с клас (като BigInteger или BigDecimal) и да правиш многобройни ръчни корекции по кода.

Както и да е, смятам че тази задача е малко над нивото на този курс и тестовете са така направени, че да може да се реши с грешен тип данни.

0
13/05/2016 19:59:01
AntonPortenov avatar AntonPortenov 102 Точки

Напълно съм съгласен с теб. Не е редно да се подават грешни данни.

Също така е редно да не се възползват от това, че са писали тестовете и знаят, че минава с double  а трябва да си предоставят решение отговарящо на constrains.

И ще си позволя да цитирам колегата cone8

Авторското решение използва тип double за dailyPayment, което при въвеждане на стойности близки до граничните връща резултат който е ужасно неточен (double има точност 16, а резулатата е с над 30 цифри). 2 на 64та е 9223372036854775808, умножете го по 2147483647 и разделете на 24 и ще получите  825293359139279681730467157.333333, изчислено с double това ще върне  825293359139279700000000000.000000. Открийте 10+ разлики.

Постоянно ни се повтаря как трябва да се иползва Big Decimal при работа с пари, защото иначе се получават загуби и това води до неточност.

При така зададените стойности, колегите, изготвили въпросната задача показват реално, че какво се говори на лекции и какво се очаква от нас са 2 различни неща.

 

 

И ще бъда благодарен ако някой ме упъти, как да си коригирам закръглянето. Защото при 2 случая в 4 и 5 тест.

 

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

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

http://pastebin.com/gZv57WkQ

0
14/05/2016 13:10:32
AntonPortenov avatar AntonPortenov 102 Точки

Разгледах няколко решения, но ще бъда благодарен ако някой предложи такова, решено с BigDecimal и без да е кастнато към double. И възможно ли е?

Благодаря птедварително

0
AntonPortenov avatar AntonPortenov 102 Точки

Мерси. Видях, че беше го постнал по-рано. Но ти кастваш към double при което се получава загуба.

И все пак би ли ми обяснил защо? Явно при този случай работи, но каква ти е била логиката за да го използваш.

Не ме разбирайте погрешно, опитвам се да разбера, В какъв случай бихме кастнали към double, защото това си е равносилно на използване на double и по какво в условието се разбира това, защото това си е задача за 80/100. Колко от нас на изпит би ни минало през главата да направят подобно нещо?

0
15/05/2016 09:09:16
StaVykoV avatar StaVykoV 169 Точки

Не знам какво имаш предвид, единственото нещо което каствам към double е числото 24, преди да го вкавам в BigDecimal

0
Innos avatar Innos 419 Точки

Интересен въпрос колеги, имах малко време по време на изпита и реших да го запълня като пробвам изпита и аз забелязах идеята за BigDecimal в 4та задача. Тук ще спомена че съм съгласен с идеята че задачата трябва да се реши с BigDecimal за да се спазят constraints-a напълно и резултата е че задачата може да се реши за 100 точки чрез BigDecimal, което лично според мене е правилният начин.
Спрямо въпроса за BigDecimal - да затруднява писането, но не би трябвало да е огромен проблем, като се вземе в предвид че вече най-вероятно сте го използвали на 2ра задача, а и е материал който се изисква за изпита. В крайна сметка ако сте си написали правилно логиката дали сте използвали BigDecimal или double няма да има резултат върху точките Ви, а за хората които са използвали BigDecimal предполагам могат да вземат моралната награда че са си спазили спецификацията дори и да няма тестове за нея.

0
16/05/2016 13:03:10
AntonPortenov avatar AntonPortenov 102 Точки

Благодаря за отговора. Има ли възможност да ни предоставиш твоето решение

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