00000001 - Jednoduchá kalkulačka
00000010 - Odebírání zápalek
00000100 - Gregoriánský kalendář
00001000 - Hádání kombinace
00010000 - Vigenérova šifra
00100000 - Hledání min
01000000 - Házení kostkou
10000000 - Conway's Game of Life
Další měsíc utekl jako voda, nezadržitelně se na nás řítí konec starého roku a začátek nového, takže přišel čas položit si otázku:
A co je vlastně za den?
No přece první neděle v měsíci, takže je právě ta správná chvíle roztočit další kolo hry, tentokrát bit 00000100. A aby se nám ty neděle nepopletly, bude tentokrát úkolem naprogramovat kalendář. Ale ne jen tak nějaký obyčejný, měl by zvládat celkem tři funkce:
- Ta nejdůležitější funkce samozřejmě je vypočítat a přehledně zobrazit kalendář na zadaný rok, například ho vypsat do tabulky zformátované podle měsíců a dní v týdnu, asi jako na kapesním kalendáříku.
- Pro zadaný datum zjistit kolikátý den v roce to je. Například 1.1.2016 je v pořadí 1. den, a 31.12.2016 zase 366..
- Pro dvě zadaná data spočítat kolik dní mezi nimi uplynulo, například od vyhlášení minulého kola dodnes.
Všechny údaje platí pro Gregoriánský kalendář, který většina evropských zemí přijala na konci šestnáctého století, takže pro jednoduchost stačí počítat až od roku 1600 a ty dřívější odmítnout jako chybu. Přepočítáváním na Juliánský nebo nějaký jiný starší kalendář se zabývat nebudeme, to by už byla příliš složitá matematika.
Na závěr ještě poznámka k přestupným rokům, to jsou ty dělitelné čtyřmi, s výjimkou staletí nedělitelných čtyřmi sty. Proto roky 1600 a 2000 byly přestupné, zatímco roky 1700, 1800 a 1900 nebyly, a rok 2100 také nebude, teprve až 2400.
Jako příklad jednoho z možných zobrazení dám výstup linuxového programu cal, který pro letošní rok vypíše tohle:
Kód: Vybrat vše
2015
leden únor březen
Po Út St Čt Pá So Ne Po Út St Čt Pá So Ne Po Út St Čt Pá So Ne
1 2 3 4 1 1
5 6 7 8 9 10 11 2 3 4 5 6 7 8 2 3 4 5 6 7 8
12 13 14 15 16 17 18 9 10 11 12 13 14 15 9 10 11 12 13 14 15
19 20 21 22 23 24 25 16 17 18 19 20 21 22 16 17 18 19 20 21 22
26 27 28 29 30 31 23 24 25 26 27 28 23 24 25 26 27 28 29
30 31
duben květen červen
Po Út St Čt Pá So Ne Po Út St Čt Pá So Ne Po Út St Čt Pá So Ne
1 2 3 4 5 1 2 3 1 2 3 4 5 6 7
6 7 8 9 10 11 12 4 5 6 7 8 9 10 8 9 10 11 12 13 14
13 14 15 16 17 18 19 11 12 13 14 15 16 17 15 16 17 18 19 20 21
20 21 22 23 24 25 26 18 19 20 21 22 23 24 22 23 24 25 26 27 28
27 28 29 30 25 26 27 28 29 30 31 29 30
červenec srpen září
Po Út St Čt Pá So Ne Po Út St Čt Pá So Ne Po Út St Čt Pá So Ne
1 2 3 4 5 1 2 1 2 3 4 5 6
6 7 8 9 10 11 12 3 4 5 6 7 8 9 7 8 9 10 11 12 13
13 14 15 16 17 18 19 10 11 12 13 14 15 16 14 15 16 17 18 19 20
20 21 22 23 24 25 26 17 18 19 20 21 22 23 21 22 23 24 25 26 27
27 28 29 30 31 24 25 26 27 28 29 30 28 29 30
31
říjen listopad prosinec
Po Út St Čt Pá So Ne Po Út St Čt Pá So Ne Po Út St Čt Pá So Ne
1 2 3 4 1 1 2 3 4 5 6
5 6 7 8 9 10 11 2 3 4 5 6 7 8 7 8 9 10 11 12 13
12 13 14 15 16 17 18 9 10 11 12 13 14 15 14 15 16 17 18 19 20
19 20 21 22 23 24 25 16 17 18 19 20 21 22 21 22 23 24 25 26 27
26 27 28 29 30 31 23 24 25 26 27 28 29 28 29 30 31