Menu ≡
kalendar.beda.cz

Výpočet Velikonoční neděle v různých programovacích jazycích

Algoritmus použitý na stránce Výpočet Velikonoční neděle zpracovaný v různých programovacích jazycích

Program v programovacím jazyce Python3 (znak '//' je operátor celočíselného dělení):
#!/usr/bin/python3
# -*- coding: utf8 -*-

def velikonocniNedele(rok):
    if rok <= 1582:
        return "chyba, gregoriánský kalendář začíná až od roku 1583!"
          
    zlateCislo = rok % 19 + 1
    julEpakta = 11 * zlateCislo % 30
    stoleti = rok // 100 + 1
    slunecniOprava = 3 * (stoleti - 16) // 4
    mesicniOprava = 8 * (stoleti - 15) // 25
    epakta = (julEpakta - 10 - slunecniOprava + mesicniOprava) % 30
    tmp = epakta
    if epakta == 24 or (epakta == 25 and zlateCislo > 11):
        tmp += 1 
    if tmp < 24:
        pfm = 44 - tmp
    else:
        pfm = 74 - tmp

    gregOprava = 10 + slunecniOprava
    denTydnePfm = (rok + rok // 4 - gregOprava + pfm) % 7
    velNedele = pfm + 7 - denTydnePfm
    if velNedele < 32:
        return "%d.březen" % velNedele
    else:
        return "%d.duben" % (velNedele - 31)
        
rok = int(input("Zadejte rok: "))
print("Velikonoční neděle: {}".format(velikonocniNedele(rok)))

Program v programovacím jazyce PHP, ten sice obsahuje funkci pro výpočet Velikonoční neděle, easter_date(), ta však pracuje pouze pro roky 1970 až 2037. Pro větší časové rozpětí je vhodnější používat funkci easter_days() nebo tuto:
function velikonocniNedele($rok) {
    if ($rok <= 1582)
        return false;
        
    $zlateCislo = $rok % 19 + 1;
    $julEpakta = 11 * $zlateCislo % 30;
    $stoleti = (int)($rok / 100) + 1;
    $slunecniOprava = (int)(3 * ($stoleti - 16) / 4);
    $mesicniOprava = (int)(8 * ($stoleti - 15) / 25);
    $epakta = ($julEpakta - 10 - $slunecniOprava + $mesicniOprava) % 30;
    if ($epakta < 0)
        $epakta += 30;
    $tmp = $epakta;
    if ($epakta == 24 || ($epakta == 25 && $zlateCislo > 11))
        $tmp += 1;
    if ($tmp < 24)
        $pfm = 44 - $tmp;
    else
        $pfm = 74 - $tmp;
        
    $gregOprava = 10 + $slunecniOprava;
    $denTydnePfm = ($rok + (int)($rok / 4) - $gregOprava + $pfm) % 7;   
    if ($denTydnePfm < 0) $denTydnePfm += 7;
    $velNedele = $pfm + 7 - $denTydnePfm;
    if ($velNedele < 32)
        return $velNedele . ".březen";
    else
        return ($velNedele - 31) . ".duben";
}

Opravdoví počítačoví hackeři použijí kompaktnější program:
echo `date +"%Y"` '[ddsf[lfp[Gregoriansky kalendář začíná až od roku 1583!
]Pq]s@1583>@
ddd19%1+sg100/1+d3*4/12-sx8*5+25/5-sz5*4/lx-10-sdlg11*20+lz+lx-30%
d[30+]s@0>@d[[1+]s@lg11<@]s@25=@d[1+]s@24=@se44le-d[30+]s@21>@dld+7%-7+
[březen ]smd[31-[duben ]sm]s@31<@psnlmPpsn1z>p]splpx' | dc | sed 'N
y/\n/./'

Pokud máte k dispozici program ncal (pro vybrané distribuce Linuxu v balíčku bsdmainutils), máte možnost zjistit datum Velikonoční neděle podstatně jednodušeji (za upozornění děkuji pozornému návštěvníku F.):
$ ncal -e 
March 27 2016

$ ncal -e 1818
March 22 1818
Program ncal toho umí mnohem víc, doporučuji si přečíst manuálové stránky, například zjištění pravoslavné Velikonoční neděle (datum v gregoriánském kalendáři):
$ ncal -o 2015
April 12 2015
A zjištění pravoslavné Velikonoční neděle v juliánském kalendáři:
$ ncal -oJ 2015
March 30 2015
Program zobrazí i datum přechodu na gregoriánský kalendář pro různé země (zobrazuje se poslední juliánský den):
$ ncal -p
 AL Albania        1912-11-30      IT Italy          1582-10-04
 AT Austria        1583-10-05      JP Japan          1918-12-18
 AU Australia      1752-09-02      LI Lithuania      1918-02-01
 BE Belgium        1582-12-14      LN Latin          9999-05-31
 BG Bulgaria       1916-03-18      LU Luxembourg     1582-12-14
 CA Canada         1752-09-02      LV Latvia         1918-02-01
 CH Switzerland    1655-02-28      NL Netherlands    1582-12-14
 CN China          1911-12-18      NO Norway         1700-02-18
 CZ Czech Republic 1584-01-06      PL Poland         1582-10-04
 DE Germany        1700-02-18      PT Portugal       1582-10-04
 DK Denmark        1700-02-18      RO Romania        1919-03-31
 ES Spain          1582-10-04      RU Russia         1918-01-31
 FI Finland        1753-02-17      SI Slovenia       1919-03-04
 FR France         1582-12-09      SW Sweden         1753-02-17
 GB United Kingdom 1752-09-02      TR Turkey         1926-12-18
 GR Greece         1924-03-09     *US United States  1752-09-02
 HU Hungary        1587-10-21      YU Yugoslavia     1919-03-04
 IS Iceland        1700-11-16

Další informace:

Kalendáře Helma - nástěnný, stolní i pracovní kalendář Diáře Helma - diář a zápisník
Válka na Ukrajině: 1002.den
Nahoru