Concurs Gold 2015, clasa a 5-a

From Algopedia
Revision as of 21:38, 17 June 2015 by Cristian (talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Concurs: jocul Gold

Scrieți un program care să joace jocul Gold, descris mai jos. Elevii care vor reuși să termine implementarea jocului vor intra în concurs. În cadrul concursului fiecare program va juca cu fiecare alt program două jocuri, unul "tur" și unul "retur".

Descriere joc

Jocul Gold se joacă pe o linie de pătrate care conține mai multe piese tip 'O' și o singură piesă de tip 'X' (piesa de aur, 'gold'). Fiecare jucător joacă, pe rînd, mutînd spre stînga una din piese (fără a o așeza peste o altă piesă și fără a sări peste o altă piesă), sau ridicînd de pe tablă piesa cea mai din stînga. Jucătorul care ia de pe tablă piesa de aur, 'X', cîștigă.

Ce se cere, pe scurt

Dată o tablă de Gold, la intrare, trebuie să executați mutarea voastră și să tipăriți tabla rezultată la ieșire. Voi și oponentul vostru jucați pe rînd, mutînd sau luînd piese, pînă ce unul din jucători ia piesa 'X'. Cîștigătorul va primi un punct.

Programul vostru va citi un șir de caractere de la intrarea standard (citire cu fgetc(stdin)) reprezentînd o configurație a tablei de Gold, apoi va executa o mutare prin mutarea unei piese sau eliminarea celei mai din stînga piese, iar în final va scrie la ieșirea standard (scriere cu fputc(c, stdout)) un alt şir de caractere, configurația tablei după executarea mutării. Fiecare program va muta pe rînd, avînd la dispoziție 0.1 secunde pentru mutare.

Tabla de start

Jocul-gold-tabla-initiala.gif

Tabla de start constă din maxim 30 de căsuțe conținînd maxim 30 de piese. Ea este reprezentată printr-un şir de caractere:

  • '-' reprezintă o căsuță goală (spaţiu)
  • 'O' reprezintă o căsuță în care se află o piesă de tip 'O'
  • 'X' reprezintă o căsuță în care se află piesa de tip 'X'

La finalul şirului vom avea un caracter sfîrşit de linie (\n). Iată un exemplu de tablă de start:

-O-OO-O--X---O-

Această tablă are 15 căsuțe. În unele căsuțe avem piese 'O' și într-o singură căsuță avem o piesă 'X'.

  1. Tabla iniţială de joc va fi întotdeauna de un şir de maxim 30 de caractere.
  2. Tabla va conține întotdeauna o singură piesă 'X' și zero sau mai multe piese 'O'
  3. Odată început jocul oricare din piese poate fi mutată către stînga, sau, alternativ, cea mai din stînga piesă eliminată de pe tablă.
  4. Programul va afişa aceeaşi tablă, singura diferenţă fiind piesa mutată sau eliminată.
  5. Datele de intrare și cele de ieșire nu vor conține alte caractere în afara şirului de caractere corecte și caracterul sfîrșit de linie (\n) la finalul liniei.

Tabla unui joc în desfășurare

---OO-O--X---O-

Această tablă arată o mostră de joc după ce a fost efectuată o mutare: cea mai din stînga piesă 'O' a fost eliminată de pe tablă. Această mutare este efectuată înlocuind piesa 'O' cu caracterul '-', semnificînd o căsuță goală.

---OO-O--X-O---

Această tablă arată o mostră de joc după ce a fost efectuată încă o mutare: cea mai din dreapta piesă 'O' a fost mutată cu două poziții către stînga. Această mutare este efectuată înlocuind acea piesă 'O' cu caracterul '-' și caracterul '-' aflat la stînga cu două poziții cu caracterul 'O'.

  1. Mutările se vor face prin:
    1. mutarea unei piese 'O' sau 'X' către stînga, fără a sări peste alte piese și fără a o așeza peste o altă piesă
    2. eliminarea de pe tablă a primei piese dinspre stînga
  2. Întotdeauna va exista cel puțin piesa 'X' pe tabla de la intrare, așa încît întotdeauna va fi posibilă executarea unei mutări.

Punctarea

  1. Programul care ia piesa 'X' de pe tablă cîştigă un punct.
  2. Programul care în timpul unui joc mută greşit sau depăşeşte timpul pierde acel joc, adversarul primind două puncte. În felul acesta dacă programul joacă unele jocuri corect nu va rata concursul ci doar va pierde jocurile în care joacă incorect.
  3. Fiecare meci va consta din două jocuri desfășurate pe aceeași tablă de intrare. Fiecare program va avea ocazia să înceapă.
  4. După două meciuri programul care acumulează mai multe puncte este cîştigător. Meciul se poate termina remiză.
  5. Programul care cîştigă meciul primeşte trei puncte. În caz de remiză fiecare program primeşte cîte un punct.

Programul vostru

  1. Limbajul folosit va fi limbajul C. Atenție! Nu se acceptă extensii C++! Fișierele vor fi denumite cu extensia .c
  2. Fiecare mutare trebuie executată în 0.1 secunde (o zecime de secundă), pentru a putea desfășura un număr mare de jocuri.
  3. Limita de memorie este de 64MB.
  4. Programul vostru trebuie să citească de la intrarea standard și să scrie la ieșirea standard. Aceasta înseamnă să nu folosiți fișiere ci instrucțiunile fgetc/fputc cu parametri stdin/stdout în loc de fișiere.
  5. Programul vostru nu poate să citească din, sau să scrie în fișiere. Singura informație disponibilă este cea citită la intrare și anume starea actuală a tablei de joc.
  6. Datele de la intrare sînt corecte. Intrarea nu va conține alte caractere în afara celor corecte reprezentînd spații, piese de tip 'O' și 'X' și \n la finalul liniei.

Desfășurarea concursului

Concursul se va desfășura în timpul orelor de cerc de marți 16 iunie 2015, orele 11:30-13:30. Vor fi acordate premii! Pot participa orice elevi de la clasa a 5-a de la Tudor Vianu. Dacă vor fi mai mult de 30 de participanți s-ar putea să schimb puțin regulile de desfășurare din criză de timp.

Părinții, familia, prietenii, sînt bine veniți să asiste, dacă doresc.

Concursul se va desfășura în sistem campionat. Fiecare program va juca un meci cu fiecare alt program. Un meci constă din două jocuri pe aceeași tablă, în care fiecare din programe începe, pe rînd. În final clasamentul programelor se stabilește pe baza numărului de puncte acumulate.

Trimiterea codului sursă

Momentul limită al acceptării unui program pentru concurs este la începutul cercului din 16 iunie. Cu toate acestea vă încurajez să-mi trimiteți variante intermediare pe email (numai programul C vă rog, nu și proiectul). Voi încerca să vă returnez cum s-a comportat programul vostru contra celorlalte programe trimise. De asemenea vă voi raporta erorile de execuție (depășire de timp, mutare eronată, depășire de memorie). Vă rog să-mi trimiteți sursele ca atașamente și nu direct in corpul mesajului.

Fiecare program C care participă va fi denumit cu o denumire de cod ce va fi folosită în tabelele de rezultate drept identificare. Primele linii ale programului vostru C vor avea următorul antet, drept comentariu, care conține numele programului și datele concurentului:

/*
   Nume program   : rapid-si-furios.c
   Nume concurent : Cristian Francu
   E-mail         : cristian@francu.com
*/

În acest exemplu numele fișierului C este rapid-si-furios.c, iar programul va fi referit în tabelele de rezultate ca rapid-si-furios.

Atenție: Puteți forma echipe de maxim doi oameni, dar premiul se va împărți la doi.

Atenție: Trimiteți-mi cît mai repede un email de confirmare a participării, ca să știu cîte programe vor fi. Emailul trebuie să conțină numele programului, numele și emailurile concurenților din echipă precum și clasa în care se află ei.

Reguli anti-copiere

Pentru a mă asigura că programul este scris de voi îmi voi rezerva dreptul de a vă pune întrebări în legatură cu părţi din codul vostru C. Dacă nu sînteţi în măsură să explicaţi satisfăcător ce calculează propriul vostru program, sau nu aveţi idee ce face o parte din el veţi fi descalificaţi din concurs.

Atenţie: aceasta nu înseamnă că sînt împotriva surselor de inspiraţie. Este chiar foarte lăudabil dacă învăţaţi ceva nou pentru acest concurs, învăţatul fiind în spiritul acestui cerc de informatică. Dar nu este în regulă să copiaţi o metodă sau bucăţi de cod de pe diverse pagini de web, fără să înţelegeţi exact ce face, doar în ideea că funcţionează. Aceasta nu înseamnă că aţi învăţat ceva nou, ci doar că aţi utilizat munca altora. Intenţia acestui concurs şi a acestui cerc este să aveţi o înţelegere profundă a ceea ce programaţi.

Echipe înscrise pînă acum

Următoarele programe sînt înscrise la concurs. Cei nu mi-ați trimis un nume pentru programul vostru vă rog să-mi trimiteți unul. Programul este cel care participă, el trebuie să aibă un nume, chiar dacă este creația voastră.

Program Programatori Clasa
Midastouch Patrick Dan şi Vlad Cainamisir clasa a 5a
Pot_of_gold Cosmin Toniţă şi Mihai Indreiaş clasa a 5a
2gold4u Dinu Roşca şi Tudor Ivan clasa a 5a
gold&silver.c Daniel Apostol, Andrei Ionescu clasa a 5a

Testare

Aţi scris un program şi vreţi să ştiţi dacă funcţionează corect. Cum procedaţi? Puteţi să scrieţi voi un program care să execute programul vostru. Sau puteţi adăuga funcţionalitate programului vostru care să vă permită să jucaţi între diverse variante, pentru a şti care este mai puternică.

Aceasta este cea mai bună soluţie. Totuşi, pentru a vă uşura verificarea, am creat o pagină unde vă puteţi testa programele punîndu-le să joace contra cîtorva programe de antrenament. Programele de antrenament joacă mediu spre slab. Iată pagina:

Rugăminte: folosiți această pagină cît de rar puteți. Ea suprasolicită serverul algopedia. Salvați pagina cu rezultate, pentru consultări ulterioare, nu executați din nou programul în pagină.

Rezultate

Felicitări lui Daniel Apostol și Andrei Ionescu care au cîștigat concursul cu programul gold&silver. Iată rezultatele complete aici: Clasa a V-a lecția 42 - 16 iun 2015