input-tool


Nameinput-tool JSON
Version 2.0.2 PyPI version JSON
download
home_pagehttps://github.com/fezjo/input-tool/
SummaryTool which simplifies creating and testing inputs for programming contests.
upload_time2024-03-12 19:25:49
maintainer
docs_urlNone
authorjablkoj (Ján Hozza)
requires_python>=3.8,<4.0
licenseMIT
keywords benchmark contests competitive-programming tool
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ## Zmeny voči jablkoj

<details>
<summary>Mergnuté zmeny</summary>

- **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

</details>

<details>
<summary>Nemergnuté zmeny</summary>

- `--best-only` prepínač pre tester
- **Zjednotený nástroj `itool`**
- **Okresané CLI parametre, BREAKING CHANGE**
- **Podpora starého formátu IDF**
- **Varovania pre dlhé behy a objemné vstupno-výstupné dáta**
- **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 `itool generate` a `itool sample` &ndash; 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

</details>

## Rýchlokurz

```bash
# napíšeme si riešenia, generátor, idf a potom:
itool s . # priečinok so zadanie.md
itool g .
itool t .

# o pomoc požiadame `itool [podpríkaz] -h`, napríklad:
itool t -h
```

# `input-tool`

Ná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, ...

## 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` ($\geq 3.8$) a `make`
   - Potrebujete kompilátory C/C++ (`gcc/clang/...`), Pascalu (`fpc`), Javy, Rustu (`rustc`) &ndash; 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 z PyPi:

   ```bash
   pipx install input-tool
   # alebo ak nemáte pipx
   pip3 install --break-system-packages input-tool

   # aktualizujeme podobne
   pipx upgrade input-tool
   # alebo
   pip3 install -U --break-system-packages input-tool
   ```

   <details>
   <summary>Inštalácia z Githubu</summary>

   ```bash
   pipx install git+https://github.com/fezjo/input-tool.git

   git clone https://github.com/fezjo/input-tool.git
   cd input-tool
   pipx install -e .
   ```

   </details>

# `itool`

Vš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 <subcommand>`. Tieto podpríkazy sú:

- `generate` (alebo `g`)
- `sample` (alebo `s`)
- `test` (alebo `t`)
- `compile` (alebo `c`), `colortest`, `checkupdates`

# `itool 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:

```bash
itool sample -h
itool sample prikl1.md
itool sample --batchname 0.sample < cesta/k/zadaniam/prikl2.md
```

# `itool generate`

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 generátor pomocou `itool generate 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.

```bash
# Odporúčané je použiť základný tvar:
itool generate .
```

## 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

```perl
# 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í `itool generate` s rovnakými parametrami a rovnakým IDF, dostane rovnaké vstupy.

Najlepší jazyk na zvýraznenie IDF je _Perl_ -- má rovnaké komentáre a zvýrazňuje `{}` a `!eval`.

# `itool test`

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.

`itool test` sa používa veľmi jednoducho. Iba spustíte `itool test <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 `itool test` 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-fail-skip`

Š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 `diff`e 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

```bash
# pomoc!
itool test -h
# najzákladnejšie použitie, keď máme všetko v aktuálnom priečinku
itool test .
# chceme spustiť iba vzorové riešenia
itool test 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
itool test -FD -j 1 .
# bežné použitie, ak si dáme všetky riešenia do priečinku `sols`
itool test -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
itool test -R vzorove-riesenie.py
itool test . vzor* ries* program2.cpp cokolvek.py
```

# Pokročilé

Ak 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).

Ak 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).

# Feedback

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

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/fezjo/input-tool/",
    "name": "input-tool",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.8,<4.0",
    "maintainer_email": "",
    "keywords": "benchmark,contests,competitive-programming,tool",
    "author": "jablkoj (J\u00e1n Hozza)",
    "author_email": "",
    "download_url": "https://files.pythonhosted.org/packages/6f/73/3620e1e168c4fed1cc3fabbc910d282d46dd7bfd7d6030b2527c75a8be9e/input_tool-2.0.2.tar.gz",
    "platform": null,
    "description": "## Zmeny vo\u010di jablkoj\n\n<details>\n<summary>Mergnut\u00e9 zmeny</summary>\n\n- **Podpora prie\u010dinkov v zozname programov** (automatick\u00e9 na\u010d\u00edtanie v\u0161etk\u00fdch rie\u0161en\u00ed, valid\u00e1torov a checkera z prie\u010dinku)\n- \u010casovanie\n  - Desatinn\u00fd timelimit `-t 0.5`\n  - **Jazykov\u00fd timelimit** `-t \"3,cpp=1,py=5\"`\n  - Detailnej\u0161ie vypisovanie trvania programov\n    - **Milisekundov\u00e1 presnos\u0165**\n    - Zobrazovanie celkov\u00e9ho \u010dasu namiesto _User time_\n    - Vypisovanie _Real/User/System time_\n    - TLE \u010das sa ner\u00e1ta do `Max time`\n  - Varovn\u00fd timelimit pomocou `--wtime`\n- Lep\u0161ie predvolen\u00e9 nastavenia\n  - **Preskakovanie zvy\u0161n\u00fdch vstupov** v sade po odmietnut\u00ed (vypn\u00fa\u0165 cez `-F`)\n  - \u0160tatistiky po vyhodnoten\u00ed (vypn\u00fa\u0165 cez `--no-statistics`)\n  - **Kompilovanie C++ s optimaliz\u00e1ciami a nov\u0161\u00edm \u0161tandardom**\n  - Zv\u00fd\u0161en\u00e9 limity pre pam\u00e4\u0165 a z\u00e1sobn\u00edk\n  - Deduplikovanie programov na vstupe (vypn\u00fa\u0165 cez `--dupprog`)\n  - **Paraleln\u00e9 generovanie vstupov a testovanie** (pomocou prep\u00edna\u010da `-j`)\n- Podpora alternat\u00edvnych Python interpreterov (**PyPy**) pomocou `--pythoncmd cmd`\n- **Roz\u0161\u00edren\u00e1 funkcionalita IDF o vlastn\u00e9 premenn\u00e9**\n- Mo\u017enos\u0165 nema\u0165 nain\u0161talovan\u00fd `time`\n- Zru\u0161en\u00e1 podpora pre Python2\n- Kompilovanie Java rie\u0161en\u00ed v do\u010dasnom prie\u010dinku\n- Informovanie o ne\u00faspe\u0161nom generovan\u00ed vstupov\n- Sform\u00e1tovan\u00fd a otypovan\u00fd k\u00f3d\n- Prep\u00edsan\u00e9 README\n- Bugfixes\n\n</details>\n\n<details>\n<summary>Nemergnut\u00e9 zmeny</summary>\n\n- `--best-only` prep\u00edna\u010d pre tester\n- **Zjednoten\u00fd n\u00e1stroj `itool`**\n- **Okresan\u00e9 CLI parametre, BREAKING CHANGE**\n- **Podpora star\u00e9ho form\u00e1tu IDF**\n- **Varovania pre dlh\u00e9 behy a objemn\u00e9 vstupno-v\u00fdstupn\u00e9 d\u00e1ta**\n- **Podpora MacOS**\n- R\u00f4zne mal\u00e9 vylep\u0161enia, refaktorovanie, bugfixy\n- **Roz\u0161\u00edren\u00e1 funkcionalita IDF o podporu YAML a `!eval`**\n- **Poetry manager**\n- Kontrola aktualiz\u00e1ci\u00ed pri spusten\u00ed gener\u00e1tora\n- Podpora prie\u010dinka ako argument pre `itool generate` a `itool sample` &ndash; automatick\u00e9 na\u010d\u00edtanie IDF a zadania\n- Automatick\u00fd varovn\u00fd timelimit tesn\u00fdch rie\u0161en\u00ed\n- **Mo\u017enos\u0165 v\u00fdpisa\u0165 v\u00fdstup hodnoti\u010da pri WA** (pomocou prep\u00edna\u010da `-D`)\n- **Kompilovanie do samostatn\u00e9ho prie\u010dinku** `prog/` (zmena pomocou prep\u00edna\u010da `--progdir`)\n- Za\u010dat\u00e9 p\u00edsanie testov\n- **Plne paraleln\u00e9 kompilovanie a testovanie**\n- Generovanie vstupov predvolene pomocou `pypy3`\n- Zmodernizovan\u00fd a zrefaktorovan\u00fd k\u00f3d\n- JSON v\u00fdstup testera\n- Bugfixes\n\n</details>\n\n## R\u00fdchlokurz\n\n```bash\n# nap\u00ed\u0161eme si rie\u0161enia, gener\u00e1tor, idf a potom:\nitool s . # prie\u010dinok so zadanie.md\nitool g .\nitool t .\n\n# o pomoc po\u017eiadame `itool [podpr\u00edkaz] -h`, napr\u00edklad:\nitool t -h\n```\n\n# `input-tool`\n\nN\u00e1stroj, ktor\u00fd v\u00fdrazne zjednodu\u0161uje vytv\u00e1ranie a testovanie vstupov pre s\u00fa\u0165a\u017en\u00e9 program\u00e1torsk\u00e9 pr\u00edklady. Umo\u017e\u0148uje automatizovane generova\u0165 vstupy, vytv\u00e1ra\u0165 vzorov\u00e9 v\u00fdstupy, kompilova\u0165 a testova\u0165 rie\u0161enia, mera\u0165 \u010das ich behu, ...\n\n## In\u0161tal\u00e1cia\n\nNa **Linuxe** a **MacOS** je to dos\u0165 jednoduch\u00e9. Windows nie je podporovan\u00fd, ale pod **WSL** by to malo \u00eds\u0165 bez probl\u00e9mov.\n\n1. Prerekvizity:\n\n   - Potrebujete `python3` ($\\geq 3.8$) a `make`\n   - Potrebujete kompil\u00e1tory C/C++ (`gcc/clang/...`), Pascalu (`fpc`), Javy, Rustu (`rustc`) &ndash; samozrejme iba pre jazyky ktor\u00e9 pl\u00e1nujete sp\u00fa\u0161ta\u0165\n   - Na **MacOS** potrebujete nain\u0161talova\u0165 `coreutils` a `gcc`\n     - v\u0161etko potrebn\u00e9 napr\u00edklad pomocou `brew install coreutils gcc make python3`\n   - _Nepovinne_ `time` (Linux) / `gnu-time` (MacOS) (nesta\u010d\u00ed bashov\u00e1 funkcia) ak chceme _Real/User/System_ \u010dasy\n\n2. Nain\u0161talujte z PyPi:\n\n   ```bash\n   pipx install input-tool\n   # alebo ak nem\u00e1te pipx\n   pip3 install --break-system-packages input-tool\n\n   # aktualizujeme podobne\n   pipx upgrade input-tool\n   # alebo\n   pip3 install -U --break-system-packages input-tool\n   ```\n\n   <details>\n   <summary>In\u0161tal\u00e1cia z Githubu</summary>\n\n   ```bash\n   pipx install git+https://github.com/fezjo/input-tool.git\n\n   git clone https://github.com/fezjo/input-tool.git\n   cd input-tool\n   pipx install -e .\n   ```\n\n   </details>\n\n# `itool`\n\nV\u0161etky pr\u00edkazy s\u00fa dostupn\u00e9 pod jedn\u00fdm pr\u00edkazom `itool`. Tento pr\u00edkaz m\u00e1 nieko\u013eko podpr\u00edkazov, ktor\u00e9 sa daj\u00fa spusti\u0165 pomocou `itool <subcommand>`. Tieto podpr\u00edkazy s\u00fa:\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\u00edkladu. Vyrob\u00ed (defaultne v prie\u010dinku `./test`) sample vstupy a sample v\u00fdstupy pre tento pr\u00edklad.\n\nDefaultne pomen\u00fava s\u00fabory `00.sample.in` resp. `00.sample.x.in`, ak je ich viac. Viete mu poveda\u0165, aby pomen\u00faval vstupy inak, napr. `0.sample.in`, alebo `00.sample.a.in` aj ke\u010f je len jeden vstup. D\u00e1 sa nastavi\u0165 prie\u010dinok, kde sa vstupy a v\u00fdstupy zjavia, a tie\u017e pr\u00edpony t\u00fdchto s\u00faborov.\n\nPr\u00edklady pou\u017eitia:\n\n```bash\nitool sample -h\nitool sample prikl1.md\nitool sample --batchname 0.sample < cesta/k/zadaniam/prikl2.md\n```\n\n# `itool generate`\n\n1. Najsk\u00f4r treba nak\u00f3di\u0165 **gener\u00e1tor**, ktor\u00fd nazvite `gen` (teda napr. `gen.cpp` alebo `gen.py`).\n2. N\u00e1sledne vytvor\u00edte **IDF**, vysvetlen\u00e9 ni\u017e\u0161ie.\n3. Spust\u00edte gener\u00e1tor pomocou `itool generate idf` a te\u0161\u00edte sa.\n\n## Gener\u00e1tor\n\nN\u00e1zov gener\u00e1toru sa za\u010d\u00edna `gen` (napr\u00edklad `gen.cpp`). Gener\u00e1tor je program, ktor\u00fd berie na vstupe jeden riadok (kde d\u00e1te \u010do chcete, napr\u00edklad dve \u010d\u00edsla, maxim\u00e1lne $n$ a $m$.) Tento program vyp\u00ed\u0161e, norm\u00e1lne na `stdout`, jeden vstup \u00falohy.\n\nD\u00e1vajte si pozor, aby bol vyp\u00edsan\u00fd vstup korektn\u00fd, \u017eiadne medzery na koncoch riadkov, dodr\u017eujte limity, \u010do s\u013eubujete v zadan\u00ed (toto v\u0161etko vieme automatizovane zaru\u010di\u0165 s pomocou valid\u00e1tora). Jedna z vec\u00ed, \u010do je dobr\u00e9 robi\u0165, je generova\u0165 viacero typov vstupov. (Povedzme n\u00e1hodn\u00e9 \u010d\u00edsla, ve\u013ea clustrov rovnak\u00fdch, sam\u00e9 p\u00e1rne lebo vtedy je bruteforce pomal\u00fd, at\u010f.) To je dobr\u00e9 rie\u0161i\u0165 tak, \u017ee jedno z \u010d\u00edsel, \u010do gener\u00e1tor dostane na vstupe je typ, pod\u013ea ktor\u00e9ho sa rozhodne, \u010do vygeneruje.\n\n```bash\n# Odpor\u00fa\u010dan\u00e9 je pou\u017ei\u0165 z\u00e1kladn\u00fd tvar:\nitool generate .\n```\n\n## IDF\n\nIDF (Input Description File) je s\u00fabor, ktor\u00fd popisuje, ako vyzeraj\u00fa sady a vstupy. Jeden riadok IDF sl\u00fa\u017ei na vyrobenie jedn\u00e9ho vstupu (a\u017e na \u0161peci\u00e1lne riadky). Ka\u017ed\u00fd tak\u00fdto riadok posl\u00fa\u017ei ako vstup pre gener\u00e1tor a to, \u010do gener\u00e1tor vyp\u013euje sa ulo\u017e\u00ed do spr\u00e1vneho s\u00faboru, napr. `02.a.in`. \u010ci\u017ee do IDF chcete obvykle p\u00edsa\u0165 veci ako maxim\u00e1lne $n$ (alebo aj presn\u00e9 $n$), typ vstupu, po\u010det hr\u00e1n grafu, at\u010f., ale to u\u017e je na gener\u00e1tori aby sa rozhodol, \u010do s t\u00fdmi \u010d\u00edslami sprav\u00ed.\n\nSady v IDF odde\u013eujeme pr\u00e1znymi riadkami. Sady s\u00fa \u010d\u00edslovan\u00e9 `1..9`, ak je ich napr. `20`, tak `01..20`. Vstupy v jednej sade s\u00fa postupne p\u00edsmenkovan\u00e9 `a-z` (ak je ich ve\u013ea, tak sa pou\u017eije viac p\u00edsmen).\n\nPr\u00edklad IDF\n\n```perl\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\u00ed postupne vstupy `1.a.in`, `1.b.in`, `1.c.in`, `2.a.in`, `2.b.in`.\n\n**Ak chcete nie\u010dim inicializova\u0165 `seed` vo svojom gener\u00e1tore, tak rozumn\u00fd n\u00e1pad je `{id}`**, preto\u017ee to je deterministick\u00e9 a z\u00e1rove\u0148 unik\u00e1tne pre ka\u017ed\u00fd vstup. Deterministick\u00e9 vstupy maj\u00fa v\u00fdhodu, \u017ee ak niekto in\u00fd pust\u00ed `itool generate` s rovnak\u00fdmi parametrami a rovnak\u00fdm IDF, dostane rovnak\u00e9 vstupy.\n\nNajlep\u0161\u00ed jazyk na zv\u00fdraznenie IDF je _Perl_ -- m\u00e1 rovnak\u00e9 koment\u00e1re a zv\u00fdraz\u0148uje `{}` a `!eval`.\n\n# `itool test`\n\nCie\u013eom tohto skriptu je otestova\u0165 v\u0161etky rie\u0161enia na vstupoch, overi\u0165, \u010di d\u00e1vaj\u00fa spr\u00e1vne v\u00fdstupy, zmera\u0165 \u010das behu a podobne.\n\n**Pozor**, sl\u00fa\u017ei to len na dom\u00e1ce testovanie, netestujte t\u00fdm nejak\u00e9 re\u00e1lne kontesty, kde m\u00f4\u017eu u\u017e\u00edvatelia submitova\u0165 \u010do chc\u00fa. Nem\u00e1 to toti\u017e \u017eiaden sandbox ani \u017eiadnu ochranu pred neprajn\u00edkmi.\n\n`itool test` sa pou\u017e\u00edva ve\u013emi jednoducho. Iba spust\u00edte `itool test <zoznam rie\u0161en\u00ed>` a ono to porob\u00ed v\u0161etko sam\u00e9.\n\nOdpor\u00fa\u010dame ma\u0165 na konci `.bashrc` alebo pri spusten\u00ed termin\u00e1lu nastavi\u0165 kompil\u00e1tory podobne ako s\u00fa na testova\u010di, teda napr\u00edklad `export CXXFLAGS=\"-O2 -std=gnu++11 -Wno-unused-result -DDG=1\"`, av\u0161ak `itool test` m\u00e1 nastaven\u00e9 rozumn\u00e9 predvolen\u00e9 hodnoty.\n\nRie\u0161enia pomen\u00favame s prefixom '`sol`' \u0161t\u00fdlom `sol-<hodnotenie>-<autor>-<algoritmus>-<zlozitost>.<pripona>`. Teda n\u00e1zov m\u00e1 podmno\u017einu t\u00fdchto \u010dast\u00ed v tomto porad\u00ed, teda napr\u00edklad `sol-75-fero-zametanie-n2.cpp` alebo `sol-100-dezo.py`. Valid\u00e1tor m\u00e1 prefix '`val`', pr\u00edpadn\u00fd hodnoti\u010d '`check`'.\n\n### Generovanie v\u00fdstupov\n\nAk e\u0161te neexistuje vzorov\u00fd v\u00fdstup ku nejak\u00e9mu vstupu (teda napr\u00edklad ste pr\u00e1ve vygenerovali vstupy), pou\u017eije sa prv\u00fd program na jeho vygenerovanie. Ostatn\u00e9 programy porovn\u00e1vaj\u00fa svoje v\u00fdstupy s t\u00fdmto.\n\nD\u00f4le\u017eit\u00e9 je, aby program, ktor\u00fd generuje v\u00fdstupy zbehol na v\u0161etk\u00fdch vstupoch spr\u00e1vne. Pokial by sa niekde zr\u00fabal/vyTLEl, tak m\u00f4\u017eu by\u0165 v\u00fdstupy po\u0161ahan\u00e9.\n\n## U\u017eito\u010dn\u00e9 prep\u00edna\u010de\n\n### `-t --time`\n\nNeoptim\u00e1lne rie\u0161enia by \u010dasto be\u017eali zbyto\u010dne dlho, ak v\u00f4bec aj dobehli. Tento argument nastav\u00ed \u010dasov\u00fd limit v sekund\u00e1ch. Vie to by\u0165 desatinn\u00e9 \u010d\u00edslo. Vie to by\u0165 r\u00f4zne pre jednotliv\u00e9 jazyky. Napr\u00edklad `-t 1`, `t -0.5` alebo `-t \"3,cpp=1,py=5\"`.\n\n### `-F --no-fail-skip`\n\n\u0160tandardne sa programy, ktor\u00e9 na niektorom vstupe zlyhali nevyhodnocuj\u00fa na zvy\u0161n\u00fdch testov v danej sade. Takto to funguje na niektor\u00fdch s\u00fa\u0165a\u017eiach a ur\u00fdch\u013euje to testovanie napr\u00edklad bruteforcov. \u010casto v\u0161ak tak\u00e9to spr\u00e1vanie necheme a preto ho m\u00f4\u017eeme t\u00fdmto argumentom vypn\u00fa\u0165.\n\n### `-R --Reset`\n\nU\u017e existuj\u00fa v\u00fdstupy ale s\u00fa zl\u00e9? `-R` prep\u00ed\u0161e v\u00fdstupy nanovo t\u00fdm, \u010do vyrob\u00ed prv\u00fd program.\n\n### `-d --diff`\n\nNiektor\u00e9 \u00falohy potrebuj\u00fa na ur\u010denie spr\u00e1vnosti hodnoti\u010d. Ten vie by\u0165 automaticky ur\u010den\u00fd ak ako argument uvedieme prie\u010dinok v ktorom sa nach\u00e1dza a hodnoti\u010d m\u00e1 \u0161tandardn\u00e9 meno. Ak tieto podmienky nie s\u00fa splnen\u00e9, vieme ho manu\u00e1lne ur\u010di\u0165 pomocou tohoto argumentu, napr\u00edklad `-d checker.py`.\n\n### `-D --show-diff-output`\n\nAk je v\u00fdsledkom testovania WA, vyp\u00ed\u0161e sa skr\u00e1ten\u00fd v\u00fdstup hodnoti\u010da. Pri \u0161tandardnom `diff`e sa vyp\u00ed\u0161e porovnanie riadkov ved\u013ea seba.\n\n### `--pythoncmd`\n\nNiekedy by sme boli radi, keby Python nebol tak\u00fd pomal\u00fd. To sa d\u00e1 v\u00e4\u010d\u0161inou vyrie\u0161i\u0165 pou\u017eit\u00edm _PyPy_ interpretera. Dok\u00e1\u017eeme to ur\u010di\u0165 pomocou tohoto argumentu, pou\u017eit\u00edm `--pythoncmd pypy3`.\n\n### `-j --threads`\n\nKompilovanie, generovanie aj testovanie vieme zna\u010dne ur\u00fdchli\u0165 paraleliz\u00e1ciou. Tento argument ur\u010duje, ko\u013eko vl\u00e1kien sa m\u00e1 pou\u017ei\u0165. V\u00e4\u010d\u0161inou existuje optim\u00e1lny po\u010det vl\u00e1kien, ktor\u00fd je men\u0161\u00ed ako po\u010det dostupn\u00fdch vl\u00e1kien v\u00e1\u0161ho procesoru. Odpor\u00fa\u010dame teda ob\u010das a hlavne pred zverejnen\u00edm \u00faloh pretestova\u0165 rie\u0161enia bez paraleliz\u00e1cie (`-j 1`).\n\n### Pr\u00edklady\n\n```bash\n# pomoc!\nitool test -h\n# najz\u00e1kladnej\u0161ie pou\u017eitie, ke\u010f m\u00e1me v\u0161etko v aktu\u00e1lnom prie\u010dinku\nitool test .\n# chceme spusti\u0165 iba vzorov\u00e9 rie\u0161enia\nitool test sol-100*\n# chceme vidie\u0165 na ktor\u00fdch v\u0161etk\u00fdch vstupoch programy nefunguj\u00fa (nielen na ktor\u00fdch\n# sad\u00e1ch), chceme vidie\u0165 ako sa l\u00ed\u0161ia od vzorov\u00e9ho v\u00fdstupu a rob\u00edme to s\u00e9riovo\nitool test -FD -j 1 .\n# be\u017en\u00e9 pou\u017eitie, ak si d\u00e1me v\u0161etky rie\u0161enia do prie\u010dinku `sols`\nitool test -t \"3,cpp=0.5,py=5\" sols .\n# ak po\u017e\u00edvame n\u00e1zvoslovie ktor\u00e9 input-tool nevie dobre rozpozna\u0165, m\u00f4\u017eeme najprv\n# spusti\u0165 vzorov\u00e9 rie\u0161enie ktor\u00e9 vygeneruje v\u00fdstupy a n\u00e1sledne pou\u017ei\u0165 wildcardy\nitool test -R vzorove-riesenie.py\nitool test . vzor* ries* program2.cpp cokolvek.py\n```\n\n# Pokro\u010dil\u00e9\n\nAk chcete vedie\u0165, ak\u00e9 cool veci navy\u0161e dok\u00e1\u017eu `itool generate` a `IDF`, pre\u010d\u00edtajte si o nich v s\u00fabore [`GENERATOR.md`](GENERATOR.md).\n\nAk chcete vedie\u0165, ak\u00e9 cool veci navy\u0161e dok\u00e1\u017ee `itool test` a **ako p\u00edsa\u0165 valid\u00e1tor a hodnoti\u010d**, pre\u010d\u00edtajte si o tom v s\u00fabore [`TESTER.md`](TESTER.md).\n\n# Feedback\n\nAk v\u00e1m nie\u010do nefunguje, alebo v\u00e1m ch\u00fdba nejak\u00e1 funkcionalita, nap\u00ed\u0161te mi, pros\u00edm, mail alebo vyrobte issue.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Tool which simplifies creating and testing inputs for programming contests.",
    "version": "2.0.2",
    "project_urls": {
        "Homepage": "https://github.com/fezjo/input-tool/",
        "Repository": "https://github.com/fezjo/input-tool/"
    },
    "split_keywords": [
        "benchmark",
        "contests",
        "competitive-programming",
        "tool"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8ba04cae36bfc9221c90da478395d8553526018a74dfa466b7d2b4ae13eb30f4",
                "md5": "b32495d0ce61662c5a3d22aad7c2a48b",
                "sha256": "afa8ec2087ad710e37c670309a2b5eb40e9dedf5b56b5ae1dc3f77ae8f1fa4dd"
            },
            "downloads": -1,
            "filename": "input_tool-2.0.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "b32495d0ce61662c5a3d22aad7c2a48b",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8,<4.0",
            "size": 49004,
            "upload_time": "2024-03-12T19:25:47",
            "upload_time_iso_8601": "2024-03-12T19:25:47.668859Z",
            "url": "https://files.pythonhosted.org/packages/8b/a0/4cae36bfc9221c90da478395d8553526018a74dfa466b7d2b4ae13eb30f4/input_tool-2.0.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6f733620e1e168c4fed1cc3fabbc910d282d46dd7bfd7d6030b2527c75a8be9e",
                "md5": "b64fa5364f48c360a3f3dd30c78adbd6",
                "sha256": "4ff1ee14afc879a56b5f38d682d95a356d9d875ed75f2952fcb7fe7f622f09e2"
            },
            "downloads": -1,
            "filename": "input_tool-2.0.2.tar.gz",
            "has_sig": false,
            "md5_digest": "b64fa5364f48c360a3f3dd30c78adbd6",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8,<4.0",
            "size": 45408,
            "upload_time": "2024-03-12T19:25:49",
            "upload_time_iso_8601": "2024-03-12T19:25:49.795672Z",
            "url": "https://files.pythonhosted.org/packages/6f/73/3620e1e168c4fed1cc3fabbc910d282d46dd7bfd7d6030b2527c75a8be9e/input_tool-2.0.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-03-12 19:25:49",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "fezjo",
    "github_project": "input-tool",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "input-tool"
}
        
Elapsed time: 0.93522s