Package: input-tool
Zmeny voči jablkojMergnuté zmenyPodpora priečinkov v zozname programov(automatické načítanie všetkých riešení, validátorov a checkera z priečinku)ČasovanieDesatinný timelimit-t 0.5Jazykový timelimit-t "3,cpp=1,py=5"Detailnejšie vypisovanie trvania programovMilisekundová presnosťZobrazovanie celkového času namiestoUser timeVypisovanieReal/User/System timeTLE čas sa neráta doMax timeVarovný timelimit pomocou--wtimeLepšie predvolené nastaveniaPreskakovanie zvyšných vstupovv sade po odmietnutí (vypnúť cez-F)Štatistiky po vyhodnotení (vypnúť cez--no-statistics)Kompilovanie C++ s optimalizáciami a novším štandardomZvýšené limity pre pamäť a zásobníkDeduplikovanie programov na vstupe (vypnúť cez--dupprog)Paralelné generovanie vstupov a testovanie(pomocou prepínača-j)Podpora alternatívnych Python interpreterov (PyPy) pomocou--pythoncmd cmdRozšírená funkcionalita IDF o vlastné premennéMožnosť nemať nainštalovanýtimeZrušená podpora pre Python2Kompilovanie Java riešení v dočasnom priečinkuInformovanie o neúspešnom generovaní vstupovSformátovaný a otypovaný kódPrepísané READMEBugfixesNemergnuté zmenyPodpora MacOSRôzne malé vylepšenia, refaktorovanie, bugfixyRozšírená funkcionalita IDF o podporu YAML a!evalPoetry managerKontrola aktualizácií pri spustení generátoraPodpora priečinka ako argument preinput-generatorainput-sample– automatické načítanie IDF a zadaniaAutomatický varovný timelimit tesných riešeníMožnosť výpisať výstup hodnotiča pri WA(pomocou prepínača-D)Kompilovanie do samostatného priečinkuprog/(zmena pomocou prepínača--progdir)Začaté písanie testovPlne paralelné kompilovanie a testovanieGenerovanie vstupov predvolene pomocoupypy3Zmodernizovaný a zrefaktorovaný kódJSON výstup testeraBugfixesRýchlokurz# napíšeme si riešenia, generátor, idf a potom:input-sample.# priečinok so zadanie.mdinput-generator.
input-tester.# o pomoc požiadame `input-<program> -h`, napríklad:input-generator-hinput-toolNástroj, ktorý výrazne zjednodušuje vytváranie a testovanie vstupov pre súťažné programátorské príklady. Skladá sa z troch častí –input-sample,input-generatorainput-tester.InštaláciaNaLinuxeaMacOSje to dosť jednoduché. Windows nie je podporovaný, ale podWSLby to malo ísť bez problémov.Prerekvizity:Potrebujetepython3amakePotrebujete kompilátory C/C++ (gcc/clang/...), Pascalu (fpc), Javy, Rustu (rustc) – samozrejme iba pre jazyky ktoré plánujete spúštaťNaMacOSpotrebujete nainštalovaťcoreutilsagccvšetko potrebné napríklad pomocoubrew install coreutils gcc make python3Nepovinnetime(Linux) /gnu-time(MacOS)  (nestačí bashová funkcia) ak chcemeReal/User/SystemčasyNainštalujte cezpip:pip3installinput-tool# alebopip3installgit+https://github.com/fezjo/input-tool.git# alebogitclonegit@github.com:fezjo/input-tool.git
pip3install-e.# nezabudnite mať inštalačný priečinok v PATHAktualizuje sa pomocou:pip3install-Ugit+https://github.com/fezjo/input-tool.git# alebogitpullinput-sampleTento skript dostane na vstupe (alebo ako argument) zadanie príkladu. Vyrobí (defaultne v priečinku./test) sample vstupy a sample výstupy pre tento príklad.Defaultne pomenúva súbory00.sample.inresp.00.sample.x.in, ak je ich viac. Viete mu povedať, aby pomenúval vstupy inak, napr.0.sample.in, alebo00.sample.a.inaj keď je len jeden vstup. Dá sa nastaviť priečinok, kde sa vstupy a výstupy zjavia, a tiež prípony týchto súborov.Príklady použitia:input-sample-h
input-sampleprikl1.md
input-sample-p0.sample<cesta/k/zadaniam/prikl2.mdinput-generatorNajskôr treba nakódiťgenerátor, ktorý nazvitegen(teda napr.gen.cppalebogen.py).Následne vytvoríteIDF, vysvetlené nižšie.Spustíteinput-generatorpomocouinput-generator idfa tešíte sa.GenerátorNázov generátoru sa začínagen(napríkladgen.cpp). Generátor je program, ktorý berie na vstupe jeden riadok (kde dáte čo chcete, napríklad dve čísla, maximálne $n$ a $m$.) Tento program vypíše, normálne nastdout, jeden vstup úlohy.Dávajte si pozor, aby bol vypísaný vstup korektný, žiadne medzery na koncoch riadkov, dodržujte limity, čo sľubujete v zadaní (toto všetko vieme automatizovane zaručiť s pomocou validátora). Jedna z vecí, čo je dobré robiť, je generovať viacero typov vstupov. (Povedzme náhodné čísla, veľa clustrov rovnakých, samé párne lebo vtedy je bruteforce pomalý, atď.) To je dobré riešiť tak, že jedno z čísel, čo generátor dostane na vstupe je typ, podľa ktorého sa rozhodne, čo vygeneruje.# Odporúčané je použiť základný tvar:input-generator.IDFIDF (Input Description File) je súbor, ktorý popisuje, ako vyzerajú sady a vstupy. Jeden riadok IDF slúži na vyrobenie jedného vstupu (až na špeciálne riadky). Každý takýto riadok poslúži ako vstup pre generátor a to, čo generátor vypľuje sa uloží do správneho súboru, napr.02.a.in. Čiže do IDF chcete obvykle písať veci ako maximálne $n$ (alebo aj presné $n$), typ vstupu, počet hrán grafu, atď., ale to už je na generátori aby sa rozhodol, čo s tými číslami spraví.Sady v IDF oddeľujeme práznymi riadkami. Sady sú číslované1..9, ak je ich napr.20, tak01..20. Vstupy v jednej sade sú postupne písmenkovanéa-z(ak je ich veľa, tak sa použije viac písmen).Príklad IDF# id pocet_vrcholov pocet_hran pocet_hracov
# 1. sada
{id} 10 1000 1
{id} 20 1000 2
{id} 30 1000 3

# 2.sada
$ hran: !eval 1e6
{id} 1000 {hran} 1
{id} 1000 {hran} 2Vyrobí postupne vstupy1.a.in,1.b.in,1.c.in,2.a.in,2.b.in.Ak chcete niečim inicializovaťseedvo svojom generátore, tak rozumný nápad je{id}, pretože to je deterministické a zároveň unikátne pre každý vstup. Deterministické vstupy majú výhodu, že ak niekto iný pustíinput-generators rovnakými parametrami a rovnakým IDF, dostane rovnaké vstupy.input-testerCieľom tohto skriptu je otestovať všetky riešenia na vstupoch, overiť, či dávajú správne výstupy, zmerať čas behu a podobne.Pozor, slúži to len na domáce testovanie, netestujte tým nejaké reálne kontesty, kde môžu užívatelia submitovať čo chcú. Nemá to totiž žiaden sandbox ani žiadnu ochranu pred neprajníkmi.input-testersa používa veľmi jednoducho. Iba spustíteinput-tester <zoznam riešení>a ono to porobí všetko samé.Odporúčame mať na konci.bashrcalebo pri spustení terminálu nastaviť kompilátory podobne ako sú na testovači, teda napríkladexport CXXFLAGS="-O2 -std=gnu++11 -Wno-unused-result -DDG=1", avšakinput-testermá nastavené rozumné predvolené hodnoty.Riešenia pomenúvame s prefixom 'sol' štýlomsol-<hodnotenie>-<autor>-<algoritmus>-<zlozitost>.<pripona>. Teda názov má podmnožinu týchto častí v tomto poradí, teda napríkladsol-75-fero-zametanie-n2.cppalebosol-100-dezo.py. Validátor má prefix 'val', prípadný hodnotič 'check'.Generovanie výstupovAk ešte neexistuje vzorový výstup ku nejakému vstupu (teda napríklad ste práve vygenerovali vstupy), použije sa prvý program na jeho vygenerovanie. Ostatné programy porovnávajú svoje výstupy s týmto.Dôležité je, aby program, ktorý generuje výstupy zbehol na všetkých vstupoch správne. Pokial by sa niekde zrúbal/vyTLEl, tak môžu byť výstupy pošahané.Užitočné prepínače-t --timeNeoptimálne riešenia by často bežali zbytočne dlho, ak vôbec aj dobehli. Tento argument nastaví časový limit v sekundách. Vie to byť desatinné číslo. Vie to byť rôzne pre jednotlivé jazyky. Napríklad-t 1,t -0.5alebo-t "3,cpp=1,py=5".-F --no-fskipŠtandardne sa programy, ktoré na niektorom vstupe zlyhali nevyhodnocujú na zvyšných testov v danej sade. Takto to funguje na niektorých súťažiach a urýchľuje to testovanie napríklad bruteforcov. Často však takéto správanie necheme a preto ho môžeme týmto argumentom vypnúť.-R --ResetUž existujú výstupy ale sú zlé?-Rprepíše výstupy nanovo tým, čo vyrobí prvý program.-d --diffNiektoré úlohy potrebujú na určenie správnosti hodnotič. Ten vie byť automaticky určený ak ako argument uvedieme priečinok v ktorom sa nachádza a hodnotič má štandardné meno. Ak tieto podmienky nie sú splnené, vieme ho manuálne určiť pomocou tohoto argumentu, napríklad-d checker.py.-D --show-diff-outputAk je výsledkom testovania WA, vypíše sa skrátený výstup hodnotiča. Pri štandardnomdiffe sa vypíše porovnanie riadkov vedľa seba.--pythoncmdNiekedy by sme boli radi, keby Python nebol taký pomalý. To sa dá väčšinou vyriešiť použitímPyPyinterpretera. Dokážeme to určiť pomocou tohoto argumentu, použitím--pythoncmd pypy3.-j --threadsKompilovanie, generovanie aj testovanie vieme značne urýchliť paralelizáciou. Tento argument určuje, koľko vlákien sa má použiť. Väčšinou existuje optimálny počet vlákien, ktorý je menší ako počet dostupných vlákien vášho procesoru. Odporúčame teda občas a hlavne pred zverejnením úloh pretestovať riešenia bez paralelizácie (-j 1).Príklady# pomoc!input-tester-h# najzákladnejšie použitie, keď máme všetko v aktuálnom priečinkuinput-tester.# chceme spustiť iba vzorové riešeniainput-testersol-100*# chceme vidieť na ktorých všetkých vstupoch programy nefungujú (nielen na ktorých# sadách), chceme vidieť ako sa líšia od vzorového výstupu a robíme to sériovoinput-tester-FD-j1.# bežné použitie, ak si dáme všetky riešenia do priečinku `sols`input-tester-t"3,cpp=0.5,py=5"sols.# ak požívame názvoslovie ktoré input-tool nevie dobre rozpoznať, môžeme najprv# spustiť vzorové riešenie ktoré vygeneruje výstupy a následne použiť wildcardyinput-tester-Rvzorove-riesenie.py
input-tester.vzor*ries*program2.cppcokolvek.pyPokročiléAk chcete vedieť, aké cool veci navyše dokážuinput-generatoraIDF, prečítajte si o nich v súboreGENERATOR.md.Ak chcete vedieť, aké cool veci navyše dokážeinput-testeraako písať validátor a hodnotič, prečítajte si o tom v súboreTESTER.md.FeedbackAk vám niečo nefunguje, alebo vám chýba nejaká funkcionalita, napíšte mi, prosím, mail alebo vyrobte issue.