Jak snadno zpracovat

vstup a výstup?

Co je to úloha? Co obnáší vyřešit úlohu?

Tento text se snaží poradit začátečníkům, kteří nemají zkušenosti s programátorskými soutěžemi, jak vypadají úlohy v takových soutěžích a jak se řeší.

Základní koncepty si ukážeme na úloze Jízdenky z domácího kola roku 2018. Týna jezdí MHD a máme za úkol spočítat, jestli se jí víc vyplatí kupovat si jednodenní nebo týdenní jízdenky. Máme dáno, kolik která jízdenka stojí. Prvním krokem pro úspěšné vyřešení úlohy je přečíst si její zadání.

Abychom úlohu vyřešili a získali za ni body, musíme si z webu Kasiopey stáhnout vstupní soubor (začneme lehkým vstupem), který popisuje několik problémů, které musíme vyřešit. Pro každý problém zvlášť je v souboru specifikované, kolik stojí jednodenní a kolik týdenní jízdenky a kolik dní Týna plánuje jezdit. Přesný formát vstupního souboru je popsaný v zadání.

Nyní máme několik minut na to, abychom vytvořili výstupní soubor obsahující řešení jednotlivých problémů; tj. pro každý problém musíme určit, která jízdenka se vyplatí, a to do souboru napsat. U každé úlohy je popsané, jak má tento soubor vypadat. Pak jej nahrajeme do systému Kasiopey a ten určí, zda jsou odpovědi správné. Pokud ano, dostaneme za úlohu body!

Všimni si, že zatím nepadla žádná zmínka o programování. Teoreticky by šlo prostě přečíst si soubor vlastníma očima a spočítat a zapsat výsledky. Kromě těch nejjednodušších jsou ale naše úlohy dělané na to, aby tohle dělat nešlo. Například pokud bychom v této úloze měli spočítat tisíc problémů, ručně bychom to v časovém limitu několika minut nestihli. Očekává se tedy, že úlohu vyřešíme pomocí programu.

Jak psát programy na řešení úloh

Napřed si ujasněme, co pro naše účely znamená program. Myslíme tím kus kódu, který přečte nějaký vstup (ze souboru nebo z tzv. standardního vstupu) a z něj spočítá nějaký výstup, který vypíše do souboru nebo na tzv. standardní výstup. Na příkladu již zmíněné úlohy Jízdenky to znamená, že program přečte vstupní soubor s popisem problémů, provede výpočet a vytvoří výstupní soubor s řešením, který pak odevzdáme do systému.

Na rozdíl od programů, jako je webový prohlížeč nebo Hledání min, náš program nijak nevypadá; nemá žádné okénko, jen provádí nějaké výpočty. Program má tak blíž k funkcím v matematice: dostane nějaký vstup a z něj spočítá nějaký výstup.

Ale zpět k naší úloze. Pro její vyřešení stačí spočítat, jestli je levnější sedmkrát jednodenní jízdenka a nebo týdenní jízdenka.

Takto by se dala řešit úloha Jízdenky v Pythonu:

with open("A-lehky.txt") as vstup:
    with open("Reseni.txt", "w") as vystup:
        pocet_problemu = int(vstup.readline())

        for i in range(pocet_problemu):
            dny = int(vstup.readline())
            jednodenni = int(vstup.readline())
            tydenni = int(vstup.readline())

            if jednodenni * 7 < tydenni:
                print("jednodenni", file=vystup)
            else:
                print("tydenni", file=vystup)

Program načte vstup ze souboru A-lehky.txt a výstup uloží do souboru Reseni.txt ve stejné složce. Pozor, program musí být spuštěn ve složce, kde se nachází soubor A-lehky.txt. O tom, jak se načítá vstup a vypisuje výstup se více dočteš zde. Pro letošní úlohu A to ale nemusíš řešit. Připravili jsme pro tebe šablony, které vstup načtou za tebe a ty se tak můžeš soustředit jen na řešení soutěžní úlohy.

Řešení úlohy Jízdenky v dalších jazycích najdeš zde.

Pokud na psaní programů používáš nějaké IDE (třeba PyCharm), můžeš svůj program spustit přímo z něj (ale opět si dej pozor, aby soubor se zadáním byl ve stejné složce jako tvůj program).

Může ale být jednodušší program spouštět z konzole (příkazové řádky), což ti umožní například číst vstup ze souboru, jako by byl na vstup zadaný z klávesnice. Pokud se chceš dozvědět více, koukni na náš návod o zpracování vstupu a výstupu . Jinak se můžeš pustit do řešení úloh letošního ročníku.

Máš na to!

I ty můžeš vyhrát! Nebo to aspoň zkusit :)