feb29“Как се смяташе дали една година е високосна?” попита колежката от съседното бюро вчера.

И понеже 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 :-)

9 Responses to “Високосни години”

  1. Всеки език трябва да има стандартна lib функция за работа с дати. Това е нещото, дето хората постоянно бъркат, просто няма причина да не се реализира директно и да се ползва.

  2. на тоя език да вземеш въведената година си е истинско приключение… да не говорим за по-нататък :)

  3. Нещо бъркаш, че годините кратни на 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 :)

  4. @Бамсе: прочети пак условието, тези които са кратни на 400 са високосни, а тези, които са кратни на 100, но не и на 400 не сa високосни. Затова и 2000 е високосна а 1900 не е :)

  5. Последното обяснение е по-скоро объркващо, отколкото разясняващо. За мен си е направо грешно…

  6. @Дамян: помисли малко и прочети линка от wikipedia :)

  7. Не коментирам статията, тя е ясна. Включително и wtf-кода.
    ” тези които са кратни на 100 са високосни, а тези, които са кратни на 100, но не и на 400 не сa високосни”. Логически грешно.

  8. @Дамян: ауч… печатна грешка… мерси за забележката, сега ще го поправя

  9. if (year % 100 == 0) {
    year /= 100;
    }

    return year % 4 == 0;

    Ето една имплементация, която:

    1) дава по-ясната(според мен) дефиниция на “високосна година” :
    “Високосна е тази година, която се дели на 4.
    Изключение правят само годините, които се делят на 100 – при тях
    за делимост на 4 проверяване не самата година, а годината
    разделена на 100″.

    2) в общия случай (99% от годините не се делят на 100) извършва
    само две операции по целочислено делене вместо три.

Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Spam Protection by WP-SpamFree

© 2013 iffi Suffusion theme by Sayontan Sinha