Домашно за методи - задача 10. DateModifier - Софтуерен университет

Домашно за методи - задача 10. DateModifier - Софтуерен университет

+ Нов въпрос
nick.genov avatar nick.genov 103 Точки

Домашно за методи - задача 10. DateModifier

Здравейте.

Някой успя ли да получи 100 точки на задача 10 - DateModifier от домашното за методи?

https://judge.softuni.bg/Contests/222/Methods

Решението ми получава 57 точки, а виждам, че и доста други колеги са получили толкова. Пробвах два варианта за изчисляване на разликата - с TimeSpan и с изваждане на датите. Не виждам какво може да се обърка.

Това е решението ми:

http://pastebin.com/PCgQ7w0g


Идеи?

Тагове:
0
C# OOP Basics
vancho avatar vancho 429 Точки

А защо не връщаш long?

-1
26/06/2016 23:00:37
aababy avatar aababy 14 Точки

Най-вероятно long е добра идея, но мисля, че има и друг проблем.

Например при ZeroTest № 1 отговорът е 8782. Аз получавам 8783. Твоят отговор на този тест също е 8783.

Пробвах два Date Calculator-а в интернет и в двата получавам отговор 8783:

http://www.timeanddate.com/date/durationresult.html?d1=31&m1=5&y1=1992&d2=17&m2=6&y2=2016

http://www.calculator.net/date-calculator.html?today=05%2F31%2F1992&ageat=06%2F17%2F2016&calctype=diff&x=46&y=15

 

А може би вече си намерил вярното решение? Дай едно рамо, ако е така :)

 

Ето го и моя код:

http://pastebin.com/u3qvaU2w

0
nick.genov avatar nick.genov 103 Точки

Не съм, боря другите задачи, че няма време :)

0
petar.dimitrov.86 avatar petar.dimitrov.86 450 Точки

На упражненията бяха споменали, че няма как да се вземат 100 точки за C# тъй като задачата е направена за Java и там месеците били почвали от 0 вместо от 1... Казаха, че ще оправят тестовете по някое време, така че ще чакаме :)

0
kosio197 avatar kosio197 104 Точки

Абе не знам колко е писана за Java, защото и при мен е същата история. Първия тест ми връща 8783. Ползвам TimeUnit.DAYS.convert за конвертиране и java.util.Date за да взема милисекундите. Много ми се иска да видя авторско решение. Започвам да мисля, че за тестовете не са ползване стандартни класове, а някакви сметки и съответно закръгляване.

0
svetljo avatar svetljo 27 Точки

Здравей,

ето код на Java за 100 точки: http://pastebin.com/Pv6TdFME

Аз също получавам 57 на C#. Разликите в датите между C# и кода от judge е повече от няколко дни за повечето тестове. Явно смятането на броя дни между две дати принципно не е тривиална задача.

1
07/07/2016 16:10:47
kosio197 avatar kosio197 104 Точки

Привет,

Мерси, дава 100 точки. Тествах Date.getTime() и твоето с Calendar.getTime().getTime() с едни и същи дати и наистина разликата, която дава в милисекундите е голяма:

кода:

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy MM dd");
        String firstName = "1992 05 31";
        Calendar c = Calendar.getInstance();
        c.set(Integer.valueOf(firstDate.split("\\s+")[0]), Integer.valueOf(firstDate.split("\\s+")[1]),         Integer.valueOf(firstDate.split("\\s+")[2]));
        System.out.println(sdf.parse(firstDate).getTime());
        System.out.println(c.getTimeInMillis());

и резултата:

707259600000
709999012669

Търсих някакво обяснение за това в нета, но не намерих. Видях, че Date има доста деприкейтнати методи и не се препоръчва за сложни сметки, но пък пише, че getTime() и toString() могат да се ползват спокойно (единствените не деприкейтнати). Тоест не намирам логична причина за тази разлика. Някой може ли да обясни/даде линк към документация ... ?

 


 

0
nick.genov avatar nick.genov 103 Точки

Току-що пробвах твоя код и даде 42 точки :)

 

0
svetljo avatar svetljo 27 Точки

Хм. Ако идеш на Java OOP курса и го пуснеш от там дава повече. Явно са различни тестовете... Ще ми се да видя код на C#. 

0
jicata avatar jicata Trainer 7 Точки

Здрасти.

10та задача е малко по-специална от другите поради факта, че се върти около DateTime. Датите и времето като цяло са малко проблематични концепции не само в програмирането и е много лесно да се получат разминавания. Сигурно сте забелязали, че първия zero test не минава съвсем, докато пък втория минава без засечка. Причините за това са редица като на пример разминаването на в календарите които се ползват. Дифолтния календар в .NET  е вързан към дифолтната култура и изглежда това резултира в ползване на Грегорианския което съотвено създава проблеми при пресмятане на дати които са преди въвеждането на Грегорианския а и дори след това. Като цяло е манджа с грозде що опре до дати. За повече инфо може да зачетете ето този пост от блога на Jon Skeet относно аритметика свързана с дати

Иначе конкретно за задачката, тестовете са проблема, не решенията ви. Мислехме да ги оправим още като видяхме проблема но така и не го направихме тогава, което е наша грешка. Вече тестовете са оправени (т.е датите които ползваме са по-близки една до друга и същеременно до днешната) и всичко трябва да е ОК.

TL;DR

DateTime е пипкава работа. Решенията ви не са грешни. Тестовете бяха объркани, вече са оправени. Ретест за 100/100.

 

Cheers

1
08/07/2016 18:04:05