“Как се смяташе дали една година е високосна?” попита колежката от съседното бюро вчера.
И понеже Java-рите са(сме) глезени с java.util.GregorianCalender.isLeapYear(year), а колежката трябва да напише проверката на един оракулски скриптов език, на който такава нещо няма, започна едно чудене… каква точно беше врътката през 100 и през 400 години.
Универсалният източник на знание казва:
От въвеждането на григорианския календар:
* годините, кратни на 4 са високосни, останалите не са;
* изключение 1: годините, кратни на 100 не са високосни;
* изключение 2: годините, кратни на 400 са високосни.
Сега се чудя дали да се опитам да навия колежката да предизвика едно голямо мигащо WTF в главата на всеки, който попадне на тази проверка, като напише нещо такова:
<@dynamichtml is_leap_year@>
<$if ((year % 16 == 0) or ((year % 4 == 0) and (year % 100 != 0)))$>
<$isLeap = 1$>
<$else$>
<$isLeap = 0$>
<@end@>
P.S. Но най-вероятно ще си останем с доста по-разбираемия вариант
if (year % 400 == 0 || ( year % 4 == 0 && year % 100 != 0 ))
И без това езика е достатъчно странно изглеждащ и повечето хора не знаят пълното условие за високосни години, че да ги скандализираме с това 16 вместо 400 :-)















Всеки език трябва да има стандартна lib функция за работа с дати. Това е нещото, дето хората постоянно бъркат, просто няма причина да не се реализира директно и да се ползва.
на тоя език да вземеш въведената година си е истинско приключение… да не говорим за по-нататък :)
Нещо бъркаш, че годините кратни на 100 и 400 не са високосни. Сигурна ли си, че това е актуално. Защото датата 29 февруари 2000 г. съществува в календара.
Примери:
http://www.constcourt.bg/Pages/Document/default.aspx?ID=532
http://paper.standartnews.com/archive/2000/02/29/index.htm
Windows Date&Time :)
@Бамсе: прочети пак условието, тези които са кратни на 400 са високосни, а тези, които са кратни на 100, но не и на 400 не сa високосни. Затова и 2000 е високосна а 1900 не е :)
Последното обяснение е по-скоро объркващо, отколкото разясняващо. За мен си е направо грешно…
@Дамян: помисли малко и прочети линка от wikipedia :)
Не коментирам статията, тя е ясна. Включително и wtf-кода.
” тези които са кратни на 100 са високосни, а тези, които са кратни на 100, но не и на 400 не сa високосни”. Логически грешно.
@Дамян: ауч… печатна грешка… мерси за забележката, сега ще го поправя
if (year % 100 == 0) {
year /= 100;
}
return year % 4 == 0;
Ето една имплементация, която:
1) дава по-ясната(според мен) дефиниция на “високосна година” :
“Високосна е тази година, която се дели на 4.
Изключение правят само годините, които се делят на 100 – при тях
за делимост на 4 проверяване не самата година, а годината
разделена на 100″.
2) в общия случай (99% от годините не се делят на 100) извършва
само две операции по целочислено делене вместо три.