Soutěž v programování – 26. ročník
Krajské kolo 2011/2012
Říká se, že při čtení textu dokážeme bez problému přečíst i slova s přeházenými znaky, pokud zůstane první a poslední písmenko na svém místě. Vaším úkolem je napsat program, který to pomůže ověřit. Na vstupu programu je text a celé číslo P v rozsahu od 0 do 1000 určující míru prohazování (viz dále). Výstupem je text s proházenými písmenky.
Přesný postup prohazování písmen je takovýto: Změny budeme provádět pouze ve slovech, slovem se rozumí posloupnost písmen české abecedy oddělená alespoň jedním nepísmenem (jakýmkoliv jiným znakem, mezerou, číslicí a pod). Znaky mimo slova nebudeme nijak měnit. Slova kratší než 4 písmena ponecháme také beze změn. Pro slova o čtyřech a více znacích určíme nejdříve počet prováděných prohozů pro dané slovo – má-li slovo N písmen, pak počet prohozů X bude náhodné číslo v rozsahu od 0 do P*(N-3)/100. Následně X-krát vybereme vždy náhodně dvě pozice písmen ve slově mimo první a poslední a písmena na nich umístěná prohodíme. Prohazujeme bez ohledu na to, zda již dříve na daném místě k prohozu došlo.
Pro zjednodušení chápejte písmeno „ch“ jako dvě samostatná písmena „c“ a „h“.
Má-li váš program grafické rozhraní, bude vstupní text vložen uživatelem do vstupního pole dle zvyklostí daného rozhraní. Programátoři pracující v prostředích preferujících příkazový řádek mohou pracovat se standardím vstupem a výstupem. Předpokládejte délky textů maximáně do osmi tisíc znaků.
Příklad 2. Příklad výstupu pro parametr P = 200
Dleůitžá věc je, aby blya pnvrí a psoelndí pímesna na srpváénm mstíě.
Funkčnost | 1 bod | Program načítá vstupní text a zobrazuje text výstupní s viditelně proházenými znaky (použijte text o alespoň desítkách znaků). |
2 body | První a poslední znak slova zůstává vždy na svém místě. | |
2 body | Míra proházení znaků odpovídá zadanému číslu P. Pro P=0 je výstup bez prohozů. | |
2 body | České znaky jsou chápány jakou součást slova. | |
2 body | Číslice nejsou chápány jakou součást slova. | |
dokumentace | 1 bod | dokumentace, komentáře, přehlednost, výstižné názvy proměnných, … |
V sherwoodském lese už to zase vře – skupina zlosynů se snaží polapit Robina Hooda! Robin je na ně ovšem připraven a chce je přivítat bravurní střelou ze svého nového luku, který dokáže prostřelit i několik nepřátel naráz.
Problém je v tom, že zlosynů je opravdu hodně a Robin neví, jakým způsobem by jich mohl jedním výstřelem zasáhnout co nejvíc. Přemýšlel o tom, že by poprosil zlosyny, aby chvilku postáli bez pohnutí, dokud si nevyměří, odkud bude střílet, ale nebyl si jistý, že by jeho slušné žádosti zlosyni vyhověli. Poprosil nakonec raději o pomoc vás.
Napište program, který pokud možno rychle vyřeší Robinův problém. Na vstupu dostane souřadnice až 3000 různých bodů, každý zadaný dvěma souřadnicemi v rozsahu 1 až 1000. Cílem je najít přímku, která protne co nejvíc bodů. Přímka protne bod jenom tehdy, když prochází bez zaokrouhlování přesně jeho souřadnicemi. Máte zaručeno, že taková přímka je jedinečná. Výslednou přímku zobrazte spolu se všemi ostatními zlosyny v grafické podobě a vypište, kolik zlosynů dokáže Robin jedním výstřelem skolit.
Vstup načtěte ze souboru zlosyni.txt
v aktuálním adresáři.
Soubor zlosyni.txt
obsahuje souřadnice nepřátel,
na každé řádce jsou mezerou oddělená dvě přirozená čísla v rozsahu 1 až
1000. Nepřátel je nanejvýš 3000 a každý má jedinečné souřadnice. Řádky
jsou ukončeny dvojicí znaků CR
a LF
.
Zobrazte oblast (1, 1)
až
(1000, 1000)
se všemi zlosyny a s výslednou přímkou
tak, aby bod (1, 1)
byl vlevo dole.
Také zobrazte nebo vypište, kolik zlosynů dokáže Robin jedním výstřelem skolit.
zlosyni.txt |
obrazovka |
100 900 400 700 900 100 500 500 100 100 500 900 150 200 900 900 500 100 |
Robin může jedním výstřelem skolit 4 zlosyny. |
V adresáři robin-hood
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 během vteřin.
Úloha je hodnocena deseti body, které se rozdělí následovně:
9 bodů |
Funkčnost a efektivita.
Program soutěžících se vyhodnotí na devíti vstupních
adresářích
Při vyhodnocování adresáře se z něj zkopíruje soubor
|
1 bod | Dokumentace, komentáře, přehlednost a výstižné názvy proměnných. |
Funkčnost | 1 bod | úspěšné zpracování adresar-01 |
1 bod | úspěšné zpracování adresar-02 | |
1 bod | úspěšné zpracování adresar-03 | |
1 bod | úspěšné zpracování adresar-04 | |
1 bod | úspěšné zpracování adresar-05 | |
1 bod | úspěšné zpracování adresar-06 | |
1 bod | úspěšné zpracování adresar-07 | |
1 bod | úspěšné zpracování adresar-08 | |
1 bod | úspěšné zpracování adresar-09 | |
dokumentace | 1 bod | dokumentace, komentáře, přehlednost, výstižné názvy proměnných, … |
Vypracujte program, který k zadanému celému kladnému číslu nalezne a vypíše co největší prvočíslo v jehož zápisu se každá číslice vyskytuje nanejvýš jednou a je menší než zadané číslo.
Například k 98777 to je prvočíslo 98731. Prvočíslo 98737 nevyhovuje protože se v něm vyskytuje číslice 7 dvakrát.
Funkčnost | 1 bod | program určí správně výsledek pro všechna čísla 1 (hledané číslo neexistuje), 2 (hledané číslo neexistuje), 3 (hledané číslo je 2) a 4 (hledané číslo je 3) |
1 bod | pro 17 vrátí 13 | |
1 bod | pro 997 vrátí 983 | |
1 bod | pro 20000 vrátí 19867 | |
1 bod | pro 3000000 vrátí 2987651 | |
1 bod | pro 500000000 vrátí 498763021 | |
1 bod | pro 909090909 vrátí 908764123 | |
1 bod | pro 1000000000 vrátí 987654103 | |
1 bod | pro 2147483647 vrátí 987654103 | |
dokumentace | 1 bod | dokumentace, komentáře, přehlednost, výstižné názvy proměnných, … |
Děda K. se rozhodl, že napíše encyklopedii. Taková encyklopedie se skládá z hesel, což je dvojice: název předmětu – popis předmětu. Vaším úkolem bude dědovi práci zjednodušit.
Napište program, pro práci s encyklopedickými hesly. Hesel nebude celkem více než 10 tisíc. Název předmětu nebude mít více než 255 znaků. Žádná dvě hesla nesmí mít stejný název. Popis nebude mít více než 32000 znaků.
Program umožní tyto funkce:
načítání hesel z datového souboru, určeného uživatelem,
zobrazování hesel – hesla jsou přitom zobrazována abecedně seřazená podle názvu předmětu, malá a velká písmena jsou rovnocená,
vytvoření hesla,
vyhledání hesla podle názvu předmětu,
změna hesla,
vymazání hesla,
vyhledání textu v názvech nebo popisech, případně obojím,
ukládání hesel do datového souboru, původního nebo do určeného uživatelem,
export hesel do souboru HTML a vytvoření/zvýraznění odkazů na jiná hesla v popisech.
Funkce přidávejte postupně, jak jsou uvedeny v zadání. Funkce nebude hodnocena, pokud nebudou fungovat všechny funkce předcházející. Popis datového souboru a HTML souboru najdete dále.
Prohlédněte si také ukázkový program.
Datový soubor je textový soubor obsahující hesla, která jsou oddělena dvěma prázdnými řádky.
Heslo se skládá z jedné řádky obsahující název předmětu. Následuje jedna prázdná řádka a jedna nebo více řádek popisu předmětu.
Pozor: jednotlivé prázdné řádky v popisu předmětu jsou možné, zatímco dvě a více nikoliv, protože ty jsou použité jako oddělení hesel mezi sebou.
Viz ukázkové soubory v adresáři encyklopedie
.
Tento soubor – stránka HTML zobrazuje hesla (názvy předmětu i
popis předmětu) seřazená podle názvů, malá a velká písmena jsou
rovnocená. Hesla, jejichž název začíná stejným písmenem jsou
seskupena do oddílů, na které jsou odkazy na začátku stránky. U
každého hesla jsou odkazy vedoucí na začátek oddílu a stránky.
Pokud se v popisu hesla objeví text, který se shoduje s názvem
kteréhokoliv hesla (bez ohledu na velikost písmen), změňte tento
text na odkaz na shodné heslo. Viz ukázkový soubor v adresáři
encyklopedie
.
Funkčnost | 1,5 bodu | program načte data souboru dle volby uživatele a zobrazí je - oboje dohromady max 15 sekund. Testovací soubory: test10hesel.txt , test1000hesel.txt , test9999hesel.txt . Za každý 0,5 bodu. |
1 bod | načtená data jsou správně zobrazena a hesla správně seřazená | |
0,5 bodu | lze vytvořit nové heslo | |
0,5 bodu | lze vyhledat heslo podle názvu | |
0,5 bodu | lze editovat libovolné heslo | |
0,5 bodu | lze smazat libovolné heslo (i poslední) | |
0,5 bodu | lze vyhledat text v názvech i popisech | |
1 bod | lze uložit do datového souboru (Save i Save As) | |
1 bod | lze exportovat do HTML do uživatelem určeného souboru. (testovací soubory: test10hesel.txt , test1000hesel.txt | |
1 bod | HTML soubor načtený do prohlížeče odpovídá obsahem původním datům. | |
1 bod | V HTML fungují správně vnitřní odkazy. Ukázkový soubor: ukázka5hesel.html . Testovací soubor: ukázka5hesel.txt | |
dokumentace | 1 bod | dokumentace, komentáře, přehlednost, výstižné názvy proměnných, … |