Skip to main content

Tool which simplifies creating and testing inputs for programming contests.

Project description

Zmeny voči jablkoj

Mergnuté zmeny
  • Podpora priečinkov v zozname programov (automatické načítanie všetkých riešení, validátorov a checkera z priečinku)
  • Časovanie
    • Desatinný timelimit -t 0.5
    • Jazykový timelimit -t "3,cpp=1,py=5"
    • Detailnejšie vypisovanie trvania programov
      • Milisekundová presnosť
      • Zobrazovanie celkového času namiesto User time
      • Vypisovanie Real/User/System time
      • TLE čas sa neráta do Max time
    • Varovný timelimit pomocou --wtime
  • Lepšie predvolené nastavenia
    • Preskakovanie zvyšných vstupov v sade po odmietnutí (vypnúť cez -F)
    • Štatistiky po vyhodnotení (vypnúť cez --no-statistics)
    • Kompilovanie C++ s optimalizáciami a novším štandardom
    • Zvýšené limity pre pamäť a zásobník
    • Deduplikovanie programov na vstupe (vypnúť cez --dupprog)
    • Paralelné generovanie vstupov a testovanie (pomocou prepínača -j)
  • Podpora alternatívnych Python interpreterov (PyPy) pomocou --pythoncmd cmd
  • Rozšírená funkcionalita IDF o vlastné premenné
  • Možnosť nemať nainštalovaný time
  • Zrušená podpora pre Python2
  • Kompilovanie Java riešení v dočasnom priečinku
  • Informovanie o neúspešnom generovaní vstupov
  • Sformátovaný a otypovaný kód
  • Prepísané README
  • Bugfixes
Nemergnuté zmeny
  • Podpora MacOS
  • Rôzne malé vylepšenia, refaktorovanie, bugfixy
  • Rozšírená funkcionalita IDF o podporu YAML a !eval
  • Poetry manager
  • Kontrola aktualizácií pri spustení generátora
  • Podpora priečinka ako argument pre input-generator a input-sample – automatické načítanie IDF a zadania
  • Automatický 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činku prog/ (zmena pomocou prepínača --progdir)
  • Začaté písanie testov
  • Plne paralelné kompilovanie a testovanie
  • Generovanie vstupov predvolene pomocou pypy3
  • Zmodernizovaný a zrefaktorovaný kód
  • JSON výstup testera
  • Bugfixes

Rýchlokurz

# napíšeme si riešenia, generátor, idf a potom:
input-sample . # priečinok so zadanie.md
input-generator .
input-tester .

# o pomoc požiadame `input-<program> -h`, napríklad:
input-generator -h

input-tool

Ná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-generator a input-tester.

Inštalácia

Na Linuxe a MacOS je to dosť jednoduché. Windows nie je podporovaný, ale pod WSL by to malo ísť bez problémov.

  1. Prerekvizity:

    • Potrebujete python3 a make
    • Potrebujete kompilátory C/C++ (gcc/clang/...), Pascalu (fpc), Javy, Rustu (rustc) – samozrejme iba pre jazyky ktoré plánujete spúštať
    • Na MacOS potrebujete nainštalovať coreutils a gcc
      • všetko potrebné napríklad pomocou brew install coreutils gcc make python3
    • Nepovinne time (Linux) / gnu-time (MacOS) (nestačí bashová funkcia) ak chceme Real/User/System časy
  2. Nainštalujte cez pip:

    pip3 install git+https://github.com/fezjo/input-tool.git
    # alebo
    git clone git@github.com:fezjo/input-tool.git
    pip3 install -e .
    # nezabudnite mať inštalačný priečinok v PATH
    

    Aktualizuje sa pomocou:

    pip3 install -U git+https://github.com/fezjo/input-tool.git
    # alebo
    git pull
    

input-sample

Tento 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úbory 00.sample.in resp. 00.sample.x.in, ak je ich viac. Viete mu povedať, aby pomenúval vstupy inak, napr. 0.sample.in, alebo 00.sample.a.in aj 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-sample prikl1.md
input-sample -p 0.sample < cesta/k/zadaniam/prikl2.md

input-generator

  1. Najskôr treba nakódiť generátor, ktorý nazvite gen (teda napr. gen.cpp alebo gen.py).
  2. Následne vytvoríte IDF, vysvetlené nižšie.
  3. Spustíte input-generator pomocou input-generator idf a tešíte sa.

Generátor

Názov generátoru sa začína gen (napríklad gen.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 na stdout, 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 .

IDF

IDF (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, tak 01..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} 2

Vyrobí postupne vstupy 1.a.in, 1.b.in, 1.c.in, 2.a.in, 2.b.in.

Ak chcete niečim inicializovať seed vo 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-generator s rovnakými parametrami a rovnakým IDF, dostane rovnaké vstupy.

input-tester

Cieľ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-tester sa používa veľmi jednoducho. Iba spustíte input-tester <zoznam riešení> a ono to porobí všetko samé.

Odporúčame mať na konci .bashrc alebo pri spustení terminálu nastaviť kompilátory podobne ako sú na testovači, teda napríklad export CXXFLAGS="-O2 -std=gnu++11 -Wno-unused-result -DDG=1", avšak input-tester má nastavené rozumné predvolené hodnoty.

Riešenia pomenúvame s prefixom 'sol' štýlom sol-<hodnotenie>-<autor>-<algoritmus>-<zlozitost>.<pripona>. Teda názov má podmnožinu týchto častí v tomto poradí, teda napríklad sol-75-fero-zametanie-n2.cpp alebo sol-100-dezo.py. Validátor má prefix 'val', prípadný hodnotič 'check'.

Generovanie výstupov

Ak 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 --time

Neoptimá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.5 alebo -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 --Reset

Už existujú výstupy ale sú zlé? -R prepíše výstupy nanovo tým, čo vyrobí prvý program.

-d --diff

Niektoré ú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-output

Ak je výsledkom testovania WA, vypíše sa skrátený výstup hodnotiča. Pri štandardnom diffe sa vypíše porovnanie riadkov vedľa seba.

--pythoncmd

Niekedy by sme boli radi, keby Python nebol taký pomalý. To sa dá väčšinou vyriešiť použitím PyPy interpretera. Dokážeme to určiť pomocou tohoto argumentu, použitím --pythoncmd pypy3.

-j --threads

Kompilovanie, 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činku
input-tester .
# chceme spustiť iba vzorové riešenia
input-tester sol-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ériovo
input-tester -FD -j 1 .
# 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ť wildcardy
input-tester -R vzorove-riesenie.py
input-tester . vzor* ries* program2.cpp cokolvek.py

Pokročilé

Ak chcete vedieť, aké cool veci navyše dokážu input-generator a IDF, prečítajte si o nich v súbore GENERATOR.md.

Ak chcete vedieť, aké cool veci navyše dokáže input-tester a ako písať validátor a hodnotič, prečítajte si o tom v súbore TESTER.md.

Feedback

Ak vám niečo nefunguje, alebo vám chýba nejaká funkcionalita, napíšte mi, prosím, mail alebo vyrobte issue.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

input_tool-1.6.2.tar.gz (39.5 kB view details)

Uploaded Source

Built Distribution

input_tool-1.6.2-py3-none-any.whl (42.2 kB view details)

Uploaded Python 3

File details

Details for the file input_tool-1.6.2.tar.gz.

File metadata

  • Download URL: input_tool-1.6.2.tar.gz
  • Upload date:
  • Size: 39.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.7.1 CPython/3.11.6 Linux/6.7.2-arch1-1

File hashes

Hashes for input_tool-1.6.2.tar.gz
Algorithm Hash digest
SHA256 42e08b8c38f41bf8f0a516cbced2b866dc5d0c62bec162b19af5dd5091bd7ba8
MD5 bbb4a252f45ea2ea9d7e9962a0b5dfba
BLAKE2b-256 775da6bc43cd0827eaf7bcb0f64f99b8e43d80419c5a608ae1aed56a52f5d1ac

See more details on using hashes here.

File details

Details for the file input_tool-1.6.2-py3-none-any.whl.

File metadata

  • Download URL: input_tool-1.6.2-py3-none-any.whl
  • Upload date:
  • Size: 42.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.7.1 CPython/3.11.6 Linux/6.7.2-arch1-1

File hashes

Hashes for input_tool-1.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 72c5be8a6e64e8ba08a4de69e2eceebdfb330cfcabfdb2f986f58bd31b334a77
MD5 04c6820b5ed32248a9b1fd487b5cd707
BLAKE2b-256 a767e75fbed4e40b018ce9363d19a4fedfb5ceda0df62dc146a9c3551f08d19f

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page