Po drátě 5: Řešení úlohy č. 13

V archivu feast.tar.gz se nachází crontab, skript jménem celebrate a několik souborů podivných jmen a ještě podivnějšího obsahu.

Crontab v různé podezřelé dny a hodiny spouští ještě podezřelejší příkazy, které nějak manipulují s dodanými soubory. A když se ve 12:00 stane, že dva ze souborů obsahují totéž, zavolá skript celebrate. Ten pak zkontroluje, jestli je 24. března, a pokud ano, tak pošle mail s předmětem 14:YYYYMMDD našemu robůtkovi. Jen najít ten správný rok…

Kdo si příkazy pozorně prohlédl, zjistil, že vykonávají všelijaké zajímavé operace s čísly kódovanými do délek souborů. A mezi těmi operacemi se podezřele často počítá modulo 7 a 19, což jsou velmi typické ingredience v algoritmech na výpočet data Velikonoční neděle.

Stačí tedy najít nejbližší rok, kdy Velikonoční neděle nastane 24. března. To je překvapivě až v roce 2391, takže bylo program, který na začátku hlásal "FIXME: Works only for 2001-2099. Fix before shipping!" ještě opravit nebo použít jiný algoritmus.

Jenže… do úlohy se nám vloudila malá, nicméně ošklivá chyba. Omylem jsme prohodili počty minut u dvou pravidel, takže se vykonávala v opačném pořadí, než jsme čekali (a než dva naše simulátory cronu postižené jinou chybou spočetly). A program pak místo Velikonočních nedělí počítal Velikonoční pondělky. Tím jsme řešitele dosti zmátli, ale naštěstí nezklamali a úlohu dokázali vyřešit i přes tento problém (v čemž dosti pomohla nápověda).

Velice se za problém omlouváme, příště nastane až v roce 2391 :-). Kdybyste si chtěli úlohu vyluštit sami, prohoďte v crontabu minuty u pravidel, která se spouštějí ve 12 hodin.

Zajímavosti

Původně jsme měli v plánu vytvořit jednoduchou crontabovou úlohu jako vedlejší (a proto se do verze skriptu, kterou potkalo prvních pár účastníků, vloudilo 50: místo 14:). Tak jsme přemýšleli, co pěkného by se dalo cronem počítat. A když jsme přišli na to, že i Velikonoce, prostě nešlo odolat.

Použitý algoritmus vychází z klasického Oudinova algoritmu (popsaného například v Calendar FAQ, což je skvělý zdroj všech informací o kalednářích mnoha kultur). Jen jsme algoritmus dosti upravili, aby se lépe hodil pro kontinuální počítání, a také vypustili části závislé na století a nahradili je konstantami.

Autory úlohy jsou Anička Bernáthová a Martin Mareš.