Zadání soutěžních úloh

Kategorie programování žáci a mládež

22. dubna 2021

Soutěž v programování – 34. ročník

Krajské kolo 2020/2021

Hrátky s čísly
Semafor
Hash
Hra 2048

Úlohy můžete řešit v libovolném pořadí a samozřejmě je nemusíte vyřešit všechny. Za každou úlohu můžete dostat maximálně 10 bodů, z nichž je většinou 9 bodů vyhrazeno na ohodnocení funkčnosti programu, jeho shody se zadáním a efektivity a jeden bod na dokumentaci a přehlednost zdrojového kódu (vhodné členění zdrojového kódu, vhodně zvolené názvy identifikátorů, komentáře na místech, kde je to potřeba, atd.). Body získané za každou úlohu se ještě násobí koeficientem, který odráží složitost úlohy.

Na řešení úloh máte 4 hodiny čistého času.

Vaše řešení nahrávejte do cloudu přístupného na adrese https://svp.proed.cz/

Přihlašovací jméno a heslo jste dostali emailem. Po přihlášení uvidíte složku odpovídající vašemu přihlašovacímu jménu (např. X123) a do ní řešení uložte. Pokud je řešení jedné úlohy složeno z více souborů, doporučujeme je nenahrávat samostatně, ale jako jeden ZIP archiv, jehož jméno odpovídá názvu úlohy (uloha-xyz.zip).

Vaše řešení musíte nahrát do 13:00, pozdější nahrání souborů nebude možné. Doporučujeme proto řešení nahrát s několikaminutovou rezervou. Pokud ve vaší kategorii řešíte více úloh, je vhodné každou úlohu nahrát hned, jak ji dokončíte.

Nahrávejte jak zdrojové kódy vašeho řešení, tak zkompilované spustitelné soubory (pokud to ve vámi používaném programovacím jazyce dává smysl).


Hrátky s čísly

Koeficient 1

Číselná řada

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
49505152535455565758596061626364656667686970717273747576777879808182838485868788899091
9293949596979899100

vznikne vypsáním všech přirozených čísel.

Vypracujte program, který pro z klávesnice zadávaná n (maximálně desetimístná čísla) vypíše do jedné vteřiny číslici z n-tého místa této řady a číslo, v kterém se číslice nachází.

Program se ukončí zadáním 0 pro n.

Například pro:

n=10         vypíše: číslice 1 z čísla 10
n=100        vypíše: číslice 5 z čísla 55
n=999        vypíše: číslice 9 z čísla 369
n=9000       vypíše: číslice 2 z čísla 2527
n=12345      vypíše: číslice 3 z čísla 3363
n=99999      vypíše: číslice 1 z čísla 22221
n=0          vypíše: KONEC a program se ukončí

Semafor

Koeficient 1

Semafor pro automobily jistě znáte. Vaším úkolem je vytvořit program, který bude takový semafor zobrazovat, a to jako obdélník, který obsahuje nad sebou tři barevná kruhová světla — shora postupně červené, oranžové a zelené. Zhasnuté světlo zobrazte buď černou barvou, nebo velmi tmavou červenou/oranžovou/zelenou (s malým jasem). Rozsvícené světlo naopak zobrazujte s plným jasem.

Po startu programu bude na 5 sekund svítit zelené světlo, pak tři vteřiny svítí oranžové světlo, následně bude 5 sekund svítit červená, pak jednu sekundu červená a oranžová zároveň a následně se celý cyklus opakuje (5 sekund zelená …). Tedy stejně jako na skutečném semaforu, jen čas pro červený a zelený signál jsme v zadání trochu zkrátili.


Hash

Koeficient 2

Napište program pro stanovení digitálního otisku všech souborů v zadaném adresáři.

Pokud nevíte, co je to digitální otisk (hash), přečtěte si např. https://cs.wikipedia.org/wiki/Hašovací_funkce

Postup pro stanovení digitálního otisku

Vstupní soubor je textový sobor a obsahuje hexadecimální číslice, tedy znaky 09 a AF a af. Může obsahovat i znaky jiné (například znaky nového řádku, mezery, aj.) – ty ignorujte/přeskakujte.

Sečtěte všechny hexadecimální číslice v souboru (součet je opět v hexadecimálním tvaru). Pokud má výsledný součet více než jednu číslici, postup opakujte na výsledném součtu.

Výsledná číslice je digitálním otiskem daného souboru.

Příklad

Obsah souboru:

EFBB BF 48 61  73 682031

Postup

Sčítáme šestnáctkově postupně číslice E, F, B, B, atd., až 0, 3, 1. Výsledek = 7E má více než jednu číslici.
Sečteme tedy číslice 7 a E. Výsledek = 15 má více než jednu číslici.
Sečteme tedy číslice 1 a 5. Výsledek = 6 má jednu číslici. Je tedy digitálním otiskem.

Požadavky na program

V adresáři hash najdete několik menších testovacích souborů. V názvu souboru je v závorce hodnota digitálního otisku tohoto souboru. Pokud váš program chcete otestovat i na větších souborech, můžete si je stáhnout z následující adresy https://name.vse.cz/kosek/soutez/hash-soutezici-data.zip (soubor má velikost cca 600 MB).


Hra 2048

Koeficient 3

Naprogramujte hru 2048.

Pravidla hry

Hra 2048 se hraje na hracím plánu, který je tvořen 4×4 čtvercovými políčky. Na čtvercových políčkách mohou být dlaždice s čísly, jejichž hodnoty jsou mocniny 2 – od 2 až do 2048 (211).

V každém tahu se určí směr posunu dlaždic (nahoru, dolů, doleva, doprava).

Konečná pozice a sloučení dlaždic na konci tahu je dáno následujícími pravidly:

Po každém tahu se náhodně na některém z volných čtverců vygeneruje nová dlaždice s číslem 2 nebo 4. Zda je to 2 nebo 4 je také náhodné.

Ukázka základního pohybu
Spojování více dlaždic v jednom řádku

Posun dlaždic lze provést buď

Na začátku hry se vygenerují na náhodných pozicích dvě dlaždice s hodnotou 2.

Cíl hry

Cílem hry je posunovat dlaždice po hracím plánu tak, aby vznikla dlaždice s číslem 2048. V tomto případě hra končí výhrou.

Pokud nelze provést tah (tj. neexistuje žádný směr posunu, při kterém by se mohla posunout aspoň jedna dlaždice), hra končí prohrou.

Skóre hry je dáno celkovým součtem čísel na všech dlaždicích.

Jak hra funguje si můžete vyzkoušet na následující adrese https://2048game.com/.

Úkoly

  1. Nakreslete hrací plán a vygenerujte první dvě dlaždice.
  2. Určení směru posunu dlaždic zajistěte pomocí klávesových šipek.
  3. Určení směru posunu dlaždic zajistěte pomocí 4 tlačítek Nahoru, Dolů, Vlevo a Vpravo.
  4. Určení směru posunu dlaždic zajistěte pomocí tažení myši (levé tlačítko), podle toho, zda je delší vodorovný nebo svislý směr.
  5. Průběžně zobrazujte stav skóre.
  6. Udělejte animaci posunu dlaždic.
  7. Umožněte uložit aktuální stav hry do souboru (formát je popsán dále).
  8. Umožněte načit aktuální stav hry ze souboru. Výběr souboru by měl probíhat způsobem obvyklým v použitém operačním systému – např. pomocí dialogového okna pro výběr souboru.
  9. Program dokáže poznat konec hry (výhru i prohru) a zobrazte tento stav.
  10. Umožněte vrátit 5 tahů zpět.
  11. Umožněte přehrát celou hru ze záznamu a zadat délku pauzy mezi jednotlivými tahy. Funkci přehrání je možné vyvolat i v průběhu hry.

Formát souboru se stavem hry

Stav hry se reprezentuje jako textový soubor se čtyřmi řádky. Na každém řádku jsou čtyři čísla oddělená čárkou. Pole bez dlaždice je označeno hodnotou 0.

Jako oddělovač řádků se používá dvojice znaků CR a LF.