Panaxeo Coding Arena

Competition

•

Competition •

Oslobodenie gbelskej ropy

tl;dr:

  • Rules

Panaxeo Icon Logo

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.


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ť.

Stiahni SDK súbor a pozri pravidlá, ako to funguje.

§ 01 Ako agent rozhoduje

SDK Obsahuje tréningovú mapu gbelského katastra, Mestské zastupiteľstvo, proti ktorému beží leaderboard, celý engine a protokol z § 05, šablónu agenta my_agent.py a túto stránku s pravidlami. Tri Python súbory:

gbely_sdk.py (pravidlá, engine, protokol, spúšťač),
gbely_council.py (súper) a
gbely_world.py (mapa a replay).

Rozbaľ, spusť python gbely_sdk.py my_agent.py a hráš. Finálová podoba Zastupiteľstva v ňom nie je a ani nebude (§ 09).

Šablóna my_agent.py nie je prázdna: obsahuje jednoduchého agenta, ktorý odohrá celý zápas. Vidíš na ňom, ako sa rozhodovanie zapisuje. Tento agent hrá zámerne naivne; útočí na najslabšieho suseda každého poľa a nič neplánuje.

Stiahneš si SDK, rozbalíš ho a agenta si vyladíš alebo natrénuješ, ako uznáš za vhodné. Do súťaže potom odovzdáš jeden Python súbor s funkciou decide(stav).

Počas behu agent nesmie volať žiadne externé API; rozhoduje výlučne tým, čo je v tom súbore.

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.

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, tzn. Zastupiteľstvo, proti ktorému beží leaderboard. Finálová podoba v ňom nie je a nedá sa proti nej lokálne trénovať (§ 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én Produkcia / kolo Obranný bonus Priechodnosť
lúka 3 × 1.0 100 %
vrch 2 × 1.5 60 %
rieka 1 × 1.3 100 %

Priechodnosť je podiel presúvanej kolóny, ktorý na pole dorazí ešte v tom istom kole (§ 04, MOVE). Zvyšok ostáva na pôvodnom poli a pokračuje ďalšie kolo.

Presun armády cez vrchy jednoducho trvá dlhšie.

Domovská základňa navyše produkuje 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. Vysvetľuje to § 04.

Tieto hodnoty SDK zverejňuje aj programovo v module pravidla, aby ich agent nemusel mať natvrdo opísané: PRODUKCIA, TERENNY_BONUS, PRIECHODNOST, BONUS_ZAKLADNE, UCINNOST_OPEVNENIA, ZACIATOCNE_JEDNOTKY, VELKOST_MAPY, POCET_KOL, POSADKA_NEUTRAL, LIMIT_KOLA_S, POVOLENE_PORUSENIA a REFERENCNA_MAPA.

Ten modul zámerne neimportuje nič, takže je čitateľný aj v izolovanom prostredí podľa § 08.

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 súperovi +5 za kolo zoberie a pripíše tebe.

Zastupiteľstvo nie je náhodné: má pevnú, deterministickú stratégiu. 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 opevňuje. 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š zopakovať.

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í: slušne napísaný agent prenáša výkon medzi mapami takmer bez straty.

SDK obsahuje referenčnú mapu gbelského katastra aj lokálnu kópiu trénovacieho Mestského zastupiteľstva, proti ktorému beží leaderboard. Účastníci si 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 prebieha nasledovne:

  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 má 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.

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, ktoré sa strieda podľa čísla kola, aby z neho ani jedna strana nemala trvalú výhodu.

§ 04 Akcie agenta

Príkaz Čo robí
MOVE Presunie 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.
ATTACK Vyšle jednotky na susedné pole Hornonitrianskych baní alebo pole Mestského zastupiteľstva; výsledok rieši § 06.
FORTIFY Investuje 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ý. 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én N jednotiek v posádke dáva po FORTIFY dostaneš ostane ti
lúka 1,0 × N 0,3 × N 30 %
rieka 1,3 × N 0,3 × N 23 %
vrch 1,5 × N 0,3 × N 20 %

Opevnením teda obetuješ 70 až 80 % obrany, ktorá na danom poli už bola, jednotky sa nenávratne stratia: 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.

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 a agent odpovedá zoznamom príkazov v pevnom JSON formáte.

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" }
  ]
}
  • susedia vymenúva všetky susedné polia daného poľa, vlastné aj cudzie. Cudzie z nich nájdeš vo viditelne_susedne_pola, vlastné vo moje_pola. Bez tejto väzby by agent nevedel, ktoré jeho pole s ktorým cieľom susedí, a vedel by za kolo konať len z jedného poľa.
  • posadka je surový počet jednotiek, nie hotová obrana. Terénny bonus si agent doplní sám podľa § 06. Počty jednotiek aj opevnenie sú desatinné čísla, nie celé. Na vstupe sú zaokrúhlené na jedno desatinné miesto; príklady vyššie sú kvôli čitateľnosti celé.
  • opevnenie je viditeľné aj na cudzích poliach, inak by obranu z § 06 nebolo možné dopočítať.
  • moja_zakladna je bežné id poľa, na ktorom základňa stojí. Dá sa teda použiť v príkazoch ako ktorékoľvek iné vlastné pole.
  • kolo sa počíta od nuly: prvé kolo zápasu je 0, posledné 149. Je to zároveň to isté číslo, podľa ktorého sa v § 03 strieda poradie vyhodnotenia. Pri párnom kolo sa tvoje príkazy vyhodnotia skôr než príkazy Zastupiteľstva, pri nepárnom neskôr.
  • Vidíš len vlastné polia a to, čo s nimi bezprostredne susedí; zvyšok katastra ostáva zahalený.

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ý (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č navyše nestojí.

§ 07 Skórovanie a víťazstvo

Hlavné poradie určuje percento gbelského katastra, 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. 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 kolo Sieťový prístup Veľkosť submissionu Tolerancia zlyhaní
2 s žiadny 1 súbor .py, ≤ 512 KiB 3 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. 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šením. 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
  • Agent beží vo vlastnom procese, ktorý nemá referenčnú implementáciu Zastupiteľstva ani engine k dispozícii. Vidí len to, čo mu judge pošle na vstup podľa § 05, a ovplyvniť zápas vie len tým, čo pošle späť.
  • Zámerné využívanie chýb enginu je zakázané. Prosím, nerobte to, nie je to pekné.
  • Kód musí byť pôvodná práca tímu. Pred finálovým behom prebehne krátky code review u postupujúcich.
  • Jedna prihláška na osobu/tím. Identitu určuje overená e-mailová adresa: každý ďalší submit z tej istej adresy prepíše ten predchádzajúci, takže platí posledná odovzdaná verzia. Aktualizovať sa dá kedykoľvek do uzávierky z § 09; po nej systém nový upload neprijme a to, čo si mal odovzdané v momente uzávierky, ostáva.

§ 09 Harmonogram a živé finále

Fáza Termín Priebeh
Registrácia + SDK 5. – 18. okt 2026 Zverejnenie pravidiel, SDK (Python), referenčnej mapy a lokálneho Zastupiteľstva na testovanie.
Testovacie obdobie 19. okt – 15. nov 2026 Opakované submity proti referenčnej mape, leaderboard sa prepočítava priebežne.
Uzávierka submission 15. nov 2026, 23:59 Posledná možnosť odovzdať finálnu verziu agenta.
Živé finále 27. nov 2026 Top 8 hrá naživo na pódiu naraz, na jednej spoločnej mape, 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 Zastupiteľstvu, 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, teda 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ť.

Finálová mapa je väčšia než tréningová. 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í bez zmeny.

Jedna konštanta z § 02 vo finále neplatí: VELKOST_MAPY. Je to rozmer tréningovej mapy, a finálová je väčšia.

Skutočný rozmer finálovej mapy sa z § 05 vstupu zistiť nedá. Všetko, čo agent na rozhodnutie potrebuje, prichádza vo 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áť.

§ 10 Ceny

  • Celkový víťaz (najvyššie % oslobodeného gbelského katastra vo finálovom behu proti posilám z VÚC) – TBD
  • Druhé a tretie miesto vo finálovom behu – TBD
  • Bleskové víťazstvo – úplná eliminácia Zastupiteľstva v najnižšom kole počas testovacieho obdobia, na referenčnej mape – špeciálna cena TBD. Pozor, nie je to to isté ako 100 % katastra: obsadením posledného poľa Zastupiteľstva sa zápas končí (§ 03), takže neutrálne polia Hornonitrianskych baní, ktoré v tej chvíli ešte stoja, už nikto nezoberie — a cena viazaná na celý kataster by nebola náročná, ale nedosiahnuteľná. Vyhodnocuje sa oddelene od hlavného poradia; nie je to pozícia na leaderboarde.

§ 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.

Odovzdaj svojho agenta

Aktuálny leaderboard

Pridaj sa k nám na Discord

Panaxeo Icon Logo

FAQs

We are required to put the official competition rules here in a special document.
Read it if you’d like. (Slovak)

Any questions?

Join us on Discord or talk to us: codingarena@panaxeo.com