Concurs Gold 2018, clasa a 5-a
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". Fiecare program va începe în unul din cele două jocuri.
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
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'.
- Tabla iniţială de joc va fi întotdeauna de un şir de maxim 30 de caractere.
- Tabla va conține întotdeauna o singură piesă 'X' și zero sau mai multe piese 'O'
- 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ă.
- Programul va afişa aceeaşi tablă, singura diferenţă fiind piesa mutată sau eliminată.
- 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'.
- Mutările se vor face prin:
- 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ă
- eliminarea de pe tablă a primei piese dinspre stînga
- Î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
- Programul care ia piesa 'X' de pe tablă cîştigă un punct în jocul respectiv.
- 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.
- Un meci va consta din două jocuri desfășurate pe aceeași tablă de intrare. Fiecare program va avea ocazia să înceapă.
- După două meciuri programul care acumulează mai multe puncte este cîştigător. Meciul se poate termina remiză, dacă fiecare program cîștigă un joc. Dacă un program mută greșit pierde meciul, cu excepția cazului în care ambele programe mută greșit, caz în care va fi remiză.
- Programul care cîştigă meciul primeşte trei puncte. În caz de remiză fiecare program primeşte cîte un punct.
Programul vostru
- Limbajul folosit va fi limbajul C. Atenție! Nu se acceptă extensii C++! Fișierele vor fi denumite cu extensia .c
- Fiecare mutare trebuie executată rapid, pentru a putea desfășura un număr mare de jocuri. Va trebui să vă încadrați în 0.1 secunde (o zecime de secundă) pe mutare. Vă voi semnala programele care depășesc timpul.
- Limita de memorie este de 64MB.
- 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.
- 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.
- 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 joi 14 iunie 2018, la o oră pe care o vom stabili de comun acord pentru ca toți să puteți fi prezenți. Dacă nu vom găsi o oră potrivită vom vota o altă zi, poate o sîmbătă. Vor fi acordate premii! Pot participa orice elevi de la cursurile IQ Academy, dar participarea nu este obligatorie.
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. Vor fi cinci table de concurs, ceea ce înseamnă că oricare două programe concurente vor juca cinci meciuri (10 jocuri).
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 club 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 |
---|---|---|
gold-rush | Victor Nicola & Tudor Voicu | 5 |
fluffyk9 | Ilinca Marcu | 5 |
CNGM's-program | Radu Fabian Dobre | 5 |
alx | Alexandru Nicu | 5 |
GoldRobber | Armin Asgari | 5 |
Optimus Prime | Teodor Tatomir | 5 |
Pink-Sidious | Remus Rughiniș | 5 |
Procrastinator | Elisa Ipate | 5 |
Golden Brains | Alex Benescu & Mihai Mocanu | 5 |
Cyber Caliphate | Rareș Mihai Iordache | 5 |
Gold&Silver | Ana Maria Petcu | 5 |
KDGOLD | Karina Dumitrescu & Daria Stoian | 5 |
IGotTheGold | Mircea Rebengiuc | 4 |
GoldRaptor | Andreea Chivu | 5 |
golden-program | Teodor Togan | 5 |
goldX | Denisa Dragomir & Tudor Grecu | 4 |
Destroyers | Alexandru Hossu & Vlad Burac | 5 |
ty | Timur Cadîr & Yusuf Fares | 5 |
Gold_Mining | Tudor Mușat & Andrei Calotă | 5 |
Golden_Luck | Lucian Badea | 5 |
goldcubix | David Stancu | 5 |
gold-attack | Albert Aizic | 5 |
minion | Amalia Cojocaru | 5 |
Golderino | Dragos Cojocariu | 5 |
Take_the_Gold | Luca Ilie | 5 |
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:
Pagina a devenit funcțională.
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 Teodor Tatomir care a cîștigat concursul cu programul Optimus Prime. Iată rezultatele complete aici: Clasa a V-a lecția 44 - 10 iun 2018