{"id":37063233,"url":"https://github.com/fezjo/input-tool","last_synced_at":"2026-01-14T07:03:48.167Z","repository":{"id":154172409,"uuid":"537092894","full_name":"fezjo/input-tool","owner":"fezjo","description":"Tool which simplifies creating and testing inputs for programming contests.","archived":false,"fork":false,"pushed_at":"2025-07-20T22:23:06.000Z","size":492,"stargazers_count":1,"open_issues_count":0,"forks_count":2,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-10-25T14:48:00.997Z","etag":null,"topics":["benchmark","competitive-programming","contests","tool"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"jablkoj/input-tool","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fezjo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-09-15T15:34:44.000Z","updated_at":"2025-07-20T22:23:10.000Z","dependencies_parsed_at":null,"dependency_job_id":"a576932f-f31f-4822-8cc2-7e79aa366a15","html_url":"https://github.com/fezjo/input-tool","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/fezjo/input-tool","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fezjo%2Finput-tool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fezjo%2Finput-tool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fezjo%2Finput-tool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fezjo%2Finput-tool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fezjo","download_url":"https://codeload.github.com/fezjo/input-tool/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fezjo%2Finput-tool/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28412495,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T05:26:33.345Z","status":"ssl_error","status_checked_at":"2026-01-14T05:21:57.251Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["benchmark","competitive-programming","contests","tool"],"created_at":"2026-01-14T07:03:47.594Z","updated_at":"2026-01-14T07:03:48.158Z","avatar_url":"https://github.com/fezjo.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Zmeny voči jablkoj\n\n\u003cdetails\u003e\n\u003csummary\u003eMergnuté zmeny\u003c/summary\u003e\n\n- **Podpora priečinkov v zozname programov** (automatické načítanie všetkých riešení, validátorov a checkera z priečinku)\n- Časovanie\n  - Desatinný timelimit `-t 0.5`\n  - **Jazykový timelimit** `-t \"3,cpp=1,py=5\"`\n  - Detailnejšie vypisovanie trvania programov\n    - **Milisekundová presnosť**\n    - Zobrazovanie celkového času namiesto _User time_\n    - Vypisovanie _Real/User/System time_\n    - TLE čas sa neráta do `Max time`\n  - Varovný timelimit pomocou `--wtime`\n- Lepšie predvolené nastavenia\n  - **Preskakovanie zvyšných vstupov** v sade po odmietnutí (vypnúť cez `-F`)\n  - Štatistiky po vyhodnotení (vypnúť cez `--no-statistics`)\n  - **Kompilovanie C++ s optimalizáciami a novším štandardom**\n  - Zvýšené limity pre pamäť a zásobník\n  - Deduplikovanie programov na vstupe (vypnúť cez `--dupprog`)\n  - **Paralelné generovanie vstupov a testovanie** (pomocou prepínača `-j`)\n- Podpora alternatívnych Python interpreterov (**PyPy**) pomocou `--pythoncmd cmd`\n- **Rozšírená funkcionalita IDF o vlastné premenné**\n- Možnosť nemať nainštalovaný `time`\n- Zrušená podpora pre Python2\n- Kompilovanie Java riešení v dočasnom priečinku\n- Informovanie o neúspešnom generovaní vstupov\n- Sformátovaný a otypovaný kód\n- Prepísané README\n- Bugfixes\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eNemergnuté zmeny\u003c/summary\u003e\n\n- `--best-only` prepínač pre tester\n- **Zjednotený nástroj `itool`**\n- **Okresané CLI parametre, BREAKING CHANGE**\n- **Podpora starého formátu IDF**\n- **Varovania pre dlhé behy a objemné vstupno-výstupné dáta**\n- **Podpora MacOS**\n- Rôzne malé vylepšenia, refaktorovanie, bugfixy\n- **Rozšírená funkcionalita IDF o podporu YAML a `!eval`**\n- **Poetry manager**\n- Kontrola aktualizácií pri spustení generátora\n- Podpora priečinka ako argument pre `itool generate` a `itool sample` \u0026ndash; automatické načítanie IDF a zadania\n- Automatický varovný timelimit tesných riešení\n- **Možnosť výpisať výstup hodnotiča pri WA** (pomocou prepínača `-D`)\n- **Kompilovanie do samostatného priečinku** `prog/` (zmena pomocou prepínača `--progdir`)\n- Začaté písanie testov\n- **Plne paralelné kompilovanie a testovanie**\n- Generovanie vstupov predvolene pomocou `pypy3`\n- Zmodernizovaný a zrefaktorovaný kód\n- JSON výstup testera\n- Bugfixes\n\n\u003c/details\u003e\n\n## Rýchlokurz\n\n```bash\n# napíšeme si riešenia, generátor, idf a potom:\nitool s . # priečinok so zadanie.md\nitool g .\nitool t .\n\n# o pomoc požiadame `itool [podpríkaz] -h`, napríklad:\nitool t -h\n```\n\n# `input-tool`\n\nNástroj, ktorý výrazne zjednodušuje vytváranie a testovanie vstupov pre súťažné programátorské príklady. Umožňuje automatizovane generovať vstupy, vytvárať vzorové výstupy, kompilovať a testovať riešenia, merať čas ich behu, ...\n\n## Inštalácia\n\nNa **Linuxe** a **MacOS** je to dosť jednoduché. Windows nie je podporovaný, ale pod **WSL** by to malo ísť bez problémov.\n\n### Prerekvizity:\n\n- Na **Windows** `input-tool` funguje iba pod **WSL**\n  \u003cdetails\u003e\n  \u003csummary\u003eInštalácia WSL\u003c/summary\u003e\n\n  ```powershell\n  # spustite Powershell ako administátor (pravý klik na ikonu a \"Run as administrator\")\n  wsl --install # nainštaluje WSL\n  # reštartujte počítač\n  # znovu otvorte Powershell\n  wsl           # spustí WSL\n  # pokračujte ako na Ubuntu\n  ```\n\n  \u003c/details\u003e\n\n- Na **MacOS** potrebujete nainštalovať `coreutils` a `gcc`\n  - všetko potrebné získate napríklad pomocou `brew install coreutils gcc make python3`\n- Potrebujete `python3` ($\\geq 3.8$) a `make`\n- Potrebujete kompilátory C/C++ (`gcc/clang/...`), Pascalu (`fpc`), Javy, Rustu (`rustc`) \u0026ndash; samozrejme iba pre jazyky ktoré plánujete spúštať\n- _Nepovinne_ `time` (Linux) / `gnu-time` (MacOS) (nestačí bashová funkcia) ak chceme _Real/User/System_ časy\n\n### Inštalácia na Ubuntu\n\n```bash\n# nainštalujeme prerekvizity\nsudo apt update\nsudo apt install gcc g++ make python3 python3-pip pipx\npipx ensurepath\n# nainštalujeme input-tool\npipx install input-tool\n# neskôr môžeme aktualizovať\npipx upgrade input-tool\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eRôzne spôsoby inštalácie\u003c/summary\u003e\n\n```bash\n# pomocou pipx\npipx install input-tool\n# aktualizujeme podobne\npipx upgrade input-tool\n\n# pomocou pip\npip3 install --break-system-packages input-tool\n# aktualizujeme podobne\npip3 install -U --break-system-packages input-tool\n\n# inštalácia z Githubu namiesto PyPi\npipx install git+https://github.com/fezjo/input-tool.git\n# alebo\ngit clone https://github.com/fezjo/input-tool.git\ncd input-tool\npipx install -e .\n```\n\n\u003c/details\u003e\n\n### Problémy na Windows WSL\n\nČasto sa stáva, že program pod WSL beží oveľa pomalšie ako na Linuxe (dostáva TLE), konkrétne pri programoch s veľkým vstupom/výstupom. Toto sa deje ak WSL musí pracovať so súborovým systémom Windowsu. Riešenie je presunúť priečinok v ktorom pripravujeme úlohu do WSL (teda `/home/username/...` namiesto `/mnt/c/...`).\n\n# `itool`\n\nVšetky príkazy sú dostupné pod jedným príkazom `itool`. Tento príkaz má niekoľko podpríkazov, ktoré sa dajú spustiť pomocou `itool \u003csubcommand\u003e`. Tieto podpríkazy sú:\n\n- `generate` (alebo `g`)\n- `sample` (alebo `s`)\n- `test` (alebo `t`)\n- `compile` (alebo `c`), `colortest`, `checkupdates`\n\n# `itool sample`\n\nTento 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.\n\nDefaultne 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.\n\nPríklady použitia:\n\n```bash\nitool sample -h\nitool sample prikl1.md\nitool sample --batchname 0.sample \u003c cesta/k/zadaniam/prikl2.md\n```\n\n# `itool generate`\n\n1. Najskôr treba nakódiť **generátor**, ktorý nazvite `gen` (teda napr. `gen.cpp` alebo `gen.py`).\n2. Následne vytvoríte **IDF**, vysvetlené nižšie.\n3. Spustíte generátor pomocou `itool generate idf` a tešíte sa.\n\n## Generátor\n\nNá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.\n\nDá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.\n\n```bash\n# Odporúčané je použiť základný tvar:\nitool generate .\n```\n\n## IDF\n\nIDF (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í.\n\nSady 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).\n\nPríklad IDF\n\n```r\n# id pocet_vrcholov pocet_hran pocet_hracov\n# 1. sada\n{id} 10 1000 1\n{id} 20 1000 2\n{id} 30 1000 3\n\n# 2.sada\n$ hran: !eval 1e6\n{id} 1000 {hran} 1\n{id} 1000 {hran} 2\n```\n\nVyrobí postupne vstupy `1.a.in`, `1.b.in`, `1.c.in`, `2.a.in`, `2.b.in`.\n\n**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í `itool generate` s rovnakými parametrami a rovnakým IDF, dostane rovnaké vstupy.\n\nNajlepší jazyk na zvýraznenie IDF je _R_ alebo _Perl_ -- má rovnaké komentáre a zvýrazňuje `{}` a `!eval`.\n\n# `itool test`\n\nCieľom tohto skriptu je otestovať všetky riešenia na vstupoch, overiť, či dávajú správne výstupy, zmerať čas behu a podobne.\n\n**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.\n\n`itool test` sa používa veľmi jednoducho. Iba spustíte `itool test \u003czoznam riešení\u003e` a ono to porobí všetko samé.\n\nOdporúč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 `itool test` má nastavené rozumné predvolené hodnoty.\n\nRiešenia pomenúvame s prefixom '`sol`' štýlom `sol-\u003chodnotenie\u003e-\u003cautor\u003e-\u003calgoritmus\u003e-\u003czlozitost\u003e.\u003cpripona\u003e`. 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`'.\n\n### Generovanie výstupov\n\nAk 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.\n\nDô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é.\n\n## Užitočné prepínače\n\n### `-t --time`\n\nNeoptimá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\"`.\n\n### `-F --no-fail-skip`\n\nŠ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úť.\n\n### `-R --Reset`\n\nUž existujú výstupy ale sú zlé? `-R` prepíše výstupy nanovo tým, čo vyrobí prvý program.\n\n### `-d --diff`\n\nNiektoré ú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`.\n\n### `-D --show-diff-output`\n\nAk je výsledkom testovania WA, vypíše sa skrátený výstup hodnotiča. Pri štandardnom `diff`e sa vypíše porovnanie riadkov vedľa seba.\n\n### `--pythoncmd`\n\nNiekedy 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`.\n\n### `-j --threads`\n\nKompilovanie, 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`).\n\n### Príklady\n\n```bash\n# pomoc!\nitool test -h\n# najzákladnejšie použitie, keď máme všetko v aktuálnom priečinku\nitool test .\n# chceme spustiť iba vzorové riešenia\nitool test sol-100*\n# chceme vidieť na ktorých všetkých vstupoch programy nefungujú (nielen na ktorých\n# sadách), chceme vidieť ako sa líšia od vzorového výstupu a robíme to sériovo\nitool test -FD -j 1 .\n# bežné použitie, ak si dáme všetky riešenia do priečinku `sols`\nitool test -t \"3,cpp=0.5,py=5\" sols .\n# ak požívame názvoslovie ktoré input-tool nevie dobre rozpoznať, môžeme najprv\n# spustiť vzorové riešenie ktoré vygeneruje výstupy a následne použiť wildcardy\nitool test -R vzorove-riesenie.py\nitool test . vzor* ries* program2.cpp cokolvek.py\n```\n\n# Pokročilé\n\nAk chcete vedieť, aké cool veci navyše dokážu `itool generate` a `IDF`, prečítajte si o nich v súbore [`GENERATOR.md`](GENERATOR.md).\n\nAk chcete vedieť, aké cool veci navyše dokáže `itool test` a **ako písať validátor a hodnotič**, prečítajte si o tom v súbore [`TESTER.md`](TESTER.md).\n\n# Feedback\n\nAk vám niečo nefunguje, alebo vám chýba nejaká funkcionalita, napíšte mi, prosím, mail alebo vyrobte issue.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffezjo%2Finput-tool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffezjo%2Finput-tool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffezjo%2Finput-tool/lists"}