This shows you the differences between two versions of the page.
programare:teme_2024:tema1_2024_cbd [2024/11/07 16:38] cezar.zlatea |
programare:teme_2024:tema1_2024_cbd [2024/11/25 14:34] (current) cezar.zlatea [Validare locală temă] |
||
---|---|---|---|
Line 2: | Line 2: | ||
==== Changelog: ==== | ==== Changelog: ==== | ||
- | * 7.11.2024: Page Created | + | * 7.11.2024: pagina creata |
+ | * 8.11.2024: clarificari enunt si mici completari | ||
+ | * 11.11.2024: adaugat arhiva schelet si linkuri lipsa | ||
+ | * 13.11.2024: clarificari pentru task 1: indexarea coloanelor | ||
+ | * 13.11.2024: teste corectate | ||
==== Responsabili: ==== | ==== Responsabili: ==== | ||
* [[cr.zlatea@gmail.com|Zlatea Cezar]] | * [[cr.zlatea@gmail.com|Zlatea Cezar]] | ||
Termen de predare: | Termen de predare: | ||
- | * TBD | + | * 27.11.24 - Soft |
+ | * 29.11.24 - Hard | ||
Pentru fiecare zi (24 de ore) de întârziere, se vor scădea 10 puncte din nota acordată, până la atingerea deadline-ului hard. | Pentru fiecare zi (24 de ore) de întârziere, se vor scădea 10 puncte din nota acordată, până la atingerea deadline-ului hard. | ||
Line 22: | Line 26: | ||
====Întrebări==== | ====Întrebări==== | ||
- | Dacă aveți nelămuriri, puteți să ne contactați pe forumul dedicat (TODO - dupa ce va fi creata pagina) sau pe (TODO - dupa ce va fi creata pagina).\\ | + | Dacă aveți nelămuriri, puteți să ne contactați pe forumul dedicat: pe [[https://curs.upb.ro/2024/mod/forum/view.php?id=59799|Mudal]] sau pe [[https://teams.microsoft.com/l/channel/19%3A33535da073304873b9b6649af36009c1%40thread.tacv2/Tema%201?groupId=d8e68d9b-e107-4d94-8c1b-4a6ec49a1bd8&tenantId=2d8cc8ba-8dda-4334-9e5c-fac2092e9bac|Teams]].\\ |
Nu se acceptă întrebări în ultimele 24 de ore înainte de deadline. | Nu se acceptă întrebări în ultimele 24 de ore înainte de deadline. | ||
Line 64: | Line 68: | ||
=== Task 1. Spin the... pixels? (10p) === | === Task 1. Spin the... pixels? (10p) === | ||
- | Se doreste rotirea unei coloane specificate. De exemplu: daca avem o matrice cu 5 linii si 3 coloane, si dorim sa rotim coloana 2 cu 3 pozitii, operatia dorita inseamna permutarea simbolurilor de pe coloana a doua cu trei pozitii in jos, pastrand coloanele 1 si 3 neschimbate. Permutarea are loc in sens natural, de sus in jos, iar simbolurile care "ies din matrice" vor fi mutate la inceputul acesteia. Exemplu ilustrativ: | + | Se doreste rotirea unei coloane specificate. De exemplu: daca avem o matrice cu 5 linii si 3 coloane, si dorim sa rotim coloana a doua cu 3 pozitii, operatia dorita inseamna permutarea simbolurilor de pe coloana a doua cu trei pozitii in jos, pastrand prima si ultima coloana neschimbate. Permutarea are loc in sens natural, de sus in jos, iar simbolurile care "ies din matrice" vor fi mutate la inceputul acesteia. Exemplu ilustrativ: |
N = 5, M = 3; | N = 5, M = 3; | ||
Line 72: | Line 76: | ||
0 1 2 | 0 1 2 | ||
3 4 5 | 3 4 5 | ||
+ | c = 1, r = 3 // indexare de la 0 pentru coloane | ||
- | Rotirea coloanei 2 cu 3 pozitii inseamna: | + | Rotirea coloanei a doua cu 3 pozitii inseamna: |
1 8 3 | 1 8 3 | ||
Line 109: | Line 114: | ||
</note> | </note> | ||
- | TODO | + | === Task 3. All in. (15p) === |
+ | |||
+ | <note> | ||
+ | mentiune: este preferabil ca primele doua taskuri sa fie implementate inainte de acesta | ||
+ | </note> | ||
+ | |||
+ | Pus in fata aparatului real, Gigel doreste sa isi noteze "castigurile", asa incat va roaga pe voi sa il ajutati. Veti primi la inceput dimensiunile matricii, apoi matricea in sine, precum si o serie de operatii sub forma de perechi (coloana, rotatie). La final, veti afisa scorul obtinut de Gigel in configuratia finala a matricii, insumand toate scorurile obtinute in fiecare dintre stagiile intermediare. | ||
+ | |||
+ | === Task 4. So close! (15p) === | ||
+ | |||
+ | Gigel se intreaba, la un moment dat, ce ar putea realiza daca ar putea sa schimbe, la alegere, un simbol din matrice. Va roaga pe voi, programatorii, sa implementati aceasta functionalitate. Mai exact, el doreste sa schimbe un simbol de pe o anumita pozitie cu un alt simbol, si sa obtina scorul maxim posibil in urma acestei operatii. | ||
+ | |||
+ | Se cere sa se afiseze scorul maxim teoretic pe care l-ar fi putut castiga Gigel in aceste conditii. | ||
+ | |||
+ | === Task 5. What if? ... (20p) === | ||
+ | |||
+ | Dupa ce Gigel a visat cu ochii deschisi la niste castiguri fabuloase, el s-a gandit la o alta posibilitate: deoarece nu poate schimba valorile deja inscrise in aparat, isi imagineaza ca ar putea roti la alegere doua coloane, dupa propria vointa, ca sa obtina un scor maxim. Din acest motiv, va intreaba cum ar putea sa obtina un scor maxim in urma a doua rotiri cu un numar arbitrar de pozitii. | ||
+ | |||
+ | Se cere sa se calculeze castigul maxim posibil obtinut de Gigel in urma a doua rotiri. | ||
+ | |||
+ | <note> | ||
+ | Consideram ca ambele rotiri se fac in acelasi timp, fiind alese de noi atat coloanele pe care se vor executa, cat si numarul de pozitii rotite pe fiecare dintre ele. Asadar, se va calcula scorul unei **singure** configuratii. | ||
+ | </note> | ||
+ | |||
+ | === Task 6. (Bonus) 99% of gamblers quit right before they win (20p) === | ||
+ | |||
+ | Pe masura ce Gigel halucina niste rotiri spectaculoase, banii din cont i s-au terminat. Cum ultimii lui bani sunt rezervati pentru o **shaorma**, el incepe sa isi imagineze un joc nou, care nu mai necesita pierderi suplimentare. | ||
+ | |||
+ | Se cere implementarea unui joc nou, dupa urmatoarele reguli: | ||
+ | * jocul se desfasoara in interiorul cadranului aparatului | ||
+ | * scopul este de a porni din coltul stanga-sus al cadranului si de a ajunge in coltul dreapta-jos al acestuia, parcurgand drumul cu un cost minim | ||
+ | * trecerea in fiecare simbol are un cost asociat, iar costul total al drumului este suma costurilor tuturor simbolurilor parcurse | ||
+ | * o miscare valida inseamna o deplasare in jos, in dreapta, in stanga sau in sus | ||
+ | * jucatorul nu poate iesi din cadran | ||
+ | * costul fiecarei treceri este egal cu modulul diferentei dintre **valoarea simbolului respectiv** si **valoarea simbolului initial (adica cel din stanga-sus)** | ||
+ | |||
+ | Se cere calcularea costului minim al drumului. Gigel ar paria ca stie sa gaseasca acest cost mai repede ca voi, doar ca se afla in mici dificultati financiare. | ||
+ | |||
+ | Exemplu: | ||
+ | |||
+ | {{:programare:teme_2024:t6_1.png?200|}} {{:programare:teme_2024:drum_exemplu_t6.png?200|}} | ||
+ | |||
+ | Raspunsul este 12. Explicatie: (7 - 5) + (5 - 5) + (7 - 5) + (5 - 1) + (5 - 1) | ||
+ | |||
+ | ==== Formate de intrare ==== | ||
+ | |||
+ | Fiecare task va avea datele de intrare citite de la standard input/tastatura, in felul urmator: | ||
+ | |||
+ | * pe prima linie se afla numarul taskului, sub forma unui numar intreg de la 1 la 5 | ||
+ | * pe a doua linie se afla doua numere naturale N si M, separate printr-un spatiu, reprezentand numarul de linii, respectiv numarul de coloane ale matricii | ||
+ | * pe urmatoarele N linii se afla cate M numere naturale, separate printr-un spatiu, reprezentand matricea | ||
+ | * pentru taskul 1, dupa matrice, pe urmatoarea linie se afla 2 numere naturale, reprezentand coloana si numarul de pozitii cu care se va roti | ||
+ | * pentru taskul 3, dupa matrice, pe urmatoarea linie se afla un numar natural T, reprezentand numarul de operatii de rotire, urmat de T perechi de numere naturale, separate printr-un spatiu, reprezentand coloana si numarul de pozitii cu care se va roti | ||
+ | * pentru taskurile 2, 4, 5, 6 nu se vor mai citi alte date | ||
+ | |||
+ | ==== Formate de iesire ==== | ||
+ | |||
+ | Fiecare task va cere afisarea unor valori la standard output/consola, astfel: | ||
+ | |||
+ | * task 1: se va afisa matricea obtinuta in urma rotirii specificare; fiecare linie va avea elementele separate de cate un spatiu, iar liniile vor fi despartite de cate un caracter newline **\n** | ||
+ | * task 2: se vor afisa doua numere, fiecare pe cate un rand: prima valoare reprezinta numarul de combinatii castigatoare regasite in configuratie, iar a doua fiind scorul obtinut de acea configuratie | ||
+ | * task 3: va fi scris un singur numar, reprezentand suma tuturor scorurilor obtinute in urma fiecarei configuratii | ||
+ | * task 4: se cere un singur numar, insemnand scorul maxim total in conditiile cerintei | ||
+ | * task 5: se cere un singur numar, insemnand scorul maxim total in conditiile cerintei | ||
+ | * task 6: se va afisa costul celui mai scurt drum in jocul descris | ||
+ | |||
+ | ==== Constrangeri ==== | ||
+ | |||
+ | * 1 <= N <= 1000 | ||
+ | * 1 <= M <= 500 | ||
+ | * 1 <= T <= 1000 | ||
+ | * 0 <= matrice[i][j] <= 9 | ||
+ | * 1 <= c <= M, unde c este coloana rotita | ||
+ | * **0 <= r <= 2 ^31 - 1**, unde r reprezinta numarul de pozitii cu care se va roti o coloana | ||
+ | |||
+ | <note warning> | ||
+ | Orice vector/matrice va fi alocat dinamic, folosind functiile corespunzatoare, si eliberat ulterior. In caz contrar, se vor aplica depunctari. | ||
+ | </note> | ||
+ | |||
+ | <note> | ||
+ | Pentru taskul 5, testele "mari" au fost eliminate, deoarece solutia naturala ar fi fost prea ineficienta. | ||
+ | </note> | ||
==== Coding Style ==== | ==== Coding Style ==== | ||
Line 125: | Line 211: | ||
==== Validare locală temă ==== | ==== Validare locală temă ==== | ||
- | Pentru a vă ajuta în dezvoltarea temei, arhiva (TODO) conține o copie a checkerului. | + | Pentru a vă ajuta în dezvoltarea temei, arhiva {{:programare:teme_2024:vscode_improvements.zip|}} conține o copie a checkerului. |
- | + | Pentru a instala dependențele necesare verificării pentru **coding style** <del>utilizați scriptul **install-linters.sh**</del>: | |
- | Pentru a instala dependențele necesare verificării pentru **coding style** utilizați scriptul **install-linters.sh**: | + | |
<code> | <code> | ||
- | ./install-linters.sh | + | sudo apt-get update |
+ | sudo apt-get install -y clang clang-tidy python3 python3-pip | ||
+ | sudo python3 -m pip install -U pip # in caz de eroare de genul "external package manager", puteti adauga --break-system-packages | ||
+ | sudo python3 -m pip install cpplint | ||
</code> | </code> | ||
- | |||
Pentru a rula checkerul local folosiți comanda: | Pentru a rula checkerul local folosiți comanda: | ||
<code> | <code> | ||
- | ./check.sh | + | ./local.sh checker # va fi nevoie de docker deja instalat |
+ | </code> | ||
+ | sau | ||
+ | <code> | ||
+ | ./checker/checker.py # doar verificarea output-ului testelor | ||
+ | </code> | ||
+ | sau | ||
+ | <code> | ||
+ | cd checker && ./checker.sh # checker integral, rulat local | ||
</code> | </code> | ||
<note> | <note> | ||
- | Codul sursă este compilat folosind flagurile **-Wall -std=gnu11**: | + | Codul sursă este compilat folosind flagurile **-Wall**: |
* **-Wall** - compilatorul va avertiza (warn) orice operații care pot genera un comportament nedefinit | * **-Wall** - compilatorul va avertiza (warn) orice operații care pot genera un comportament nedefinit | ||
- | * **-std=gnu11** - dialectul GNU dupa standardul ISO C11 | ||
</note> | </note> | ||
==== Trimitere temă ==== | ==== Trimitere temă ==== | ||
- | Tema va fi trimisă folosind (TODO, dupa ce va fi creata pagina), cursul **Programarea Calculatoarelor (CB & CD)**, activitatea "Tema 1". \\ | + | Tema va fi trimisă folosind pagina de Moodle, cursul **Programarea Calculatoarelor (CB & CD)**, activitatea "Tema 1". \\ |
Toate temele sunt testate în mod automat pe Moodle. | Toate temele sunt testate în mod automat pe Moodle. |