Soutěž v programování – 28. ročník
Krajské kolo 2013/2014
Naprogramujte aplikaci simulující „Kolo štěstí“. Program dovolí do vstupního pole zadat několik řádek textu. Text na jednotlivých řádkách pak zobrazí v kruhových výsečích rozdílných barev. Následně program umožní uživateli kolo „roztočit“ – kolo se pak zastaví na náhodně zvolené výseči a označí ji. Kolo půjde roztáčet opakovaně. Snažte se, aby pohyb kola vypadal realisticky.
Příklad 1. Příklad vstupu a vykreslení kola štěstí
Vstup: Javascript | Ukázka vykreslení kola štěstí |
funkčnost | 1 bod | lze zadávat texty pro zobrazení na kole |
1 bod | program správně zobrazí kolo pro dvě řádky vstupu (půl bodu za výseče a půl za texty) | |
1 bod | program správně zobrazí kolo pro tři řádky vstupu (půl bodu za výseče a půl za texty) | |
1 bod | program správně zobrazí kolo pro čtyři řádky vstupu (půl bodu za výseče a půl za texty) | |
1 bod | program správně zobrazí kolo pro text ze zadání (půl bodu za výseče a půl za texty) | |
1 bod | barvy výseče se střídají a neopakují | |
1 bod | kolo lze roztočit | |
0.5 bodu | kolo se po náhodné době zastaví | |
0.5 bodu | po zastavení je viditelně označena jedna vybraná výseč | |
1 bod | pohyb kola je realistický (rotace zpomaluje před úplným zastavením) | |
dokumentace | 1 bod | dokumentace, komentáře, přehlednost, výstižné názvy proměnných, … |
Vaším úkolem je simulovat závody šneků. Jak takový závod probíhá? Šneci nestartují všichni z jedné startovní čáry, ale jsou umístěni do závodiště podle své výkonnosti (slabší dostanou náskok), aby byl závod napínavý. Po odstartování se každý šnek začne pohybovat svojí stálou rychlostí směrem vpřed. Závodí se přesně daný čas, po jeho uplynutí se určí pořadí tak, že vyhraje šnek který dolezl nejdále, následuje druhý a tak dále.
A co má tedy dělat váš program? Na vstupu dostane text popisující startovní podmínky závodu – na první řádce je jediné číslo určující délku závodu v sekundách. Každá další řádka přísluší vždy jednomu starujícímu šnekovi a obsahuje dvě čísla oddělená mezerou. První číslo na řádce určuje startovní náskok šneka (vzdálenost v milimetrech od pomyslné startovní čáry směrem do cíle), druhá pak rychlost šneka (mm/s). Startovní číslo je dáno pořadím v souboru, první šnek má startovní číslo 1. Text popisující startovní stav bude programu zadán do textboxu či obdobé grafické komponenty. Pokud pracujete v prostředí, kde odvyklým vstupem je textový standardní vstup, můžete použít i ten.
Vaším úkolem je ze zadných vstupních podmínek (vstupního textu) spočítat pořadí šneků při ukončení závodu a vzdálenost od startovní čáry. Pokud více šneků skončí ve stejné vzdálenosti, bude u nich uvedeno stejné umístění. Dalším úkolem je zobrazit průběh závodu na závodišti jako animaci, umožněte volbu rychlosti animace.
Pro zjednodušení uvádíme, že v závodu nebude startovat více šneků než 20, maximální trvání závodu je 3600 sekund, pozice a rychlost šneka je celé číslo mezi 0 a 10000. Případné neplatné zadání oznamte uživateli, program samozřejme nesmí při chybném vstupu havarovat.
Příklad 3. Příklad výstupu
1.-2. místo šneci číslo 2 a 4 (500mm) 3. místo šnek číslo 1 (450mm) 4. místo šnek číslo 3 (300mm)
Šnečím závodům nazdar! Zdar!
funkčnost | 1 bod | lze zadat vstupní data způsobem dle zadání (textarea, resp. stdin) |
1 bod | přežije chybné zadáni, nezhroutí se, ale oznámí chybu (zkusit soubor chyba1.txt, chyba2.txt - po 0.5 bodu) | |
2 body | dobře spočítá pořadí pro vstup1.txt (pořadí: 1. č2 600mm, 2. č4 500mm, 3. č1 450mm, 4. č3 300mm) | |
1 bod | dobře spočítá pořadí pro vstup2.txt (pořadí: 1.-2. č2+č4 500mm, 3. č1 450mm, 4. č3 300mm, musí rozpoznat že jde dvou prvních o "první až druhé místo") | |
1 bod | dobře spočítá pořadí pro vstup3.txt (pořadí: 1.-3. č1+č2+č4 500mm, 4. č3 300mm, musí rozpoznat že jde o "první až třetí místo") | |
1 bod | animace funguje (zobrazuje data bez zjevných chyb) | |
1 bod | funguje volba rychlosti animace | |
1 bod | animace je přehledná, šneky lze snadno identifikovat, subjektivně graficky hezké řešení | |
dokumentace | 1 bod | dokumentace, komentáře, přehlednost, výstižné názvy proměnných, … |
Příklad 5. chyba2.txt
100 350 101 250 102 350 103 250 104 350 105 250 106 350 107 250 108 350 109 250 110 350 111 250 112 350 113 250 114 350 115 250 116 350 117 250 118 350 119 250 120 10350 121
Racionální číslo je číslo, které lze vyjádřit jako zlomek, tj. podíl dvou celých čísel, většinou zapsaný ve tvaru a/b, kde b je různé od nuly.
Desetinný zápis racionálního čísla je periodický. V případě konečného rozvoje – desetinného čísla – tvoří periodu nuly. Pokud se před periodou vyskytuje skupina číslic, která se neopakuje, nazývá se rozvoj neryze periodický, neopakující se skupina se nazývá předperioda.
Vypracujte program pro určení předperiody a periody podílu 1/n pro
maximálně šestimístné přirozené číslo n>1. Vstupní hodnoty načtěte ze souboru zadani.txt
,
ve kterém je každé číslo na samostatném řádku.
Řádky jsou ukončeny znakem LF
.
Program by měl spočítat výsledek pro jednotlivá čísla do jedné minuty.
Příklad 9. Ukázka výsledku pro vybraná čísla
Vstupní soubor zadani.txt
obsahuje následujících pět
řádek:
2 7 192 11111 12345
Výsledky spočítané a vypsané programem:
1/2=0.5
předperioda: 0.5
perioda: 0
1/7= 0.142857142857142857142857142857142857…
předperioda: 0.
perioda: 142857
1/192 = 0.005208333333333…
předperioda: 0.005208
perioda: 3
1/ 11111= 0.0000900009000
předperioda: 0.
perioda: 00009
1/12345=0.00008100445524503847711624139327663021466180639…
předperioda: 0.0
perioda: 00081004455245038477116241393276630214661806399351964358039692
18307006885378695828270554880518428513568246253543944916970433373835560
95585257189145402997164844066423653300931551235317942486836776022681247
46861077359254759011745646010530579181855002025111381125961927906034831
91575536654515998379910895099230457675172134467395706763872012960712839
20615633859862292426083434588902389631429728635074929121101660591332523
28878088294856217091940056703118671526933981368975293641150263264479546
37505062778452814904819765087079789388416362899959497772377480761441879
30336168489266909680032401782098015390846496557310652085864722559740785
74321587687322802754151478331308221952207371405427298501417577966788173
34953422438234102875658161198865937626569461320372620494127176994734710
40907249898744430943701903604698258404212231672742
Pokud program včas neskončí (na některém čísle se zasekne) tak 0 bodů za dané číslo.
funkčnost | 1 bod | Program načítá data ze vstupního souboru "zadani.txt" |
1 bod |
za každý správný 0.25 1/262144= 0.000003814697265625X0 | |
1 bod |
za každý správný 0.25 1/176 = 0.0056X81 | |
1 bod |
za každý správný 0.25 1/111111= 0.X000009 | |
1 bod |
vše správně 1bod, jinak 0 1/87 = 0.X0114942528735632183908045977 | |
1 bod |
vše správně 1bod, jinak 0 1/11 = 0.X09 | |
1 bod |
1/917504= 0.00000108991350446X428571 | |
1 bod |
dlouhá perioda, testujeme jen začátek a konec 1/12345 = 0.0X00081004455245038....4212231672742 | |
1 bod |
dlouhá perioda, testujeme jen začátek a konec 1/112265= 0.0X00008907495657595....7758428717766 | |
dokumentace | 1 bod | dokumentace, komentáře, přehlednost, výstižné názvy proměnných, … |
Strýček Skrblík je známý držgrešle, který musí mít vždy všeho nejvíc. Dnes ráno uviděl své synovce, jak si čtou na tabletu knížku, a říkal si: „To je ale slov, ta všechna chci. Ale vlastně chudá slova nechci. Chci jenom slova, která jsou úplně nejbohatší!“ Samozřejmě podle strýčka Skrblíka je nejbohatší to slovo, které se v textu vyskytuje co nejčastěji.
Napište program, který po zadání jména souboru s knihou vypíše tři nejčastější slova, která se v něm nacházejí. Můžete předpokládat, že všechna tato tři slova jsou určena jednoznačně. Váš program by měl fungovat co nejrychleji, jinak Skrblík ztratí trpělivost a moc štědře vás za vaši práci neodmění.
Po spuštění programu umožněte zadání jména souboru s knihou.
Soubor s knihou obsahuje pouze malá a velká písmena anglické abecedy,
číslice, mezery a konce řádku, které jsou reprezentovány znakem
LF
. Slovo je posloupnost písmen a číslic ohraničená
mezerou či koncem řádku. Dvě slova jsou stejná, pokud se shodují
bez ohledu na velikost písmen.
Soubor s knihou může být opravdu veliký – pro dosažení plného počtu
bodů by měl váš program fungovat i pro soubor délky 100 MB
.
Můžete nicméně spoléhat na to, že jedinečných slov je
v souboru nanejvýš deset tisíc a že každé slovo má délku nanejvýš
tisíc znaků.
Na výstup vypište tři slova, která se v daném souboru vyskytují nejčastěji (bez ohledu na velikost písmen). Slova vypište od nejčastějšího po nejméně časté a u každého vypište počet výskytů. Můžete předpokládat, že tato slova jsou určená jednoznačně.
Soubor s knihou |
Výstup programu |
Jeden Murphyho zakon o programovani Kazdy program obsahuje jeden chybny radek Libovolny program jde zkratit o jeden radek Z toho plyne ze kazdy jeden program jde zkratit na jeden radek ktery je radek chybny |
jeden 5 radek 4 program 3 |
V adresáři skrblik
se nachází ukázková data včetně
příkladu ze zadání. Pro získání plného počtu bodů by měl váš program
vyřešit každá z nich do minuty.
Program soutěžících se vyhodnotí na devíti vstupních adresářích
skrblik/test-1
až skrblik/test-9
,
za každý dostane soutěžící 0 bodů nebo 1 bod.
Při vyhodnocování adresáře spustíme program soutěžícího a jako vstup
zadáme soubor skrblik/test-i/vstup.txt
.
Program musí skončit do jedné minuty. Pokud program v limitu vypsal
výstup, který se (až na formátování a velikost písmen) shoduje s obsahem souboru
skrblik/test-i/vystup.txt
, dostane 1 bod, jinak
dostane 0 bodů.
funkčnost | 1 bod | test-1 |
1 bod | test-2 | |
1 bod | test-3 | |
1 bod | test-4 | |
1 bod | test-5 | |
1 bod | test-6 | |
1 bod | test-7 | |
1 bod | test-8 | |
1 bod | test-9 | |
dokumentace | 1 bod | dokumentace, komentáře, přehlednost, výstižné názvy proměnných, … |