This is an old revision of the document!


Tema de casă 2 - Codeland War

Responsabili: Denisa Sandu și Radu Stochițoiu

Deadline: 22.11.2015

Ultima modificare: 4.11.2015

Obiective

În urma realizării acestei teme, studentul va fi capabil:

  • să utilizeze matrici și vectori
  • să folosească operații pe biți
  • să înțeleagă conceptul de criptare/ decriptare

Enunţul temei

Locuitorilor din Codeland le-a fost declarat război de către nemiloșii barbari din Common Town, mult mai numeroși și specializați în lupte. Întrucât printre codelandieni există un vrăjitor bătrân, fost student al Facultății de Automatică și Calculatoare, acesta le-a promis că își va folosi ultimele puteri pentru a vă trimite vouă, studenților, locațiile bazelor în care sunt situați luptătorii din Codeland, pentru ca voi să vă alăturați lor în cele mai sigure baze. Magia, însa, e mai complicată de atât, iar voi, studenții, trebuie să vă arătați demni de a o accesa! Datele transmise de vrăjitor ajung la voi criptate, alături de un pergament pe care sunt explicate regulile decriptării.

Task 1

40% din punctajul pe teste

Primul număr primit, b, reprezintă ingredientul principal al magiei. Acesta este urmat de dimensiunile terenului pe care sunt situate bazele, m și n, ce este structurat asemenea unei matrice. Terenul conține linii între 0 și m-1 și coloane între 0 și n-1. Până la întâlnirea lui -1, vă va fi oferit un șir de numere, pe care voi trebuie să îl decodificați; b reprezintă numărul maxim de biți pe care îi puteți reține deodată.

Considerând că b este egal cu 3, iar șirul de numere este 2, 3, 1, 5, -1 (în binar, 10, 11, 1, 101), șirul nou format va fi 1 0 1 1 1 0, astfel:

  • luăm cei 2 biți ai numărului 2, deoarece nu ajung la limita lui b; (1 0)
  • din cei 2 biți ai numărului 3, îl putem lua doar pe primul, moment în care am atins numărul maxim de biți pe care îi putem reține deodată; (1 0 1)
  • cel de-al doilea bit al numărului 3 este ignorat;
  • luăm singurul bit al numărului 1; (1 0 1 1)
  • luăm doar primii 2 biți ai numărului 5 și îl ignorăm pe ultimul, deoarece ar depăși limita impusă de b. (1 0 1 1 1 0)

Prima parte a acestei teme presupune găsirea acestui șir de biți, folosindu-vă de numărul b și de șirul de numere oferite de vrăjitor.

Task 2

30% din punctajul pe teste

Din noul șir pot fi extrase coordonatele bazelor în care sunt situați soldații; până la întâlnirea perechii {-1, -1}, vă sunt oferite intervale de tipul [x, y], ce trebuie interpretate astfel:

  • numărul format din biții situați în intervalul [x, y] reprezintă poziția în matrice;

Considerăm șirul de biti 1 0 1 0 1 1 1 0 1, x = 3, y = 7, m = 4, n = 5. Numărul format va fi 14 (0 1 1 1 0), iar corespondentul lui în matrice este ilustrat în imaginea de mai jos.

  • în cazul în care y < x, x >= dimensiune_sir_biti sau y < 0 atunci perechea {x, y} se ignora și se trece la urmatoarea;
  • în cazul în care x < 0 atunci x = 0;
  • în cazul în care y >= dimensiune_sir_biti atunci y = poziția ultimului bit din șir (dimensiune_sir_biti - 1);
  • în cazul în care y - x > 30, y se va reduce cât este necesar pentru a forma un număr de maxim 31 biți (⇐2147483647);
  • în cazul în care din intervalul [x, y] se formează un număr care depașește dimensiunile matricei, numărul va fi redus la valoarea lui modulo m*n.

Pentru a obține punctajul celui de-al doilea task, trebuie să afișați pe un rând, separate prin spațiu, coordonatele bazelor.

Task 3

30% din punctajul pe teste

Dupa ce ați găsit coordonatele bazelor în care sunt situați soldații, trebuie să găsiți cea mai sigură “reuniune de baze”. O reuniune de baze reprezintă mai multe baze cu proprietatea că din oricare se poate ajunge la oricare trecând numai prin alte baze. Trecerea dintr-o bază în alta se poate face în oricare din direcțiile sus, jos, stânga sau dreapta (nu și pe diagonală). Siguranța este reprezentată de numărul de baze incluse într-o reuniune. Considerăm că, în matrice, o bază se identifică prin cifra 1, iar absența bazei în acea poziție este dată de cifra 0.

Date de intrare

De la tastatură veți primi pe prima linie trei variabile b, m si n, reprezentând cheia de decriptare, numărul de linii ale terenului de război și numărul de coloane. Pe următoarea linie veți primi un șir de numere care se vor încheia cu -1. Pe următoarele linii veți primi câte două numere, x si y, cu semnificația de mai sus, iar pe ultima linie veți găsi perechea [-1, -1].

Date de iesire

În fișierul “codewar.out” veți afișa pe prima linie șirul de biți găsit în urma îndeplinirii TASK-ului 1, pe linia următoare toate numerele formate la TASK 2, iar pe ultima linie coordonatele celulei cea mai din sus-stanga din cea mai sigură reuniune și numărul de baze din care este alcatuită. Dacă sunt mai multe reuniuni cu același număr maxim de baze, se vor afișa toate, pe linii diferite. Formatul este următorul: SIR_DE_BITI SIR_DE_NUMERE LIN COL NR_BAZE LIN COL NR_BAZE …

Exemplu

Input

5 4 4
2 19 8 1 6 -1 
1 2
1 4
2 5
8 17
-1 4
5 19
2 3
-1 -1

Output

1 0 1 0 0 1 0 0 0 1 1 1 0 
1 4 9 14 4 14 2 
0 1 2

Explicații

În binar, șirul devine 10, 10011, 1000, 1, 110. Șirul nou format va fi 1 0 1 0 0 1 0 0 0 1 1 1 0, astfel:

  • luăm cei 2 biți ai numărului 2, deoarece nu ajung la limita lui b; (1 0)
  • din cei 5 biți ai numărului 19, îi putem lua doar pe primii 3, moment în care am atins numărul maxim de biți pe care îi putem reține deodată; (1 0 1 0 0)
  • ultimii doi biți ai numărului 19 sunt ignorați;
  • luăm cei 4 biți ai numărului 8, deoarece nu ajung la limita lui b; (1 0 1 0 0 1 0 0 0)
  • luăm singurul bit al numărului 1 și completăm un singur bit rămas până la limita de b biți; (1 0 1 0 0 1 0 0 0 1)
  • luăm toți biții numărului 6, deoarece nu ajung la limita lui b; (1 0 1 0 0 1 0 0 0 1 1 1 0)

Pozițiile în matrice sunt:

  • 1 (0 1)
  • 4 (0 1 0 0)
  • 9 (1 0 0 1)
  • 14 (0 1 1 1 0)
  • 20 % (4*4) = 4 (1 0 1 0 0)
  • 128 + 8 + 4 + 2 = 142 % (4*4) = 14 (1 0 0 0 1 1 1 0)
  • 2 (1 0)

Matricea va arăta astfel:

0 1 1 0 
1 0 0 0
0 1 0 0 
0 0 1 0

Cea mai sigură bază este dată de reuniunea celor două așezări de pe prima linie (linia 0), începând cu a doua coloana (coloana 1).

Precizări legate de implementarea temei

  • 1 < m, n < 400
  • 0 < b < 31
  • Tema se va implementa în limbajul C;
  • Fișierul de implementare a temei se va numi codewar.c;
  • Fișierele temei trebuie OBLIGATORIU împachetate într-o arhiva de tip '.zip', cu numele 'Grupa_NumePrenume_Tema2.zip'. Această arhivă va conține:
    • Codul sursă al programului vostru.
    • Un fişier Makefile care să conţină regulile build şi clean. Regula build va compila programul într-un executabil cu numele codewar. Regula clean va şterge executabilul şi eventual toate binarele intermediare (fişiere obiect) generate de voi.
    • Un fişier README care să conţină explicații privitoare la modul de rezolvare;
    • Arhiva temei NU va conține fișiere binare;
  • Arhiva va fi trimisă atât pe vmchecker cât și pe moodle.
  • O temă care nu compilează nu va fi punctată.
  • Deși programul vostru va trebui să citească direct de la tastatura și să afișeze pe ecran (folosind, de exemplu, scanf și printf), puteți sa citiți datele și să le scrieți în fișiere, folosind redirectările din consolă, fără sa modificați programul. Dacă fișierul de intrare este codewar.in și cel de ieșire este codewar.out, iar programul vostru se numește codewar, veți scrie în terminal:
./codewar < codewar.in > codewar.out

Testare

  • Arhiva de testare folosită pe vmchecker va fi următoarea: checker
  • checkerul și directoarele cu inputuri si outputuri vor fi dezarhivate în același director în care se află implementată tema, precum și fisierul Makefile

Copierea parţială sau totală a unei rezolvări din altă sursă va atrage după sine anularea punctajelor pentru toate temele de casă, atât pentru cel care a copiat, cât şi pentru sursa acestuia.

programare/teme_2015/tema2_2015_ca.1448064137.txt.gz · Last modified: 2015/11/21 02:02 by radu.stochitoiu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0