Zadanie
Dano prišiel zo školy a už sa teší ako sa pôjde učiť na zajtrajšiu písomku z matematiky. Práve preberajú geometriu a tá ho veľmi baví. Zajtrajšia písomka bude z názvov rovinných a priestorových geometrických útvarov. Dano už vybehol po schodoch, otvoril dvere do izby… Ale nie! Jeho malý brat Jožko sedí uprostred jeho izby, v ruke drží nožničky a raduje sa. Dano sa však až tak neraduje. Jožko povystrihoval zo zošitu z matematiky všetky slovíčka! Ako sa teraz naučí na písomku z geometrie? Pomôžete Danovi zistiť, ktoré geometrické útvary sú rovinné a ktoré sú priestorové?
Úloha
Napíšte program, ktorý pomôže Danovi roztriediť geometrické útvary na rovinné a priestorové.
Formát vstupu
Na vstupe dostanete jedno slovo, názov geometrického útvaru. Názvy sú písané bez diakritiky malými písmenami.
Formát výstupu
Vypíšte jeden riadok, ktorý obsahuje text rovinny
ak je daný útvar rovinný alebo priestorovy
ak je daný útvar priestorový.
Hodnotenie
Z celkových 20 bodov budú 4 body udelené za stručnosť1. Dĺžku svojho programu vypočítate ako počet znakov s ASCII hodnotou väčšou ako 32 vo vašom zdrojovom kóde (teda viditeľné znaky, nie medzery a konce riadkov). Body za stručnosť budú môcť získať iba plne funkčné programy (teda tie, ktoré na testovači dostanú 16 bodov a teda budú pracovať korektne).
Bonusový 1 bod bude udelený najkratšiemu programu z pomedzi všetkých jazykov. Takže autor (resp. v prípade rovnosti autori) najkratších z programov má šancu mať za túto úlohu 21 bodov. Všetky tieto body za stručnosť budú udelené až po uplynutí termínu na odovzdávanie riešení.
Príklad
Input:
sestuholnik
Output:
rovinny
Input:
stvorsten
Output:
priestorovy
V rámci možností zvoleného programovacieho jazyka. Teda program ktorý je v
C++
, ale nedá sa skrátiť môže dostať \(4\) body, aj keď program ktorý je kratší aPythone
dostane iba \(3\) body lebo sa skrátiť ešte dá.↩︎
Ako ste si mohli všimnúť, v tejto úlohe boli viditeľné vstupy a výstupy. Teda na správne riešenie za 16 bodov stačilo zistiť všetky priestorové a všetky rovinné útvary, ktoré boli na vstupe a následne napísať program, ktorý si ich všetky zapamätá.
Toto riešenie sa dá jednooducho skrátiť ak si všimneme pár zákonitostí. Až na pár výnimiek sa rovinné útvary končia príponou "uholnik"
a priestorové sa končia "sten"
. Programu už teda stačí zapamätať si len niekoľko výnimiek. V prvej sade neboli žiadne výnimky a teda na 4 body za prvú sadu stačilo rozoznať útvary končiace na "uholnik"
a útvary končiace na "sten"
.
Aby sme program ešte skrátili bude najlepšie ak sa pohráme len s písmenkami. Môžeme si všimnúť, že všetky útvary končiace na "n"
okrem "oktagon"
a "hexagon"
sú priestorové. Žiadny rovinný útvar ale nemá piate písmeno "g"
. Vieme teda použiť, že všetky končiace na "n"
, ktoré nemajú piate písmeno "g"
sú priestorové. Všetky útvary končiace na písmeno "k"
sú rovinné. Teraz nám stačí sa pozrieť len na výnimky. Z výnimiek, "gula"
a všetky slová začínajúce na "k"
, okrem slova "kruznica"
sú priestorové. Zvyšné sú rovinné.
Niektorí z vás našli ďalšie pravidlá, ktoré sa dajú využiť. Stačí sa napríklad pozrieť iba na tretie a piate písmenko odzadu.
Veľmi krátke riešenie, sa dalo získať aj pomocou regulárnych výrazov, ktorými vieme na pomerne málo znakov popísať text, ktorý potom možeme vo vstupnom reťazci vyhľadávať. Napríklad regulárny výraz sten$|uholnik|..ica
popisuje výraz, ktorý končí (symbol $
) na sten
alebo (symbol |
) obsahuje uholnik
alebo obsahuje text s ľubovolnými dvoma písmenami (symbol .
) nasledujúc textom ica
. (Knižnice pre regulárne výrazy obsahuje každý slušný jazyk, vrátane Pythonu a C++11 a dokážu toho omnoho viacej. Podrobný popis regulárnych výrazov nájdete na internete).
Ďalšie nápady už necháme na vás.
Diskusia
Tu môžte voľne diskutovať o riešení, deliť sa o svoje kusy kódu a podobne.
Pre pridávanie komentárov sa musíš prihlásiť.