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 1818Program
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 2015A zjištění pravoslavné Velikonoční neděle v juliánském kalendáři:
$ ncal -oJ 2015 March 30 2015Program 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