Soutěž v programování – 34. ročník
Krajské kolo 2020/2021
Ú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).
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čí
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.
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
Vstupní soubor je textový sobor a obsahuje hexadecimální číslice, tedy znaky 0
až 9
a A
až F
a a
až f
. 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.
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řadové_číslo digitální_otisk název_souboru
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).
Koeficient 3
Naprogramujte hru 2048.
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é.
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í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/.
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.