Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
aa:lab:1 [2023/10/21 21:25] tpruteanu |
aa:lab:1 [2025/10/06 18:16] (current) dmihai |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Mașina Turing ====== | + | ====== Editor de text: introducere ====== |
| - | ==== Simulatoare de Mașini Turing ==== | + | Scopul acestui laborator este familiarizarea studenților cu editorul de texte pe care îl vom folosi pe parcursul semestrului pentru a ilustra în mod practic diversele concepte abordate. |
| - | Simulatoarele de Mașini Turing sunt unelte foarte utile pentru vizualizarea modului de lucru al unei mașini. Fiecare simulator vine cu propriul său format de input, deci citiți cu atenție specificația. | + | === Cod editor === |
| - | === turingmachinesimulator.com === | + | Descărcați scheletul de cod al editorului de text de [[https://github.com/cs-pub-ro/AA-CB-public/tree/master/text-editor|aici]]. |
| - | Un exemplu ușor de folosit este [[https://turingmachinesimulator.com/|acesta.]] O Mașina Turing scrisă în formatul dorit arată așa: | + | === Ncurses === |
| - | <code> | + | Editorul este bazat pe ''ncurses'' -- o bibliotecă lightweight care facilitează crearea de UIs în terminal. The Linux Documentation Project menține [[https://tldp.org/HOWTO/NCURSES-Programming-HOWTO/intro.html|acest ghid]], care poate servi atât ca introducere cât și ca referință rapidă pentru diverse funcții. |
| - | name: Binary increment | + | |
| - | init: start | + | |
| - | accept: H, Y | + | |
| - | //start: starea de început, se duce la finalul numărului | + | === Cerințe === |
| - | //find0: caută un 0 pentru a-l incrementa | + | |
| - | start,0 | + | 1. Rețineți textul sub forma unui array bidimensional; săgețile de la tastatură schimbă poziția cursorului în cadrul matricei. Alte taste (litere, cifre, simboluri speciale) înlocuiesc textul de sub cursor. |
| - | start,0,> | + | |
| - | start,1 | + | 2. Implementați două moduri diferite de folosire: "view" și "write", similare cu modurile "Normal" și "Insert" din ''vim''. Modul "view" e default; apăsarea tastei "i" trece în "write"; de acolo, apăsarea tastei "<Esc>" trece în "view" (alternativ, puteți folosi orice alt shortcut vreți). |
| - | start,1,> | + | |
| - | start,_ | + | 3. Adăugați un mod de a insera text fără suprascrie text (textul inserat "împinge spre dreapta" textul existent, în limita dimensiunii unui rând în matrice). |
| - | find0,_,< | + | |
| - | find0,0 | ||
| - | Y,1,- | ||
| - | find0,1 | ||
| - | find0,0,< | ||
| - | |||
| - | find0,_ | ||
| - | Y,1,- | ||
| - | |||
| - | </code> | ||
| - | |||
| - | Ștergeți tot textul care apare, înlocuiți-l cu descrierea mașinii și apăsați compile. Va apărea o căsuță de input în care puteți scrie cuvântul care va fi inițial pe bandă; apoi apăsați play. | ||
| - | |||
| - | === Tabela de tranziții === | ||
| - | |||
| - | O altă metodă de redactare ar fi sub forma de tabelă de tranziții folosind Excel, ulterior folosind [[https://drive.google.com/drive/folders/1EE_G1ovtsquG3Y6uWkldwHpZ2CqMa9u8?usp=sharing/|scriptul]] pentru a-l converti in formatul dorit. | ||
| - | **Exemplu:** [[https://docs.google.com/spreadsheets/d/1XjNYvHu2oyaTei41irkWRtI4Cppp_hvK/edit?usp=sharing&ouid=113096868136191520794&rtpof=true&sd=true/|Excel.]] | ||
| - | |||
| - | |||
| - | ===== Exerciții ===== | ||
| - | |||
| - | <note> | ||
| - | Exercițiile din cadrul acestui laborator vă cer să descrieți diverse Mașini Turing. | ||
| - | |||
| - | În toate exercițiile convenția este că la începutul rulării, pe bandă se află doar inputul (restul celulelor sunt goale), iar capul de citire e poziționat pe cel mai din stânga simbol. | ||
| - | |||
| - | Pentru exercițiile care menționează că inputul este un număr, acesta e fie numărul zero, fie începe cu o cifră diferită de 0. Cifrele numărului sunt scrise de la stânga la dreapta. | ||
| - | </note> | ||
| - | |||
| - | |||
| - | ==== Exerciții basic ==== | ||
| - | 1. Scrieți o Mașină Turing care primește un șir binar și verifică dacă începe și se termină cu simboluri **distincte**. | ||
| - | Ex: "100110110" -> False | ||
| - | |||
| - | 2. Scrieți o Mașină Turing care primește un șir binar și verifică dacă are lungime impară și simbolul din mijloc este 0. | ||
| - | Ex: "101100011" -> True | ||
| - | |||
| - | 3. Scrieți o Mașină Turing care primește un șir binar și lasă pe bandă complementul lui. | ||
| - | Ex: "000110111" -> "111001000" | ||
| - | |||
| - | 4. Scrieți o Mașină Turing care curăță toată banda (atât la stânga cât și la dreapta) și apoi lasă scris doar "1". | ||
| - | |||
| - | 5. Scrieți o Mașină Turing care inversează cuvântul primit pe bandă. | ||
| - | |||
| - | ==== Exerciții fun ==== | ||
| - | 6. Alex ascultă muzică doar dacă numărul melodiilor din playlist este putere a lui 2. Dându-se un șir de "M"-uri, verifică dacă Alex poate asculta acest playlist sau nu. | ||
| - | |||
| - | 7. Cățelul Max dorește sa-și facă tema la SDA, dar, din păcate, ca orice alt câine, acesta este color blind și, deci, nu vede dacă anumite paranteze sunt roși. Ajută-l pe Max să-și dea seama dacă parantezele din codul său sunt echilibrate. | ||
| - | Ex: ()((()())) -> True | ||
| - | ()((()())( -> False | ||
| - | |||
| - | 8. Diana are in frigider doar conserve de mazăre("M") și sticle de lapte("L"). Aceasta a mai cumpărat lapte de la magazin și vrea să așeze câte o sticlă de lapte după fiecare conservă de mazăre, mutând restul conținutului din frigider la dreapta. | ||
| - | Ex: "MML" -> "MLMLL" | ||
| - | |||
| - | 9. Johnny maimuța se afla la capătul unui șir format din banane("B") si mere("M"). Ajutați-l pe Johnny să numere bananele și, apoi, să fugă cu ele la capătul șirului. | ||
| - | Ex: "JBBMBMBMB" -> "BBMBMBMBJ101" | ||
| - | |||
| - | ==== Exerciții tryhard ==== | ||
| - | 10. Scrieți o Mașină Turing care primește două numere în baza 2, big-endian, separate de un # și lasă pe bandă suma lor. | ||
| - | Ex: "1011#11001" -> "100100" | ||
| - | | ||
| - | <note> | ||
| - | Soluțiile se pot gasi [[aa:lab:sol:1|aici]]. | ||
| - | </note> | ||