Differences

This shows you the differences between two versions of the page.

Link to this comparison view

programare:teme_2021:tema2_2021_cbd [2021/11/23 12:08]
eduard.scaueru
programare:teme_2021:tema2_2021_cbd [2022/01/03 22:18] (current)
vlad_matei.draghici [Trimitere temă]
Line 7: Line 7:
  
 Termen de predare: Termen de predare:
-  * Deadline soft: **18.12.2021** +  * Deadline soft: **10.01.2022** 
-  * Deadline hard: **18.12.2021**+  * Deadline hard: **10.01.2022**
  
 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.
  
 ====Întrebări==== ====Întrebări====
-Dacă aveți nelămuriri,​ puteți să ne contactați ​pe forumul dedicat [[https://​curs.upb.ro/​mod/​forum/​view.php?​id=87347|temei de casă nr. 2]] sau pe canalul Temei 2.\\+Dacă aveți nelămuriri,​ puteți să ne contactați pe canalul Temei 2.\\
 La orice întrebare vom răspunde în maxim 24 de ore.\\ La orice întrebare vom răspunde în maxim 24 de ore.\\
 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 19: Line 19:
 ====== Introducere ====== ====== Introducere ======
  
-Este seara de 28.11.2021. Ești la birou și aștepti cu nerăbdare Tema 2 de PCLP care trebuie sa apară din moment în moment. Cu gândul la pointeri și la string-uri adormi cu capul pe masă. Fără să îți dai seama, te trezești în fața intrării unui templu antic. Încrezător pașești în necunoscut în aventura visului ​tau.+Este seara de 28.11.2021. Ești la birou și aștepti cu nerăbdare Tema 2 de PCLP care trebuie sa apară din moment în moment. Cu gândul la pointeri și la string-uri adormi cu capul pe masă. Fără să îți dai seama, te trezești în fața intrării unui templu antic. Încrezător pașești în necunoscut în aventura visului ​tău.
  
 ====== Organizarea temei ====== ====== Organizarea temei ======
Line 27: Line 27:
 Urmăriți indicațiile din fișierele **Task1.c**,​ **Task2.c**,​ **Task3.c** și completați funcțiile notate cu **TODO**. În fișierele **Task1.c**,​ **Task2.c** și **Task3.c** se pot implementa și funcții adiționale și în fișierul **utils.h** se pot declara.</​note>​ Urmăriți indicațiile din fișierele **Task1.c**,​ **Task2.c**,​ **Task3.c** și completați funcțiile notate cu **TODO**. În fișierele **Task1.c**,​ **Task2.c** și **Task3.c** se pot implementa și funcții adiționale și în fișierul **utils.h** se pot declara.</​note>​
  
-===== Task 1 - Cuvinte magice (50p) =====+===== Task 1 - Cuvinte magice (40p) =====
  
 Cum intri în templul magic te trezești într-o cameră uriașă sub forma unei matrici de dimensiune N * M. O voce îți spune că te afli în templul lui magic și că pentru a trece la camera următoare trebuie să te miști prin cameră (prin matrice) după un traseu bine stabilit. Pentru a face lucrurile mai interesante,​ vocea îți spune că traseul necesar trebuie decodificat de către tine apoi îți spune un cod magic. Cum intri în templul magic te trezești într-o cameră uriașă sub forma unei matrici de dimensiune N * M. O voce îți spune că te afli în templul lui magic și că pentru a trece la camera următoare trebuie să te miști prin cameră (prin matrice) după un traseu bine stabilit. Pentru a face lucrurile mai interesante,​ vocea îți spune că traseul necesar trebuie decodificat de către tine apoi îți spune un cod magic.
Line 36: Line 36:
  
 Cuvintele sunt de 3 tipuri: Cuvintele sunt de 3 tipuri:
-  - Cuvintele care încep cu litera ‘a’ sunt de forma “ax1x2x3x4” unde xi sunt cifre (1<= i <= 4). Fiecare cifră este corespunzatoare unei direcții de mișcare (x1 – dreapta , x2 – sus, x3 – stânga, x4 - jos în matrice). Cifra maximă dictează mișcarea din traseu corespunzătoare. Ex: Codul “a1235” are cifra maximă (5) pe poziția lui x4, deci următoarea mișcare din traseu este în jos. 
  
-  ​- Cuvintele care încep cu litera ‘b’ sunt de forma “bx1x2…xn” unde xi sunt cifre (1<= i <= n). Considerăm numărul format din cifrele “x1x2…xn” ca un număr K. Fie X numărul format din ultimele 2 cifre ale lui K (xn-1xn). În funcție de proprietățile de palindrom și prim ale lui K respectiv X avem următoarele 4 situații:+**1.** Cuvintele care încep cu litera ‘a’ sunt de forma “ax1x2x3x4” unde xi sunt cifre (1<= i <= 4). Fiecare cifră este corespunzătoare unei direcții de mișcare (x1 – dreapta , x2 – sus, x3 – stânga, x4 jos în matrice). Cifra maximă dictează mișcarea din traseu corespunzătoare. 
 + 
 +Ex: Codul “a1235” are cifra maximă (5) pe poziția lui x4, deci următoarea mișcare din traseu este în jos. 
 + 
 +**2.** ​Cuvintele care încep cu litera ‘b’ sunt de forma “bx1x2…xn” unde xi sunt cifre (1<= i <= n). Considerăm numărul format din cifrele “x1x2…xn” ca un număr K. Fie X numărul format din ultimele 2 cifre ale lui K (xn-1xn). În funcție de proprietățile de palindrom și prim ale lui Krespectiv X avem următoarele 4 situații:
      - K palindrom, X prim: stânga      - K palindrom, X prim: stânga
      - K palindrom, X NU este prim: dreapta      - K palindrom, X NU este prim: dreapta
Line 45: Line 48:
 Ex: Codul “b121” are K = 121 și X = 21. K este palindrom și X nu este prim => următoarea mișcare din traseu este în dreapta. Ex: Codul “b121” are K = 121 și X = 21. K este palindrom și X nu este prim => următoarea mișcare din traseu este în dreapta.
  
-  - Cuvinte care încep cu litera ‘c’ sunt de forma “cnkx1x2…xn” unde n, k, xi sunt cifre. Fie S suma primelor k cifre luate din k în k în mod circular. S = x0 + xk + x2k + … (dacă indicele trece peste n atunci se resetează la 0). În funcție de restul împărțirii lui S la 4 avem următoare situații:+**3.** ​Cuvinte care încep cu litera ‘c’ sunt de forma “cnkx1x2…xn”unde n, k, xi sunt cifre. Fie S suma primelor k cifre luate din k în k în mod circular. S = x0 + xk + x2k + … (dacă indicele trece peste n atunci se resetează la 0). În funcție de restul împărțirii lui S la 4 avem următoarele ​situații:
      - S % 4 = 0 => stânga      - S % 4 = 0 => stânga
      - S % 4 = 1 => sus      - S % 4 = 1 => sus
      - S % 4 = 2 => dreapta      - S % 4 = 2 => dreapta
      - S % 4 = 3 => jos      - S % 4 = 3 => jos
-Ex: Codul “c64123456” are n = 6 (6 cifre), k = 4 și cifrele 123456. Suma dorită este: S = x0 + x4 + x8 % 6 + x12 % 6 = 1 + = 10+Ex: Codul “c64123456” are n = 6 (6 cifre), k = 4 și cifrele 123456. Suma dorită este: S = x0 + x4 + x8 % 6 + x12 % 6 = 1 + = 10
 Restul împărțirii este: S % 4 = 10 % 4 = 2 => următoarea mișcare din traseu este în dreapta. Restul împărțirii este: S % 4 = 10 % 4 = 2 => următoarea mișcare din traseu este în dreapta.
 +
 +== Task 1.1 - Cuvinte magice tipul '​a'​ (8p) ==
 +
 +Sa se determine traseul corect pentru cuvinte doar de tipul '​a'​.
 +
 +== Task 1.2 - Cuvinte magice tipul '​b'​ (8p) ==
 +
 +Sa se determine traseul corect pentru cuvinte doar de tipul '​b'​.
 +
 +== Task 1.3 - Cuvinte magice tipul '​c'​ (8p) ==
 +
 +Sa se determine traseul corect pentru cuvinte doar de tipul '​c'​.
 +
 +== Task 1.4 - Cuvinte magice de orice tip (16p) ==
 +
 +Sa se determine traseul corect pentru orice tip de cuvinte.
  
 **//​Input//​** **//​Input//​**
Line 161: Line 180:
  
 <note warning> <note warning>
-Numerele vor fi **obligatoriu** stocate sub forma de șiruri de caractere. Nu se vor acorda cele 20 de puncte ​daca numerele sunt convertite în tipuri numerice.+Numerele vor fi **obligatoriu** stocate sub forma de șiruri de caractere. Nu se vor acorda cele 20 de puncte ​dacă numerele sunt citite/convertite ​cu totul în tipuri numerice ​(int, long long, etc.), pentru a efectua simpla adunare a acestora
 </​note>​ </​note>​
  
Line 172: Line 191:
 ===== Task 3 - Ajutorul (50p) ===== ===== Task 3 - Ajutorul (50p) =====
  
-Fiindcă ai reușit să descifrezi și să rezolvi provocările anterioare, vocea decide să îți ceară ajutorul în finalizarea unui algoritm de prezicere a cuvintelor. Vocea iti spune ca deja cunoaste frecventele ​cuvintelor ​intr-un text, dar are nevoie de tine pentru calcularea numărului de apariții a 2-gramelor, în ordinea apariției lor. O [[https://​en.wikipedia.org/​wiki/​N-gram | n-gramă]] ​reprezinta ​un grup de n elemente (cuvinte, silabe, litere, etc.) consecutive dintr-un text. Pentru acest task vom trata n-gramele ​că fiind grupuri de n cuvinte consecutive. Un cuvânt este separat de spatii ​sau newline, iar punctuația precum ',',​ '​.',​ '​!',​ ';'​ este ignorata. De asemenea, input-ul este case sensitive și nu este nevoie de a tranforma literele mari în mici.+Fiindcă ai reușit să descifrezi și să rezolvi provocările anterioare, vocea decide să îți ceară ajutorul în finalizarea unui algoritm de prezicere a cuvintelor. Vocea îți spune ca deja cunoaște frecvențele ​cuvintelor ​într-un text, dar are nevoie de tine pentru calcularea numărului de apariții a 2-gramelor, în ordinea apariției lor. O [[https://​en.wikipedia.org/​wiki/​N-gram | n-gramă]] ​reprezintă ​un grup de n elemente (cuvinte, silabe, litere, etc.) consecutive dintr-un text. Pentru acest task vom trata n-gramele ​ca fiind grupuri de n cuvinte consecutive. Un cuvânt este separat de spații ​sau newline, iar punctuația precum ',',​ '​.',​ '​!',​ ';'​ este ignorată. De asemenea, input-ul este case sensitive și nu este nevoie de a tranforma literele mari în mici.
  
 Astfel, un exemplu ar consta în următorul sample test: Astfel, un exemplu ar consta în următorul sample test:
Line 196: Line 215:
  
 <note important> ​ <note important> ​
-Va puteti ​folosi de output-ul generat de voi, pentru a completa automat o propozitie incompleta. Pentru a face acest lucru, ​puteti ​folosi sursa predict_words.c,​ care primește o propoziție ​incompleta ​(bazata ​pe input-ul din testul pe care rulati ​acest program, pentru a avea o acuratețe mai buna) și numărul de cuvinte pe care le va prezice (maxim 3). +Vă puteți ​folosi de output-ul generat de voi, pentru a completa automat o propoziție incompletă. Pentru a face acest lucru, ​puteți ​folosi sursa predict_words.c,​ care primește o propoziție ​incompletă ​(bazată ​pe input-ul din testul pe care rulați ​acest program, pentru a avea o acuratețe mai bună) și numărul de cuvinte pe care le va prezice (maxim 3). 
  
 Exemplu de rulare: Exemplu de rulare:
  
 <​code>​ <​code>​
-./predict <cale_fisier_out_generat> <cale_fisier_word_frequencies> “propozitie[spatiu]” <numar_cuvinte>+./predict <cale_fișier_out_generat> <cale_fișier_word_frequencies> “propoziție[spațiu]” <număr_cuvinte>
  
 ./predict output/​Task3/​output0.txt word_freq/​words_freq_0 “Biofuel is used to ” 2 ./predict output/​Task3/​output0.txt word_freq/​words_freq_0 “Biofuel is used to ” 2
Line 208: Line 227:
 </​note>​ </​note>​
  
-Acest task este o introducere foarte ​simplista ​în utilizarea n-gramelor în [[https://​www.ibm.com/​cloud/​learn/​natural-language-processing | NLP]].+Acest task este o introducere foarte ​simplistă ​în utilizarea n-gramelor în [[https://​www.ibm.com/​cloud/​learn/​natural-language-processing | NLP]]
 + 
 +<note warning>​ 
 +Folosirea oricăror structuri de date în afara șirurilor de caractere și vectori va duce la depunctarea totală a cerinței. 
 +</​note>​ 
 + 
 +După ce ai rezolvat și ultima provocare vocea stranie te felicită și îți spune că acum ești pregatit de Tema 2 la PCLP. La auzul acestor cuvinte te trezești. "A fost doar un vis", îți spui și vezi că tocmai s-a postat Tema 2
  
 ==== Trimitere temă ==== ==== Trimitere temă ====
Line 223: Line 248:
 <note warning> <note warning>
   - Arhiva trebuie să fie de tipul **zip**.   - Arhiva trebuie să fie de tipul **zip**.
-  - Makefile-ul și testele vor fi cele din aceasta arhiva: {{:​programare:​teme_2021:​tema2_skel.zip|}}+  - Makefile-ul și testele vor fi cele din aceasta arhiva: {{:​programare:​teme_2021:​templu_skel.zip|}}
 </​note>​ </​note>​
  
programare/teme_2021/tema2_2021_cbd.1637662084.txt.gz · Last modified: 2021/11/23 12:08 by eduard.scaueru
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