Panaxeo Coding Arena 2026 — pravidlá

GBELY

Jedna trať 150 kôl · 60 × 60 Finále: Zastupiteľstvo + posily
PRÍBEH

Oslobodenie gbelskej ropy

V katastri vymysleného mesta Gbely po sto rokoch objavili pracovníci skrachovaných Hornonitrianskych baní Prievidza ropu. Veľa ropy! Dokonca ju rovno začali ťažiť. Ako správny energokapitalista si rozhodnutý tento vzácny nerast od neschopných baníkov oslobodiť.

V ceste ti však stojí gbelské mestské zastupiteľstvo, ktoré na poslednú chvíľu za dotácie od VÚC nakúpilo armádu čínskych humanoidných robotov a je rozhodnuté ťažbu vo svojom katastri prebrať pod vlastnú réžiu.

Klin sa klinom vybíja a AI roboti sa AIčkou porážajú. Susedné mesto Kúty ti na pomoc nečakane ponúklo milovanú vlakovú stanicu, ktorú využiješ ako základňu pre svoju vlastnú AI armádu.

Naprogramuj armádu AI robotov, vyžeň z gbelského katastra Hornonitrianske bane a zachráň ropu pred skorumpovaným gbelským mestským zastupiteľstvom, ktoré by zisk z nej prehajdákalo na automatoch v šenku.

§ 00

Koncept

Každý účastník odovzdá agenta, svoju AI armádu, ktorá hrá vlastnú, nezávislú partiu proti tej istej vstavanej AI, Gbelskému mestskému zastupiteľstvu a jeho čínskym humanoidným robotom, na tom istom území: gbelskom katastri.

Poradie určuje jednoduchá metrika: koľko percent gbelského katastra AI armáda na konci ovláda, teda koľko ropy sa podarilo oslobodiť.

§ 01

Ako agent rozhoduje

Šablóna my_agent.py nie je prázdna: obsahuje jednoduchého agenta, ktorý odohrá celý zápas, takže prvé číslo dostaneš bez toho, aby si napísal riadok — a vidíš na ňom, ako sa rozhodovanie zapisuje. Hrá zámerne naivne; útočí na najslabšieho suseda každého poľa a nič neplánuje, takže je to základ na prekonanie, nie kostra na doplnenie. Stiahneš si SDK, rozbalíš ho a doma si na ňom agenta vyladíš alebo natrénuješ, ako uznáš za vhodné. Do súťaže potom odovzdáš jeden Python súbor s funkciou decide(stav) — telo rozhodovania, nič viac. Počas behu agent nesmie volať žiadne externé API; rozhoduje výlučne tým, čo je v tom súbore. Jeden leaderboard, jedno finále, všetci za rovnakých podmienok.

Súbor má limit 512 KiB. Natrénovaný model použiť môžeš, ale musí sa doň zmestiť — napríklad ako zabudované váhy priamo v kóde. Čím si model natrénoval a aké nástroje si pritom použil, nikoho nezaujíma; súťaží to, čo odovzdáš.

Súťaž je o tom, ako dobre tvoj kód hrá proti Zastupiteľstvu — a vo finále proti jeho finálovej podobe, na inej mape a spolu so siedmimi ďalšími armádami (§ 09).

SDK obsahuje len trénovacieho súpera — to Zastupiteľstvo, proti ktorému beží leaderboard. Finálová podoba v ňom nie je a nedá sa proti nej lokálne trénovať; to je celý zmysel finále (§ 09).

§ 02

Gbelský kataster a Mestské zastupiteľstvo

Gbelský kataster je štvorcová mriežka 60 × 60 polí (3 600 políčok), rovnaká pre všetkých (beh je plne reprodukovateľný). Tri typy terénu: lúka (ropné polia, vyššia produkcia jednotiek), vrch (obranný bonus, pomalší presun jednotiek) a rieka (hraničné pole, na prekonanie treba viac síl). Neobsadené polia majú vlastnú posádku ťažobných robotov Hornonitrianskych baní (1 – 8 jednotiek podľa hodnoty polohy), ktorú treba pri obsadení prekonať.

TerénProdukcia / koloObranný bonusPriechodnosť
lúka3× 1.0100 %
vrch2× 1.560 %
rieka1× 1.3100 %

Priechodnosť je podiel presúvanej kolóny, ktorý na pole dorazí ešte v tom istom kole (§ 04, MOVE). Zvyšok sa nestráca — ostáva na pôvodnom poli a pokračuje ďalšie kolo, takže presun armády cez vrch jednoducho trvá dlhšie. Domovská základňa produkuje navyše pevný bonus +5 jednotiek za kolo. Jednotky investované cez FORTIFY (§ 04) sa menia na trvalú obranu v pomere 0,3 — jedna jednotka teda kúpi 0,3 obrany. Keďže tá istá jednotka v posádke dávala obranu v pomere terénneho bonusu z tabuľky vyššie, je to výmena so stratou; prečo, rozoberá § 04.

Tieto hodnoty SDK zverejňuje aj programovo v module pravidla — PRODUKCIA, TERENNY_BONUS, PRIECHODNOST, BONUS_ZAKLADNE, UCINNOST_OPEVNENIA, ZACIATOCNE_JEDNOTKY, VELKOST_MAPY, POCET_KOL, POSADKA_NEUTRAL, LIMIT_KOLA_S, POVOLENE_PORUSENIA a REFERENCNA_MAPA — aby ich agent nemusel mať natvrdo opísané. Ten modul zámerne neimportuje nič, takže je čitateľný aj v izolovanom prostredí podľa § 08. Podľa § 11 sa hodnoty môžu do spustenia ešte doladiť; text tejto sekcie a tie konštanty sa menia naraz.

AI armáda aj Gbelské mestské zastupiteľstvo štartujú zo svojej domovskej základne v protiľahlých rohoch katastra — tvoja AI armáda z vlakovej stanice v Kútoch, mestské zastupiteľstvo z mestského úradu Gbely. Obe strany začínajú s jedným poľom a 10 jednotkami na ňom. Pole základne je vždy lúka a nemá vlastnú posádku, ktorú by bolo treba najprv prekonať. Kataster je symetrický voči otočeniu o 180° — terén aj posádky neobsadených polí vyzerajú od jednej základne presne tak ako od druhej, takže z rohu, ktorý ti pripadol, neplynie žiadna výhoda ani nevýhoda. Bonus základne patrí poľu, nie strane: kto ho práve drží, ten ho aj inkasuje, takže dobytie súperovej základne mu tých +5 za kolo zoberie a pripíše tebe.

Zastupiteľstvo nie je náhodné: má pevnú, deterministickú stratégiu o štyroch častiach — rozumne expanduje k slabším susedným poliam, presúva jednotky zo zázemia na front, občas sústredí robotov niekoľkých polí na jeden výpad a ohrozené hranice zakopáva opevnením. Tá druhá časť je na ňom to podstatné: produkcia vzniká na celom území, ale konať vedia len hraničné polia, takže súper, ktorý svoju armádu nepresúva, bojuje zlomkom svojich síl.

Sú dve mapy a hráš na oboch. Tréningová mapa je verejná: dostaneš ju v SDK, beží na nej leaderboard počas celého testovacieho obdobia, a keďže je pre všetkých rovnaká a plne reprodukovateľná, svoj výsledok si vieš doma zopakovať do posledného políčka.

Finálová mapa je druhá a nikto z účastníkov ju pred podujatím neuvidí (§ 09). V SDK nie je a nezverejňuje sa. Neočakávaj však, že ťa iná mapa sama o sebe rozhodí: merali sme to a slušne napísaný agent prenáša výkon medzi mapami takmer bez straty. Finále nerobí ťažkým iný terén, ale iný formát — sedem ďalších armád na tej istej ploche a Zastupiteľstvo, ktoré čelí ôsmim frontom naraz (§ 09). Oplatí sa teda hrať hru, nie mapu.

SDK obsahuje referenčnú mapu gbelského katastra aj lokálnu kópiu trénovacieho Mestského zastupiteľstva — toho, proti ktorému beží leaderboard — takže si účastníci vedia agenta ladiť offline pred každým submitom. Finálová podoba v SDK nie je (§ 09).

§ 03

Priebeh kola

Boj o gbelskú ropu trvá 150 kôl, prípadne skončí skôr, ak jedna strana stratí všetky polia. Každé kolo:

  1. Produkcia — každé ovládané pole vyprodukuje jednotky podľa svojho typu (lúka najviac, vrch menej ale s obranným bonusom), domovská základňa navyše pevný bonus.
  2. Príkazy — agent v jednom kroku odošle ľubovoľný počet príkazov naraz.
  3. Vyhodnotenie — presuny, obsadzovanie a útoky sa spočítajú podľa pravidiel v § 06.

Produkcia prebehne skôr, než engine požiada strany o príkazy, takže obe rozhodujú nad tou istou doskou, na ktorej sa bude aj konať.

Príkazy sa vyhodnocujú po stranách, nie úplne súčasne. Ak by obe strany v tom istom kole mierili na to isté pole, rozhodne poradie — a to sa strieda podľa čísla kola, aby z neho ani jedna strana nemala trvalú výhodu.

§ 04

Akcie agenta

PríkazČo robí
MOVEPresunie jednotky medzi dvoma vlastnými susediacimi poľami. Cez vrch prejde za kolo len časť kolóny podľa priechodnosti z § 02; zvyšok ostáva na pôvodnom poli a môže pokračovať ďalšie kolo.
ATTACKVyšle jednotky na susedné pole Hornonitrianskych baní alebo pole Mestského zastupiteľstva; výsledok rieši § 06.
FORTIFYInvestuje jednotky do trvalého opevnenia vlastného poľa (zvyšuje jeho budúcu obranu). Pozri varovanie nižšie — vo väčšine situácií je to strata.

FORTIFY je vo väčšine situácií nevýhodný — a je to úmyselné, nie prehliadnutie. Jednotky, ktoré doň vložíš, sa menia na obranu v pomere UCINNOST_OPEVNENIA = 0,3, no tie isté jednotky už obranu poskytovali, a to v pomere svojho terénneho bonusu z § 02:

TerénN jednotiek v posádke dávapo FORTIFY dostanešostane ti
lúka1,0 × N0,3 × N30 %
rieka1,3 × N0,3 × N23 %
vrch1,5 × N0,3 × N20 %

Opevnením teda obetuješ 70 až 80 % obrany, ktorú si na tom poli už mal — a navyše tie jednotky nenávratne strácaš: nemôžeš nimi útočiť ani sa nimi presunúť. Opevnenie ani nechráni posádku, podľa § 06 sa míňa až po nej, a pri dobytí poľa sa vynuluje.

K tomu sa pridáva, že § 07 hodnotí podiel katastra, nie prežitie. Obrana neskóruje. Každá jednotka, ktorá nerozširuje územie, je jednotka, ktorá nezarába body — a to platí bez ohľadu na to, akú hodnotu by UCINNOST_OPEVNENIA mala.

Príkaz v pravidlách ostáva, lebo engine ho vyhodnocuje a nechceme ti brať možnosť nájsť preň úzku situáciu, v ktorej sa oplatí. Ale nestavaj naň stratégiu: kto opevňuje plošne, prehráva s tým, kto expanduje.

§ 05

Protokol

Engine posiela na začiatku kola stav viditeľného územia, agent odpovedá zoznamom príkazov — pevný JSON formát, žiadny voľný text.

Vstup enginu → agent (skrátené)

{
  "kolo": 42,
  "moja_zakladna": "P57_02",
  "moje_pola": [
    { "id": "P12_07", "typ": "luka", "jednotky": 14, "opevnenie": 1,
      "susedia": ["P11_07", "P13_07", "P12_06", "P12_08"] },
    { "id": "P13_07", "typ": "vrch", "jednotky": 6, "opevnenie": 2,
      "susedia": ["P12_07", "P14_07", "P13_06", "P13_08"] }
  ],
  "viditelne_susedne_pola": [
    { "id": "P14_07", "vlastnik": "hbp", "posadka": 5, "opevnenie": 0, "typ": "luka" },
    { "id": "P12_08", "vlastnik": "zastupitelstvo", "posadka": 9, "opevnenie": 3, "typ": "rieka" }
  ]
}

Agent → engine, príkazy pre dané kolo

{
  "prikazy": [
    { "typ": "MOVE",    "z": "P12_07", "na": "P13_07", "pocet": 5 },
    { "typ": "ATTACK",  "z": "P13_07", "na": "P12_08", "pocet": 6 },
    { "typ": "FORTIFY", "pole": "P12_07", "investicia": 3 }
  ]
}
§ 06

Vyhodnotenie bojov

Výpočet je deterministický — žiadna kocka, žiadne šťastie, len čísla (dôležité pre reprodukovateľnosť a ladenie):

obrana = posádka × terénny bonus + opevnenie

ak útočná_sila > obrana → pole obsadené, zvyšné jednotky (útočná_sila − obrana) ostávajú ako nová posádka
ak útočná_sila ≤ obrana → útok neúspešný, útočiace jednotky sú stratené, obrana sa zníži o útočnú_silu

Nerovnosť je ostrá: pri obrane presne 9 útok so silou 9 neuspeje, treba 10. Najlacnejšia víťazná sila je teda floor(obrana) + 1. Pozor na to pri zaokrúhľovaní — útok, ktorý skončí čo i len o jednotku nižšie, nie je „skoro úspešný", ale úplná strata všetkých vyslaných jednotiek.

Keďže neúspešný útok zníži obranu presne o svoju silu, je jedno, či pole napadneš jedným veľkým útokom alebo viacerými menšími z rôznych polí — súčet potrebnej sily je rovnaký. Sústredený výpad viacerých polí na jeden cieľ teda nič nestojí navyše.

§ 07

Skórovanie a víťazstvo

Hlavné poradie určuje percento gbelského katastra (a teda oslobodenej ropy), ktoré agent ovláda na konci 150. kola (alebo pri úplnej eliminácii Mestského zastupiteľstva skôr) na referenčnej mape z § 02.

skóre = (ovládané polia ÷ 3 600) × 100 %

Pri rovnakom skóre rozhoduje rýchlosť — kto svoj podiel dosiahol skôr, je vyššie. Berie sa kolo, v ktorom agent svoj konečný podiel dosiahol prvýkrát; územie mení majiteľa opakovane, takže záleží na tom, kedy tú hranicu prekročil, nie kedy ju držal naposledy. Leaderboard toto kolo pri každom agentovi zobrazuje, aby bolo poradie vysvetliteľné.

Rýchlosť je len rozhodovacie kritérium pri zhode, nie druhá mena. Rýchlo dosiahnutý malý podiel neprebije väčší podiel dosiahnutý pomaly.

Agent, ktorý bol na referenčnej mape diskvalifikovaný (§ 08), nemá skóre a na leaderboarde nie je. Keďže sa hodnotí jediná mapa, niet čo priemerovať a niet sa o čo oprieť — stav submissionu aj dôvod nájdeš na svojej stránke stavu, na ktorú ťa odovzdanie presmeruje a ktorej odkaz je aj v e-maile s výsledkom.

§ 08

Technické limity a fair play

Max. čas na koloSieťový prístupVeľkosť submissionuTolerancia zlyhaní
2 sžiadny1 súbor .py, ≤ 512 KiB3 kolá na mapu

Čo sa stane, keď agent zlyhá

Kolo, v ktorom agent neodpovie do 2 s, spadne alebo pošle niečo, čo sa nedá prečítať, sa počíta ako porušenie: stratí príkazy toho jedného kola, nie zápas — engine pokračuje, akoby neposlal nič. Agenta judge reštartuje a pýta sa ďalej. Až štvrté porušenie na tej istej mape tú mapu ukončí a agent je na nej diskvalifikovaný. Ako sa diskvalifikovaná mapa premietne do skóre, hovorí § 07.

Jednotlivý chybný príkaz nie je porušenie — príkaz s neznámym typom, neexistujúcim poľom alebo nezmyselným počtom sa jednoducho zahodí a zvyšok kola sa vyhodnotí normálne.

Izolácia a fair play

§ 09

Harmonogram a živé finále

FázaTermínPriebeh
Registrácia + SDK5. – 18. okt 2026Zverejnenie pravidiel, SDK (Python), referenčnej mapy a lokálneho Zastupiteľstva na testovanie.
Testovacie obdobie19. okt – 15. nov 2026Opakované submity proti referenčnej mape, leaderboard sa prepočítava priebežne.
Uzávierka submission15. nov 2026, 23:59Posledná možnosť odovzdať finálnu verziu agenta.
Živé finále27. nov 2026Top 8 hrá naživo na pódiu naraz, na jednej spoločnej mape — novej, dovtedy skrytej časti gbelského katastra — spoločne proti Zastupiteľstvu a jeho posilám z VÚC, ktoré drží stred katastra. Priebeh sa premieta rýchlosťou jedno kolo za sekundu a podiely oslobodenej ropy bežia na obrazovke v reálnom čase.

Ako finále prebieha

Leaderboard je súboj jedného agenta proti Zastupiteľstvu. Finále nie je. Všetkých osem finalistov stojí naraz na jednej mape, každý vo svojom rohu, a Zastupiteľstvo drží stred. Nehráte proti sebe — hráte spolu proti nemu, no hodnotí sa podiel katastra, ktorý oslobodil práve tvoj agent. Kto ukrojí najviac, vyhráva (§ 10).

Na iného finalistu útočiť nemožno. Príkaz ATTACK mierený na pole, ktoré patrí inému finalistovi, engine odmietne — pole je pre teba rovnako nedotknuteľné ako tvoje vlastné. Príkaz sa zahodí, ale jednotky zaň neplatíš: neminú sa a ostávajú tam, kde boli. Agent písaný pre dvojstrannú hru z § 02, kde je každé cudzie pole nepriateľské, teda nepríde o armádu — len o ten jeden príkaz.

To má jeden dôsledok pre § 05, s ktorým treba počítať pri ladení. V poli vlastnik sa okrem hbp, zastupitelstvo a armada (ty) môže objaviť aj armada_2 až armada_8 — pole iného finalistu. Číslo za podčiarkovníkom je poloha voči tebe, nie identita konkrétneho finalistu: každý z ôsmich vidí svojich sedem súperov ako armada_2 až armada_8, takže to isté číslo znamená pre dvoch finalistov dvoch rôznych ľudí. Nedá sa naň teda nič viazať — a netreba, lebo všetci ostatní finalisti sú pre teba rovnako nedotknuteľní. Ak si agenta píšeš tak, že všetko, čo nie je tvoje a nie je hbp, považuje za nepriateľa, vo finále bude plytvať príkazmi na spojencov. Rozhodujúci test je vlastnik == "zastupitelstvo", nie „nie je moje".

Finálová mapa je väčšia než tréningová — musí sa na ňu zmestiť deväť strán namiesto dvoch. Formát identifikátorov polí sa nemení: ostáva presne ten z § 05 (P07_12), takže agent, ktorý ich parsuje, funguje bez úpravy. Zvyšok pravidiel — produkcia, presuny, boj z § 06, limit 2 s na kolo a tolerancia porušení z § 08 — platí nezmenený.

Jedna konštanta z § 02 vo finále neplatí: VELKOST_MAPY. Je to rozmer tréningovej mapy, a finálová je väčšia. Agent, ktorý si z nej odvodzuje hranice dosky — alebo polohu súperovej základne, napríklad ako otočenie vlastnej o 180° — bude vo finále počítať s doskou, ktorá tam nie je. (Taká základňa by tam nebola ani pri správnom rozmere: stred drží Zastupiteľstvo a v protiľahlom rohu stojí spojenec.)

Skutočný rozmer finálovej dosky sa z § 05 vstupu zistiť nedá — vidíš len svoje polia a to, čo s nimi susedí — a netreba ho. Všetko, čo agent na rozhodnutie potrebuje, prichádza v tom vstupe: id polí, ich susedia a moja_zakladna. Ostatné konštanty z § 02 vrátane POCET_KOL platia nezmenené.

Posily z VÚC aj finálová (skrytá) mapa sú tajné až do dňa podujatia — postupujúci teda nevedia vopred presne, proti čomu budú stáť. Vedia len toto: Zastupiteľstvo drží stred katastra a čelí ôsmim frontom naraz. Práve preto je finále súbojom o podiel, nie o prežitie — osem armád ho zo stredu vytlačí spoločne a vyhráva tá, ktorá z gbelského katastra oslobodí najväčšiu časť.

§ 10

Ceny

§ 11

Registrácia

Prihlásenie, SDK a presné znenie API budú zverejnené na panaxeo.com/coding-arena-26 pri spustení registrácie. Presné hodnoty vyváženia (produkcia podľa terénu, sila Zastupiteľstva) sa môžu do spustenia registrácie ešte doladiť; § 02 uvádza tie, ktoré platia dnes.