Soutěž v programování – 31. ročník
Krajské kolo 2016/2017
Koeficient 1
Prohlédněte si prosím animaci v přiloženém souboru
prase.html
. Vaším úkolem je
napsat program, který zobrazí obdobný výsledek. Nejvíce bodů získáte,
pokud provedete plynulou animaci vykreslování čar (za stejný čas se
vždy vykreslí stejná délka čáry). Pozornost věnujte i postupnému
vykreslení oka a ocásku, u nich se hodnotí kulatost jak oka, tak
ocásku a u ocásku také shoda s předlohou (správný směr zakroucení,
stoupání spirály, počet otáček).
Pokud je celé zadání nad vaše síly, můžete zpracovat jednodušší variantu – animovat postupně po automaticky spouštěných krocích, kdy krokem je zobrazení jedné celé čáry, a pak celého oka a celého ocásku. Několik málo bodů dostanete i v případě, že program celé prasátko nakreslí najednou.
Body dostanete i za to, že v průběhu animace okno vašeho
programu nevytuhne
a lze s ním např. pohybovat.
Je zakázáno využívat zdrojový kód vzorového řešení a obrázek prasátka ze zadání. Nebudou také hodnoceny programy zobrazující předpřipravené obrázkové soubory.
Pokud budete mít problém se zobrazením vzorové animace, můžete vyjít z přiloženého obrázku a následujícího popisu: Animace začíná vykreslením čáry za hlavou prasátka shora dolů, následuje spodní hrana těla, zadní hrana a pak hrana horní. Následně dvě čáry hlavy od té horní (začíná shora), přední nohy, zadní nohy, oko a nakonec ocásek. Nohy a ocásek se vždy začínají kreslit na straně blíže k tělu. Pokud na sebe dvě čáry navazují (tělo, hlava), začíná se ta druhá kreslit ve směru od té první.
Pokud jsou použity předpřipravené obrázkové soubory, tak úlohu nehodnotíme (získá 0 bodů).
Body | Za co |
---|---|
0.5 | zobrazí obrázek, minimálně tělo a hlavu |
0.5 | zobrazí oko |
0.5 | zobrazí ocásek |
1.0 | oko není zubaté (je vykreslené jako kružnice) |
1.0 | ocásek není zubatý (viditelně tvořený z čar) |
1.0 | ocásek odpovídá předloze |
1.0 | existuje animace (po krocích nebo plynulá) |
2.5 | animace je plynulá (při viditelném zpomalené/zrychlení animace u kratších prvků ubrat jeden bod) |
1.0 | během animace okno nevytuhne (a pokud animace vůbec není, bod také neudělujeme) |
1.0 | dokumentace a přehlednost zdrojového kódu |
Koeficient 3
Zdědili jste po svém pradědečkovi luxusní automobil Škoda 1203. Poté, co jste spatřili své dědictví, které jste ušlechtile nazvali dvanáct set troska, rozhodli jste se ho odvézt zhodnotit na skládku. Po cestě se stala ale nemilá věc – zasekl se vám volant a nejde otočit doleva, můžete tedy na křižovatkách jezdit jen rovně nebo zatáčet doprava! Vaším úkolem je s takto poškozeným vozem najít co nejkratší cestu na skládku, aby se vám náhodou po cestě nerozbilo ještě něco.
Napište program, který na vstupu dostane mapu města, výchozí pozici dvanáct set trosky a pozici skládky, a najde nejkratší cestu dvanáct set troskou na skládku tak, aby na každé křižovatce jela buď rovně nebo zahla doprava. Vypište délku nejkratší cesty a interaktivně nalezenou cestu zobrazte.
Vstup načtěte ze souboru mesto.txt
. Tento soubor obsahuje
mapu města, což je čtverečková síť o rozměrech 100×100 políček.
Mapa města je uložena na 100 řádcích s tím, že každý řádek je ukončený znaky
CR
a LF
a obsahuje (kromě znaků ukončení řádku)
přesně 100 znaků – jednotlivá políčka tohoto řádku mapy města. Znaky
v souboru mohou být následovné:
.
silnice (průjezdné pole)
X
budova (neprůjezdné pole)
@
skládka
%
dvanáct set troska
Můžete předpokládat, že soubor je vždy v pořádku, obsahuje právě jednu skládku a právě jednu dvanáct set trosku. Navíc počáteční pozice dvanáct set trosky sousedí s právě jednou silnicí – předpokládejte tedy, že dvanáct set troska je na začátku natočena směrem k této silnici.
Pro daný soubor najděte nejkratší cestu dvanáct set trosky na skládku tak, aby dvanáct set troska jela jen po silnici a zatáčela jen doprava (tj. pokud z nějakého směru přijede na políčko silnice, může buď pokračovat rovně, nebo zatočit o 90° doprava). Můžete předpokládat, že taková cesta vždy existuje. Pokud jich existuje více, najděte libovolnou z nich.
Až cestu naleznete, vypište její délku – počet políček, které na cestě navštívíte, včetně políčka skládky. Pokud nějaké políčko navštívíte vícekrát, počítejte ho vícekrát. Poté nalezenou cestu interaktivně zobrazte – umožněte jednak vykreslení kompletní cesty, a jednak krokování jednotlivých políček cesty.
Pro následující mapu města (pro názornost je zobrazený jen její levý
horní roh o velikosti 7×7, všechna ostatní nezobrazená políčka jsou
X
):
XXXXXXX ....... .X.X.X. ....... .X.X.X. .X@X%X. XXXXXXX
je nejkratší cesta na skládku dlouhá 22 políček. Kdyby bylo možné zatáčet doleva, byla by nejkratší cesta dlouhá 6 políček. Nejkratší správná cesta je zobrazena na následující mapě:
XXXXXXX ┌─┐.┌─┐ │X│X│X│ └─┼─┼─┘ .X│X│X. .X@X%X. XXXXXXX
Program soutěžících se vyhodnotí na devíti vstupních souborech
mesto1.txt
až mesto9.txt
, za každý dostane
soutěžící 0 až 1 bod.
Při vyhodnocování souboru mestoN.txt
zkopírujte tento
soubor do adresáře s programem soutěžícího a přejmenujte ho na
mesto.txt
. Program soutěžícího spusťte a pokud to program
vyžaduje, vyberte soubor mesto.txt
. Program musí nalézt
nejkratší cestu do pěti vteřin. Pokud program v limitu vypsal správnou
délku nejkratší cesty, dostane 0.5 bodu. V případě vypsání správné délky
nejkratší cesty dostane dalších až 0.5 bodu za interaktivní zobrazení
nejkratší cesty dle hodnocení poroty, s tím, že plný počet bodů by
mělo dostat řešení, které zobrazuje jak kompletní cestu, tak umožňuje
pohodlné krokování políček cesty tam i zpět. Pokud je zobrazená cesta
zjevně nekorektní, řešení dostane za interaktivní zobrazení 0 bodů.
Body | Za co |
---|---|
0.5 | Program v limitu vypíše délku nejkratší cesty 50 pro soubor mesto1.txt |
0.5 | Program v limitu vypíše délku nejkratší cesty 68 pro soubor mesto2.txt |
0.5 | Program v limitu vypíše délku nejkratší cesty 1274 pro soubor mesto3.txt |
0.5 | Program v limitu vypíše délku nejkratší cesty 206 pro soubor mesto4.txt |
0.5 | Program v limitu vypíše délku nejkratší cesty 292 pro soubor mesto5.txt |
0.5 | Program v limitu vypíše délku nejkratší cesty 5049 pro soubor mesto6.txt |
0.5 | Program v limitu vypíše délku nejkratší cesty 516 pro soubor mesto7.txt |
0.5 | Program v limitu vypíše délku nejkratší cesty 680 pro soubor mesto8.txt |
0.5 | Program v limitu vypíše délku nejkratší cesty 670 pro soubor mesto9.txt |
až 0.5 | Program interaktivně zobrazí nejkratší cestu pro soubor mesto1.txt |
až 0.5 | Program interaktivně zobrazí nejkratší cestu pro soubor mesto2.txt |
až 0.5 | Program interaktivně zobrazí nejkratší cestu pro soubor mesto3.txt |
až 0.5 | Program interaktivně zobrazí nejkratší cestu pro soubor mesto4.txt |
až 0.5 | Program interaktivně zobrazí nejkratší cestu pro soubor mesto5.txt |
až 0.5 | Program interaktivně zobrazí nejkratší cestu pro soubor mesto6.txt |
až 0.5 | Program interaktivně zobrazí nejkratší cestu pro soubor mesto7.txt |
až 0.5 | Program interaktivně zobrazí nejkratší cestu pro soubor mesto8.txt |
až 0.5 | Program interaktivně zobrazí nejkratší cestu pro soubor mesto9.txt |
až 1 | dokumentace, komentáře, přehlednost, výstižné názvy proměnných, … |
Koeficient 2
Enigma byl šifrovací přístroj, používaný za druhé světové války. Tento šifrovací stroj uměl šifrovat vstupní text pomocí šifrování jednotlivých znaků vstupního textu na jiné znaky výstupního textu.
Celkový proces šifrování strojem Enigma spočíval v postupném šifrování jednoho znaku průchodem přes několik šifrovacích tabulek, což mohlo vypadat např. následovně:
E → B → I → S → M → K → J → T N → P → U → J → R → Q → R → X I → E → J → B → O → X → L → W G → C → P → D → Z → G → M → Y M → F → Y → P → G → D → X → S A → G → L → W → C → E → K → V
Celkově ENIGMA → TXWYSV
První sloupec→poslední sloupec
Vaším úkolem je napsat program, který bude simulovat činnost šifrovacího stroje Enigma.
Šifrují se pouze velká písmena anglické abecedy.
Máme několik šifrovacích tabulek ve tvaru 26 dvojic velkých písmen
anglické abecedy A
až Z
oddělených čárkou („bílé“ znaky
ignorujte). Každé písmeno abecedy je v tabulce obsaženo právě
dvakrát. Jednou je ve dvojici vlevo, jednou vpravo. Například:
EK, JF, TE, DA, BX, LO, AP, CJ, KG, SL, RI, UZ, QD, OB, IV, XQ, GN, NT, HU, PR, YW, MC, VM, ZY, WS, FH
Při šifrování se znak A
změní na P
, B
na X
atd., až Z
na Y
.
Vstupem programu jsou textové soubory, jednotlivé řádky jsou
odděleny znaky CR LF
, vstupní kódování je
ASCII. Výstupem programu je výpis zašifrovaného textu na
obrazovku.
Postupně v programu naimplementujte následující funkce:
První řádka vstupního souboru obsahuje jména použitých šifrovacích tabulek. Jména jsou oddělena čárkou, bílé znaky se ignorují.
Například při nastavení ve tvaru
I.A, II.A, III.A, P1.AB, III.B, II.B, I.B
budou pro šifrování postupně použity šifrovací tabulky ze souborů
I.A
, II.A
, … a jako poslední ze souboru I.B
.
Další řádky vstupního souboru obsahují text zprávy určený k zašifrování psaný velkými písmeny anglické abecedy. Mezery se přenášejí beze změny.
Po načtení nastavení šifrování program toto nastavení (obsah první
řádky vstupního souboru) vypíše. Následovně bude vstupní soubor po
řádkách šifrovat. Pro každou řádku vstupního souboru program vypíše
dvě řádky – první řádka bude obsahovat originální text a druhá
zašifrovaný text. Nezašifrovaný řádek začíná textem
VSTUP=
a zašifrovaný textem VYSTUP=
.
V ukázkovém adresáři máte kromě šifrovacích tabulek i několik
vzorových datových souborů VZORx.DAT
.
Například pro soubor VZOR6.DAT
:
I.A, UKWB.A, I.B SKAKAL PES PRES OVES IMNMNW RHI RPHI FJHI RPHI YHWHAFB WFBMB
by měl výtup programu vypadat takto:
I.A, UKWB.A, I.B VSTUP=SKAKAL PES PRES OVES VYSTUP=IMNMNW RHI RPHI FJHI VSTUP=IMNMNW RHI RPHI FJHI VYSTUP=SKAKAL PES PRES OVES VSTUP=RPHI YHWHAFB WFBMB VYSTUP=PRES ZELENOU LOUKU
Body | Za co |
---|---|
0.5 | Uživatel si může vybrat vstupní soubor |
0.5 | Zobrazí se první řádek vstupního souboru |
1 | zpracuje soubor POROTA1.DAT ( pes jitrnicku sezral,... |
2 | zpracuje soubor POROTA1.DAT a zpracuje správně mezery - vsechny tři rádky stejně dlouhé |
1 | zpracuje soubor POROTA2.DAT vstup=vystup = ABECEDA A,B,...,Z |
1 | zpracuje soubor POROTA3.DAT THE QUICK BROWN FOX JUMPS OVER A LAZY DOG |
1 | zpracuje soubor POROTA4.DAT NEZAPOMEN NA DOKUMENTACI ZA TO JSOU TAKY BODY ABCDEFGHIJKLMNOPQRSTUVWXYZ |
2 | zpracuje soubor POROTA5.DAT O NAHLY DEST JIZ ZVIRIL PRACH A CILA LAN TED BEZI S HOUFCEM GAZEL K UKRYTUM |
1 | dokumentace, komentáře, přehlednost, výstižné názvy proměnných, … |