Deadline: 16 ianuarie 2026

Schelet de cod:text_editor.zip

Tema: Editor de Text

Scopul acestei teme este optimizarea backend-ului unui editor de text. În varianta inițială, stocarea textului într-un array continuu impunea mutarea tuturor caracterelor la fiecare inserare sau ștergere, rezultând o complexitate de O(N).

Pentru această temă, trebuie să implementați o structură de date care să permită operații de editare mult mai rapide (ideal O(log N)), evitând copierea masivă a datelor.

Ncurses

Remember laboratorul 1? Editorul este bazat pe ncurses – o bibliotecă lightweight care facilitează crearea de UIs în terminal. The Linux Documentation Project menține acest ghid, care poate servi atât ca introducere cât și ca referință rapidă pentru diverse funcții.

Deși puteți alege orice structură eficientă, recomandarea noastră este utilizarea unui Piece Table.

Funcții de implementat

Trebuie să implementați următoarele funcții care vor face legătura între interfața grafică și structura voastră de date:

1. create_table(filename, text, global_cursor) Această funcție inițializează structura de date.

2. advance_cursor(table, advance) Mută cursorul logic cu un număr de poziții specificat de parametrul advance. Acest parametru poate fi pozitiv (deplasare la dreapta) sau negativ (deplasare la stânga). Trebuie să vă asigurați că nu depășiți limitele textului (0 și lungimea totală).

3. show_global_cursor(table) Returnează poziția curentă absolută a cursorului (offset-ul față de începutul textului logic). Aceasta este necesară pentru a ști unde va avea loc următoarea operație de editare.

4. show_total_len(table) Returnează numărul total de caractere din textul gestionat de editor la momentul curent.

5. add_text(table, text) Inserează șirul de caractere text la poziția curentă a cursorului. Într-o implementare eficientă, textul nou este adăugat la finalul buffer-ului de adăugare, iar structura de date este actualizată pentru a include o nouă referință către acest text între bucățile existente.

6. delete_text(table, length) Șterge un număr de length caractere aflate înainte de cursor (comportament de tip Backspace). Operația nu trebuie să șteargă fizic datele din buffere, ci doar să ajusteze lungimile sau legăturile din structura de date care descrie textul.

7. extract_current_text(table) Reconstruiește întregul text într-un singur șir de caractere (string) și îl returnează. Această funcție este utilă pentru afișarea textului în interfața editorului.

8. save_current_text(table, filename, text, cursor) Salvează starea curentă a textului într-un fișier pe disc, specificat prin filename.

Instrucțiuni de rulare

 python3 checker.py

Checkerul va compila automat implementarea și va rula toate testele.

Punctaj

  • Testare funcționalitate: 65 puncte
  • Testare performanță: 35 puncte
  • Total: 100 puncte
Pentru a primi punctaj, implementarea ta trebuie să aibă complexitate eficientă pentru operațiile de inserare, ștergere și navigare.