Titulky
=======
volani programu:
titulky.sh -d dict1 -d dict2 -d dictn file1 file2 file3
kde -d dict1 vašemu programu řekne, že textový soubor dict1 má načíst jako slovník, co je to později.
A zbytek soubory file1 ... fileN načíst jako titulky k filmu(ům). Ty jsou v tomto formátu:
{20758}{20930}HELLO WORLD, BILL IS A YELLOW EXCAVATOR FROM USA. BUT|OUR JANE IS TOO!
kde první dvě čísla, bez mezer uzavřená do { a } značí počáteční a konečný frame titulků, hned po nich
(bez mezery) následují slova titulků, která obsahují písmena anglické abecedy a znaky z
množiny ,!?.' (a možná nějaké další, neškodné).
Vaším úkolem je upravit soubory file1...filen tak, aby vypadaly takto:
{20758}{20930}Hello world, Bill is a yellow excavator from USA. But|our Jane is too!
Tedy udělat vše malými písmeny, až na začátky vět, vlastní jména(Jane) a zkratky (USA).
Má to ovšem háček - Billa. "bill" je totiž také účet, a tedy u slova "BILL" nemůžeme
rozhodnout jestli má být velkými nebo malými. V tomto případě má váš program do logu
nebo na výstup vypsat že na této řádce si nebyl jistý a nechat "Bill".
(Film o účetním Billovi je tedy tomuto skriptu pravým nepřítelem)
Máte k tomu dispozici slovníky, které jsou ve formátu
slovo s
slovo2 v
slovo3 sv
ZKRTKA
MUDr.
knife s knives
read v reads read read
Kde první sloupec je slovo v "holém" tvaru, druhý sloupec jsou všechny slovní druhy,
které může nabývat - substantivum, verbum, a další (tato jsou zajímavá).
Pokud je slovo nepravidelné a je to podstatné jméno, má uvedené ještě další slovo (knives),
což je tvar množného čísla.
Pro pravidelná podstatná jména používáme vždy koncovku -s nebo -es (pokud slovo
končí -s, -sh, -x) a nebo -ies, pokud slovo končí -y a před y je souhláska (spoluhláska SK).
Pokud je sloveso nepravidelné, má uvedené další tři tvary - 3.os - trpný rod - příčestí minulé
Jinak může nabývat koncovek -ied (opět y, viz výše), -d (pokud končí na -e) nebo -ed.
( anglické skloňování vysvětloval asi 15 minut, tohle je rychlý výcuc
)
Zkratky jsou ve slovnících také, poznáme je tak, že neobsahují žádné další slovo na řádce.
(čili např. MUDr. nebo ZKRTKA)
Poznámky & požadavky:
=====================
1) program musí skončit ještě dnes
2) celý slovník se nám vejde do paměti... i dvakrát
3) ve slovnících se nevyskytují kolize (takové, že by jeden uváděl see - seed, a druhý see - saw)
4) ve slovnících se ale může jedno slovo vyskytovat vícekrát (protože může být zároveň nepravidelné
sloveso i nepravidelné podstatné jméno), potom bude na oddělených řádkách s přísl. druhým sloupcem (s/v)
// pro fajnšmekry 5) přemýšlejte, jaké je lepší řešení v závislosti velikostí slovníků a souborů s titulky
Řešení:
=======
1) shell běží pomalu, hodně pomalu, ale přinejhorším je možné psát program v shellu
2) lepší řešení je psát program v awk, použít jeho asociativní pole jako slovník
4) pozor, aby jste nevyrobili (až budete zkoušet všechny konverze na -ies apod.) z podstatného jména sloveso
nebo vice versa
5) slijte všechny slovníky do jednoho
6) pamatujte na to, že awk může mít pouze 10 souborů najednou otevřených, a zavírejte po sobě
7) já osobně jsem v awk psal celý program v BEGINu pomocí funkce getline (která není ve všech awk) a nebyl
s tím žádný problém
slovník můžete postavit jakkoli, vejde se do paměti a proto je jedno, jestli rovnou všechny tvary přidáte
jako slova nebo pro každé slovo koumáte všechny tvary a zkoušíte (zde je závislost rychlosti na
velikosti souborů dict a file z bodu číslo 5)
3) všeho bylo třeba s mírou, netrhal hlavy ani když člověk zapomněl, že větu neukončují jenom tečky
kterým se dostane speciální péče právě díky zkratkám jako MUDr. , které tečkou končí, ale také
vykřičníky a otazníky
Takové a podobné rozumné nedostatky programu byly přehlédnuty a
dokonce ani nebránily jedničce
Úspěšnost na závěr: Forst říkal, že tato úloha byla techničtější, můžete posoudit sami,
z 22 lidí to přibližně: 6-7 udělalo na jedničku, 3-4 na dvojku, 3 na trojku, se 3 mluvil,
3 neudělali a 3 odešli během. (čísla jsou odhadnutá, ale odpovídají plus mínus)