Table of Contents

The Galactic War - SD version

Responsabili:

Actualizări

Obiective

Introducere

“Look here, Hardin, you were on Anacreon once before. You were young then; we were both young. But even then we had entirely different ways of looking at things. You’re what they call a man of peace, aren’t you?

I suppose I am. At least, I consider violence an uneconomical way of attaining an end. There are always better substitutes, though they may sometimes be a little less direct.

Yes. I’ve heard of your famous remark: “Violence is the last refuge of the incompetent.” And yet… I wouldn’t call myself exactly incompetent. […]

Your highness, you are wasting time. If you mean to declare war, and are informing me of the fact, you will allow me to communicate with my government at once.

Sit down, Hardin. I am not declaring war, and you are not communicating with your government at all. When the war is fought, not declared, Hardin, fought, the Foundation will be informed of it in due time by the atom blasts of the Anacreonian navy under the lead of my own son upon the flagship Wienis.”

Cerință

Veți avea de simulat un război galactic, în care participanții sunt planetele, fiecare având o linie de scuturi pentru protecție. Planetele sunt așezate într-un cerc, astfel încât fiecare planetă are 2 vecini (în cazul în care există cel puțin 3 planete în galaxie).

Galaxia va trebui reprezentată cu ajutorul unei Liste Circulare Dublu Înlănțuită (CDLL). De asemenea, scuturile fiecărei planete vor fi reprezentate tot cu ajutorul unei CDLL. Prin urmare, este nevoie sa implementați structura CDLL generica (să poată stoca diferite tipuri de valori).

O reprezentare grafica este urmatoarea:

 Img 1.

 Img 2.

In reprezentarea de mai sus, se afla 4 planete:

Inițial, toate planetele au 0 kill-uri (Nicio planetă nu a distrus nicio planetă).

În timpul războiului, o planetă se poate lupta (ciocni) doar cu vecinii săi, astfel, în urma luptei, unele dintre planete vor fi distruse. Atunci când 2 planete să ciocnesc, fiecare își pune la bătalie o unitate de scut. Când o planeta (p1) cauzează moartea altei planete (p2), numărul de planete distruse (kill-uri) al planetei p1 crește cu o unitate.

Planetele vor avea punctele de coliziune la indecșii n / 4 și la (n / 4) * 3, unde n este numărul de scuturi al planetei. De exemplu, dacă o planetă are 12 scuturi, numerotate de la 0 la 11, atunci vom avea punctul de coliziune cu planeta din dreapta (next) la scutul cu indexul 3 (12 / 4) și punctul de coliziune cu planeta din stânga (prev) la scutul cu indexul 9 (12 / 4 * 3). În reprezentarea grafică de mai sus, punctul de coliziune al planetei cu vecinul drept are culoarea verde, iar cel cu vecinul stâng are culoarea roșie.

Input

Pe prima linie se găsește M, reprezentând numărul de acțiuni ce vor fi realizate în galaxie. Pe următoarele M linii se găsesc informații despre fiecare acțiune. Acțiunile pot fi următoarele:

Exemplu

Input

  22
  SHW 0
  ADD Mercury 0 4
  ADD Venus 1 8
  ADD Earth 2 12
  ADD Jupiter 3 4
  ADD Saturn 4 12
  ADD Uranus 5 8
  ADD Neptunus 6 5
  ADD Pluto 7 9
  BLH 6
  ROT 2 c 5
  ROT 3 t 4
  SHW 2
  UPG 4 2 1
  COL 3 4
  SHW 3
  ROT 4 c 1
  COL 3 4
  SHW 3
  SHW 6
  ADD Tiaria 4 4
  SHW 4
  

Output

  Planet out of bounds!
  The planet Mercury has joined the galaxy.
  The planet Venus has joined the galaxy.
  The planet Earth has joined the galaxy.
  The planet Jupiter has joined the galaxy.
  The planet Saturn has joined the galaxy.
  The planet Uranus has joined the galaxy.
  The planet Neptunus has joined the galaxy.
  The planet Pluto has joined the galaxy.
  The planet Neptunus has been eaten by the vortex.
  NAME: Earth
  CLOSEST: Venus and Jupiter
  SHIELDS: 1 1 1 1 1 1 1 1 1 1 1 1 
  KILLED: 0
  NAME: Jupiter
  CLOSEST: Earth and Saturn
  SHIELDS: 1 0 1 1 
  KILLED: 0
  The planet Jupiter has imploded.
  NAME: Saturn
  CLOSEST: Earth and Uranus
  SHIELDS: 1 1 1 2 1 1 1 1 1 0 0 1 
  KILLED: 1
  Planet out of bounds!
  The planet Tiaria has joined the galaxy.
  NAME: Tiaria
  CLOSEST: Saturn and Uranus
  SHIELDS: 1 1 1 1 
  KILLED: 0
  

Explicații

Click to display ⇲

Click to hide ⇱

    Avem 22 de comenzi. inițial, galaxia este goală.
    Comanda de show eșuază, deoarece nu avem nicio planetă în galaxie.
    Se adaugă planeta Mercury pe poziția 0 cu 4 scuturi.
    Se adaugă planeta Venus pe poziția 1 cu 8 scuturi.
    Se adaugă planeta Earth pe poziția 2 cu 12 scuturi.
    Se adaugă planeta Jupiter pe poziția 3 cu 4 scuturi.
    Se adaugă planeta Saturn pe poziția 4 cu 12 scuturi.
    Se adaugă planeta Uranus pe poziția 5 cu 8 scuturi.
    Se adaugă planeta Neptunus pe poziția 6 cu 5 scuturi.
    Se adaugă planeta Pluto pe poziția 7 cu 9 scuturi.
    Planeta Neptun este înghițită de o gaură neagră.
    Planeta 2 (Earth) se rotește în sensul acelor de ceasornic cu 5 unități.
    Planeta 3 (Jupiter) se rotește în sens trigonometric cu 4 unități.
    se afișeaza informațiile despre planeta2 (Earth).
    Planeta 4 (Saturn) își consolidează scutul de pe poziția 2 cu 1 unitate.
    Planetele 3 (Jupiter) și 4 (Saturn) se ciocnesc.
    Se afișează informațiile despre planeta3 (Jupiter).
    Planeta 4 (Saturn) se rotește în sensul acelor de ceasornic cu 1 unitate.
    Planetele 3 (Jupiter) și 4 (Saturn) se ciocnesc. Planeta 3 (Jupiter) face implozie.
    Acum, planeta Earth va fi vecină cu planeta Saturn. 
    Se afișeaza informațiile despre planeta Saturn.
    Comanda de show eșuază, deoarece avem 6 planete în galaxie, numerotate de la 0 la 5.
    Se adaugă planeta Tiaria pe poziția 4 în galaxie, între Saturn și Uranus.
    Se afișeaza informații despre aceasta.
    

Precizări

Implementarea galaxiei și a scuturilor planetelor trebuie realizata cu o listă circulară dublu înlănțuită generică. Nerespectarea acestui lucru va aduce o depunctare de 20p.

Pentru investigarea problemelor de tip Segmentation Fault sau comportament incorect al aplicației la unul din teste, pentru debugging, se recomandă folosirea gdb Una dintre depunctări este pentru leak-uri de memorie. În Linux pentru identificarea lor puteți folosi utilitarul valgrind.

Pentru instalarea `gdb` și `valgrind`, pe o distribuție Ubuntu se poate folosi comanda:

student@sd:~$ sudo apt-get install gdb valgrind

Pentru debugging și detectarea leak-urilor de memorie este necesar să ștergeți toate optimizările de la flag-urile de compilare (e.g. `-O3`) și trebuie să compilați doar cu flag-urile `-Wall -g` (sau cele care mai activează alte warning-uri, e.g. `-Wextra`).

Nu trebuie la fiecare eroare considerată fatală să eliberați fiecare pointer alocat dinamic. În cadrul corecturii temei principala verificare pentru memory leaks va fi pe o funcționare corecta/normală.

TL; DR

Checker

Teste: 2021-tema1-check.zip.

Temele vor fi trimise pe vmchecker. Atenție! Temele trebuie trimise în secțiunea Structuri de Date (CA).

Arhiva trebuie să conțină:

Punctaj

Atenție! O temă care nu compilează pe vmchecker va primi 0 puncte.

  1. 80p teste
  2. Fiecare test este verificat cu valgrind. Dacă un test are memory leaks, nu va fi punctat.
  3. 20p README + comentarii/claritate cod (ATENȚIE! Fișierul README trebuie făcut explicit, cât să se - înțeleagă ce ați făcut în sursă, dar fără comentarii inutile și detalii inutile).
  4. Se acordă 20% din punctajul obținut pe teste, ca bonus pentru coding style. De exemplu, pentru o temă care obține maxim pe teste, se pot obține 20p bonus dacă nu aveți erori de coding style. Pentru o temă ce trece 18 teste din 20, se pot obține 18p dacă nu aveți erori de coding style.
  5. O temă care obține 0p pe vmchecker este punctată cu 0.
  6. Temele au deadline hard. Prin urmare, o temă trimisă dupa deadline este punctată cu 0.

Nu copiați! Toate soluțiile vor fi verificate folosind o unealtă de detectare a plagiatului. În cazul detectării unui astfel de caz, atât plagiatorul cât și autorul original (nu contează cine e) vor primi punctaj 0 pe toate temele! De aceea, vă sfătuim să nu vă lăsați rezolvări ale temelor pe calculatoare partajate (la laborator etc), pe mail/liste de discuții/grupuri etc.

FAQ

Q: Se pot folosi flag-uri de optimizare?

A: Nu aveți voie să folosiți flag-uri de optimizare în Makefile (-O3, -O2, etc.).

Q: Tema 1 se poate face în C++?

A: Nu.

Q: Se pot folosi variabile globale?

A: Nu.

Suport, întrebări și clarificări

Pentru întrebări sau nelămuriri legate de temă folosiți forumul temei.Orice întrebare e recomandat să conțină o descriere cât mai clară a eventualei probleme. Întrebări de forma: “Nu merge X. De ce?” fără o descriere mai amănunțită vor primi un răspuns mai greu.

ATENȚIE să nu postați imagini cu părți din soluția voastră pe forumul pus la dispoziție sau orice alt canal public de comunicație. Dacă veți face acest lucru, vă asumați răspunderea dacă veți primi copiat pe temă.