Üldjuhend

Protokoll

Lahendus peab olema tavaline käsureaprogramm, mis on suuteline serveriga üle standard sisendi ja väljundi suhtlema. Serveriga suhtlemist realiseerides võib kasutada žürii poolt välja pandud näidisprogramme (aga see pole kohustuslik).

Võistlustöö formaat:

  • Lahenduse kood koos vajaminevate failidega peab asuma zip-failis. Zip-failis võib olla katalooge, aga eeldatakse, et zip-faili juurkataloog on ühtlasi ka projekti juurkataloog.
  • Hetkel on võimalik esitada lahendusi c++’is, java’s ja python’is. Kui teil on mingeid erisoove/vajadusi, siis võtke ühendust žüriiga – vaatame, mis teha annab.
    • c++ programmide kompileerimiseks kasutatakse käsku "g++ -o a.exe <zip-failis olnud .h ja .cpp failide nimekiri>".
    • java programmide kompileerimiseks kasutatakse käsku "javac <zip-failis olnud .java failide nimekiri>". java programme käivitatakse aga käsuga "java Program". Seega peab java lahendus sisaldama alati faili Program.java, mis asub default-package’s.
    • Python'i programm kompileeritakse vältimaks olukorda, kus programm saab timeout'i lihtsalt seetõttu, et ta serveris ei kompileerunud. Kompileerimiseks kasutatakse kahte käsku "python -c "import py_compile;py_compile.compile('__init__.py')"" (sisuliselt __init__.py olemasolu kontroll) ja "python -m compileall .". Python'i programme käivitatakse aga käsuga "python -u __init__.py". Seega peab python'i lahendus sisaldama alati faili __init__.py.
      Sisendi lugemisel on soovitatav kasutada raw_input()'i
  • Kogu esitatud võistlustöö suurus ei tohi ületada 1 MB.

Nõuded programmile:

  • Lahendustöö võib realiseerida suvalise arendusvahendiga, aga ta peab kompileeruma all toodud käskudega.
  • Võistlustöid jooksutatakse arvutitel, millel on vähemalt 1GHz ühetuumaline protsessor ja vähemalt 512MB mälu.
  • Programm ei tohi ühe käigu mõtlemisele kulutada rohkem kui 10 sekundit.
  • Protokoll, mida serveriga suhtlemisel programm peab oskama täita, on järgmine (iga teade peab olema ühel real ja rida peab lõppema reavahetusega, mille ASCII kood on 10):
  • Programm võib kirjutada stderr'i. Neid teateid server ignoreerib.

Protokoll:

Protokolli ülevaade:

  • Mängu alustamiseks peab mängija saatma serverile teate kujul

    play khet <playername>
  • Sellele vastab server teatega kujul kujul (B nagu Board)

    B <S/R - mängija värv> <mängu seisu kirjeldus>
  • Mängu vältel saadab server mängijalt järgmise käigu küsimiseks teate (R nagu game Running)

    R <S/R - mängija värv> <mängu seisu kirjeldus>
  • Käigust tuleb serverile teatada kujul.

    <S/R - mängija värv><x-koordinaat><y-koordinaat><tegevus>

    Seejuures x-koordinaadid suurenevad vasakult paremale ning y-koordinaadid ülevalt alla. Mängulaua vasaku ülemise ruudu koordinaadid on (0, 0) ja parema alumise ruudu koordinaadid on (9, 7).

    Tegevuse kodeering on ühetäheline. Kujundi liigutamiseks on numbrid (.-ga on tähistatud nupu algne asukoht)

    012
    3.5
    678

    Päripäeva ja vastupäeva keeramist tähistatakse vastavalt C - clockwise, c - counter-clockwise

  • Mängu lõpus saadab server teate (E nagu game Ended)

    E <S/R - mängija värv> <mängu seisu kirjeldus>
  • Mängu lõpu teate peale peab mängija programm oma töö lõpetama.

Protokolli detailid:

  • Mängu seisu kirjeldus on kujul

    <- | mängu tulemus> <- | viimane käik#viimase lasu kirjeldus> <seni tehtud käikude arv> <mängulaua kirjeldus>
  • Mängu tulemus on kujul

    <S/R/d - võitja Silver/Red/draw><G/G3/GM/E/T - mängu lõpu põhjus>

    G - mäng lõppes ühe mängija võiduga
    G3 - mäng lõppes 3D olukorraga
    GM - mäng lõppes käikude limiidi täis saamise tõttu
    E - üks mängijatest tegi vigase käigu
    T - mängija ületas talle antud ajalimiidi

  • Käigu kirjeldus on samasugune nagu mägija käigu kirjeldus protokolli ülevaate juures

  • Lasu kirjeldus on kujul

    <sfinksi x-koordinaat><sfinksi y-koordinaat><lasu trajektoor>[X<pihta saanud kujundi kirjeldus>]?

    Lasu trajektoor on numbrite jada, kus iga number näitab laserkiire liikumist ühe ruudu võrra. Suunad on kodeeritud vastavalt 0 - ülesse, 1 - paremale, 2 - alla ja 3 - vasakule. Kui laserkiir tabas mõnda kujundit, siis on trajektoor kirjeldatud selle kujundi asukohani, kui laserkiir lahkus mänguväljalt, siis on trajektoori viimane ruut esimene ruut väljaspool mängulauda.

  • Mängulaua kirjeldus

    <kujundite arv> <kujundite kirjeldused>

    Kujundite kirjeldused on toodud ülevalt alla vasakult paremale (st kõigepealt esimene rida (y=0), siis teine rida (y=1) jne.) ning eraldatud tühikutega.

  • Kujundi kirjeldus on formaadis

    <S/R - värv><x-koordinaat [0..9]><y-koordinaat [0..7]><kujundi tüüp><kujundi suund>

    Kujundite tüübide kodeering:

    P - vaarao (i.k. Pharaon)
    C - skarabeus (i.k. sCarab),
    A - Anubis (i.k. Anubis),
    Y - püramiid (i.k. pYramid),
    X - sfinks (i.k. sphinX)

    Vaarao, Anubise ning sfinksi suunad on kujundi näo suuna järgi, püramiididel peegli suuna järgi ning skarabeusidel "parempoolse" peegli järgi. Kujundi suundade kodeering:

    0 - ülesse/ülesse-paremale
    1 - paremale/paremale-alla
    2 - alla/alla-vasakule
    3 - vasakule/vasakule-ülesse

Näidislogi:

Iga rea alguses on toodud mängija tähis (P1 - hõbedane mängija, P2 - punane mängija)

P1< play khet Player1
P2< play khet Player2
P1> B S - - 0 26 R00X2 R40A2 R50P2 R60A2 R70Y1 R21Y2 S32Y3 R03Y0 S23Y2 R43C0 R53C1 R73Y1 S93Y3 R04Y1 S24Y3 S44C3 S54C2 R74Y0 S94Y2 R65Y1 S76Y0 S27Y3 S37A0 S47P0 S57A0 S97X0
P2> B R - - 0 26 R00X2 R40A2 R50P2 ... S97X0
P1> R S - - 0 26 R00X2 R40A2 R50P2 ... S97X0
P1< S23C
P2> R R - S23C#97000330110000 1 26 R00X2 R40A2 R50P2 ... S97X0
P2< R21C
P1> R S - R21C#002221100XR21Y3 2 25 R00X2 R40A2 R50P2 ... S97X0
...

Nõuanded

Interaktiivsetes programmides tuleb olla ettevaatlik, et väljundit ei puhverdataks, vaid iga rida väljastataks kohe (vaikimisi kogutakse efektiivsuse huvides suurem hulk andmeid puhvrisse ja väljastatakse hiljem ühekorraga).

C's ja C++'is programmeerijad, kes kasutavad stdio.h funktsioone, peaks enne sisendi-väljundi operatsioone andma käsu setlinebuf(stdout);

Samuti peaks nad sisendi lugemiseks kasutama scanf() asemel fgets().

Loetud sisendrea parsimise võiks teha järgnevalt:

char line[1000];
setlinebuf(stdout);

fgets(line, 1000, stdin);
sscanf(line, "..vorming..", &muutuja, ...);
/* eelnev parsib real olevad andmed muutujatesse */

C++'is programmeerijad, kes kasutavad iostream funktsioone, peaks iga rea väljastamise järel kasutama "cout << flush" (cin kasutamine käib nagu tavaliselt):

cout << guess << endl;
cout << flush;

Javas programmeerijad peaks väljundi vormistama järgnevalt:

import java.io.*;
...
PrintStream out = new PrintStream(System.out, true);
// eelnev keelab väljundi puhverdamise
...
out.println(guess); // väljastamine

Pascalis programmerijad peaks väljundi vormistama järgmiselt:

writeln(stdout, ...väljundandmed...);
flush(stdout);
Facebook Twitter