This shows you the differences between two versions of the page.
programare:tema1_cbcd_2015_2016 [2015/10/26 00:00] cosmin.boaca created |
programare:tema1_cbcd_2015_2016 [2015/10/26 17:50] (current) cosmin.boaca [Trimitere temă] |
||
---|---|---|---|
Line 6: | Line 6: | ||
**Termen de predare: ** To be decided | **Termen de predare: ** To be decided | ||
+ | |||
+ | ===== Obiective Temă ===== | ||
+ | |||
+ | * să se realizeze un program urmând anumite cerințe | ||
+ | * să se utilizeze funcţii, pentru a modulariza programul | ||
+ | * să se respecte formate stricte de intrare/ieşire | ||
+ | * să se însușească cunoștințele din primele 4 laboratoare | ||
+ | |||
+ | ===== Cunoştinte necesare ===== | ||
+ | * laboratoarele 1-4 | ||
+ | * matematică elementară | ||
+ | |||
+ | ===== Cerință ===== | ||
+ | |||
+ | === Task1. 20p === | ||
+ | |||
+ | Florin și-a descoperit de curând pasiunea pentru teoria numerelor. După îndelungi cercetări el a descoperit că există perechi de numere **(a, b)** cu o proprietate interesantă: | ||
+ | |||
+ | ** SumDiv(a) = b si SumDiv(b) = a ** unde | ||
+ | |||
+ | ** SumDiv(X) = suma divizorilor lui X care sunt mai mici ca X ** | ||
+ | |||
+ | Fiind foarte încântat de numerele descoperite Florin a vrut să-i arate lui Cosmin ** o listă cu toate perechile de numere mai mici decât K **. Totuși, Florin nu a fost atent și a pierdut lista cu numerele iar acum voi va trebui să-l ajutați să o refacă. În schimbul ajutorului vostru Florin o să vă răsplătească oferindu-vă 20 de puncte din tema la PC. | ||
+ | |||
+ | == Input == | ||
+ | |||
+ | Pe prima linie se va regăsi numărul K. | ||
+ | |||
+ | K | ||
+ | |||
+ | == Output: == | ||
+ | |||
+ | Pe prima linie se va găsi **numărul N de perechi** de forma (a, b) care resepctă proprietatea descrisă mai sus | ||
+ | Pe următoarele N linii se vor regăsi perechile **(ai, bi), ai < bi** sortate în ordinea crescătoare a numărului **ai**, iar în caz de egalitate în ordinea crescătoare a numărului **bi** | ||
+ | |||
+ | N | ||
+ | (a0, b0) | ||
+ | (a1, b1) | ||
+ | (a2, b2) | ||
+ | . | ||
+ | . | ||
+ | . | ||
+ | (aN, bN) | ||
+ | |||
+ | === Task2. 20p === | ||
+ | |||
+ | După recuperarea perechilor de numere pierdute Cosmin și Florin își pun tot mai multe întrebări legate de numere. Printre acestea se numără și următoarea întrebare: | ||
+ | |||
+ | ** Câte palindroame mai mici decât X se pot scrie ca produs de 2 numere de P cifre ? ** | ||
+ | |||
+ | ** Un palindrom este un număr care se citește la fel și de la stânga la dreapta și de la dreapta la stânga, de exemplu 121, 2222, 2442 ** | ||
+ | |||
+ | == Input == | ||
+ | |||
+ | Pe prima linie se vor găsi numerele P, X. | ||
+ | |||
+ | P X | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | Numărul de numere mai mici ca X care sunt palindroame și se pot scrie ca produs de 2 numere de P cifre. | ||
+ | |||
+ | == Restricții == | ||
+ | |||
+ | ** 0 < X < 2 ^ 63 ** | ||
+ | |||
+ | 0 < P < 4 | ||
+ | |||
+ | === Task3. 40p === | ||
+ | |||
+ | Cosmin si Florin au descoperit un nou joc. Ei au un teren de luptă de 8x8 codificat sub forma unui număr pe 64 de biți (unsigned long long). | ||
+ | Pe terenul de luptă se află soldați ** (codificați cu bit-ul 1) ** și celule libere ** (codificate cu bit-ul 0) **. | ||
+ | |||
+ | <note tip> | ||
+ | |||
+ | **7 = 0000000000000000000000000000000000000000000000000000000000000111** | ||
+ | |||
+ | Codifică harta următoare | ||
+ | |||
+ | ^ Hartă pentru valoarea 7^^^^^^^^ | ||
+ | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | ||
+ | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | ||
+ | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | ||
+ | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | ||
+ | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | ||
+ | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | ||
+ | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | ||
+ | | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | | ||
+ | |||
+ | </note> | ||
+ | |||
+ | Cosmin și Florin mută alternativ câte un soldat dintr-o celulă a hărții intr-o altă celulă a hărții. | ||
+ | Dacă un soldat este mutat într-o celulă în care se află alt soldat se vor lupta intre ei, iar ambii vor dispărea de pe teren. Mutările făcute | ||
+ | sunt codificate sub forma unui număr întreg astfel: | ||
+ | - primii 6 biți reprezintă pozitia curentă a unui soldat pe hartă: (primii 3 biți reprezintă coloana, iar următorii 3 biți reprezintă linia). | ||
+ | - următorii 6 biti reprezintă pozitia în care soldatul se va teleporta pe harta: (primii 3 biți reprezintă coloana, iar următorii 3 biți reprezintă linia) | ||
+ | |||
+ | <note tip> | ||
+ | |||
+ | Numărul **2655 (baza 10) ** = ** 101001011111 (baza 2) ** reprezinta o codificarea a următoarei mutări pe hartă: | ||
+ | |||
+ | poziția curentă: ** (011, 111) ** -> ** (3, 7) ** | ||
+ | |||
+ | poziția în care soldatul va fi mutat ** (101, 001) ** -> ** (5, 1) ** | ||
+ | |||
+ | </note> | ||
+ | |||
+ | Fiind dată o hartă inițiala și o lista de mutări codificate ca în exemplul anterior Cosmin și Florin vă roagă să afișați configurația finală a hărții sub forma unui număr pe 64 de biți. Ei vă vor recompensa cu 40 de puncte dacă reușiți să afișați configurația finală corect. | ||
+ | |||
+ | == Input == | ||
+ | |||
+ | Pe prima linie se va găsi un număr pe 64 de biți reprezentând configurația inițială a hărții. | ||
+ | |||
+ | Pe următoarea linie se va afla un număr N, reprezentând numărul de mutări făcute de soldați. | ||
+ | |||
+ | Pe următoarele N linii se vor afla numere întregi reprezentând codificările mutărilor. | ||
+ | |||
+ | ConfigurațieHartă | ||
+ | N | ||
+ | mutare1 | ||
+ | mutare2 | ||
+ | . | ||
+ | . | ||
+ | . | ||
+ | mutareN | ||
+ | |||
+ | == Output == | ||
+ | |||
+ | Configurația finală a jocului după ce au fost aplicate cele N mutări. | ||
+ | |||
+ | ConfigurațieFinală | ||
+ | |||
+ | == Precizări == | ||
+ | <note warning> | ||
+ | |||
+ | - Dacă pe poziția curentă nu se află un soldat (bit-ul corespunzător este 0) mutarea nu se va aplica | ||
+ | - Dacă pe poziția unde va fi mutat un soldat există un alt soldat ambii vor dispărea de pe hartă | ||
+ | - Folosiți tipuri de date unsigned pentru variabilele pe care faceți operații pe biți ** in special pentru configurația hărții ** | ||
+ | - Numărul afisat în fișierul de ieșire **TREBUIE** să fie un număr positiv | ||
+ | |||
+ | </note> | ||
+ | |||
+ | == Exemplu == | ||
+ | |||
+ | ** Input: ** | ||
+ | 7 | ||
+ | 4 | ||
+ | 3647 (muta de la (7,7) la (7,0)) | ||
+ | 3710 (muta de la (7,6) la (7,1)) | ||
+ | 3641 (muta de la (7,1) la (7,0)) | ||
+ | 1133 (muta de la (5,5) la (2,1)) | ||
+ | |||
+ | ** Output: ** | ||
+ | 4 | ||
+ | |||
+ | ** Explicație ** | ||
+ | |||
+ | {{http://s4.postimg.org/41260rbbx/Explanation.png}} | ||
+ | |||
+ | ==== Trimitere temă ==== | ||
+ | |||
+ | Tema va fi trimisă folosind [[https://vmchecker.cs.pub.ro|vmchecker]] | ||
+ | |||
+ | După cum probabil ați observat task-urile au un total de 80p. Celelalte 20p se vor acorda pentru [[https://www.kernel.org/doc/Documentation/CodingStyle|coding style]]. | ||
+ | |||
+ | Formatul arhivei va fi următorul: | ||
+ | - 3 fișiere .c, câte unul pentru fiecare task | ||
+ | - Un fișier **Makefile / makefile** care să conțină următoarele reguli: | ||
+ | - build-tX: crează executabilul aferent task-ului X, X ia valori din {1, 2, 3} | ||
+ | - run-tX: rulează executabilul aferent task-ului X, X ia valori din {1, 2, 3} | ||
+ | - Un fișier README în care descrieți ideea voastră pentru fiecare dintre task-uri | ||
+ | |||
+ | <note warning> | ||
+ | |||
+ | Arhiva trebuie să fie de tipul zip. | ||
+ | |||
+ | **Lipsa** fișierului README se depunctează cu 10p. | ||
+ | |||
+ | Inputul pentru **TOATE** task-urile va fi citit de la **stdin (tastatura)** iar output-ul va fi afișat la **stdout (ecran)**. | ||
+ | |||
+ | Dacă nu rezolvați un anumit task regulile build-tX / run-tX corespunzătoare task-ului respectiv **trebuie** să apară in Makefile, chiar dacă ele nu vor face nimic. | ||
+ | |||
+ | </note> |