Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
aa:lab:1 [2023/10/13 12:58]
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.
-nameBinary increment +
-init: start +
-accept: HY+
  
-//start: starea de început, se duce la finalul numărului +=== Cerințe ===
-//find0: caută un 0 pentru a-l incrementa+
  
-start,+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 (literecifresimboluri speciale) înlocuiesc textul de sub cursor.
-start,0,>+
  
-start,+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 acoloapă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 
- 
-/* 
-<​hidden>​ 
-Soluție [[https://​docs.google.com/​spreadsheets/​d/​1U-T08UyTtM58RZ2j2aY05HFWKENFPPL1/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true/​|Excel.]] 
-<​code>​ 
-name: ex1 
-init: start 
-accept: H, Y 
- 
-//starea de start este bineînțeles "​start"​ 
-//folosind stările "​expect0"​ si "​expect1",​ practic "​ținem in memorie"​ primul număr din șir 
-//stările "​found0?"​ si "​found1?"​ verifică dacă ultima cifră este aceeași cu prima. 
- 
-start,0 
-expect0,​0,>​ 
- 
-start,1 
-expect1,​1,>​ 
- 
-start,_ 
-N,_,- 
- 
-expect0,0 
-expect0,​0,>​ 
- 
-expect0,1 
-expect0,​1,>​ 
- 
-expect0,_ 
-found0?,​_,<​ 
- 
-found0?,0 
-Y,0,- 
- 
-found0?,1 
-N,1,- 
- 
-found0?,_ 
-N,_,- 
- 
-expect1,0 
-expect1,​0,>​ 
- 
-expect1,1 
-expect1,​1,>​ 
- 
-expect1,_ 
-found1?,​_,<​ 
- 
-found1?,0 
-N,0,- 
- 
-found1?,1 
-Y,1,- 
- 
-found1?,_ 
-N,_,- 
- 
-</​code>​ 
-</​hidden>​ 
- 
- 
-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 
- 
-/* 
-<​hidden>​ 
-Soluție [[https://​docs.google.com/​spreadsheets/​d/​10P5eq41BncWpAgPVf5O_xeRHGzNYmjyF/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]] 
-<​code>​ 
-name: ex2 
-init: start 
-accept: H, Y 
- 
-//​Strategie:​ ștergem prima cifra, mergem până la final, ștergem a doua cifră 
-//Stările de tipul "​FindLastX",​ șterg prima cifră, si merg până dau de "​_"​. 
-//Stările de tipul "​EraseLastX",​ șterg ultima cifră, apoi dau reset. 
-//Dacă o stare de tipul "​EraseLastX"​ descoperă tot _, înseamnă ca starea "​FindLastX"​ a șters ultima cifră. 
-//Deci șirul are un număr impar de cifre. iar, in funcție de valoarea lui X vedem dacă se află un 0 sau un 1 la mijloc. 
- 
-start,0 
-FindLast0,​_,>​ 
- 
-start,1 
-FindLast1,​_,>​ 
- 
-start,_ 
-N,_,- 
- 
-FindLast0,0 
-FindLast0,​0,>​ 
- 
-FindLast0,1 
-FindLast0,​1,>​ 
- 
-FindLast0,_ 
-EraseLast0,​_,<​ 
- 
-EraseLast0,​0 
-Reset,​_,<​ 
- 
-EraseLast0,​1 
-Reset,​_,<​ 
- 
-EraseLast0,​_ 
-Y,_,- 
- 
-FindLast1,0 
-FindLast1,​0,>​ 
- 
-FindLast1,1 
-FindLast1,​1,>​ 
- 
-FindLast1,_ 
-EraseLast1,​_,<​ 
- 
-EraseLast1,​0 
-Reset,​_,<​ 
- 
-EraseLast1,​1 
-Reset,​_,<​ 
- 
-EraseLast1,​_ 
-N,_,- 
- 
-Reset,0 
-Reset,​0,<​ 
- 
-Reset,1 
-Reset,​1,<​ 
- 
-Reset,_ 
-start,​_,>​ 
- 
- 
- 
-</​code>​ 
-</​hidden>​ 
-*/ 
- 
-3. Scrieți o Mașină Turing care primește un șir binar și lasă pe bandă complementul lui. 
-   Ex: "​000110111"​ -> "​111001000"​ 
- 
-/* 
-<​hidden>​ 
-Soluție [[https://​docs.google.com/​spreadsheets/​d/​1oLU7_5MJ3YAVLeXSjCShGKFjYSWi4HBk/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]] 
-<​code>​ 
-name: ex3 
-init: start 
-accept: H, Y 
- 
-//parcurgem șirul, înlocuind 0 cu 1 si 1 cu 0. Trivial nu-i așa? (: 
-start,0 
-start,​1,>​ 
- 
-start,1 
-start,​0,>​ 
- 
-start,_ 
-H,_,- 
- 
- 
- 
-</​code>​ 
-</​hidden>​ 
-*/ 
- 
-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"​. 
- 
-/* 
-<​hidden>​ 
-Soluție [[https://​docs.google.com/​spreadsheets/​d/​1sMjIBxlEJVgZsG2WHKzMb80MCdWQNBY3/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]] 
-<​code>​ 
-name: ex4 
-init: cleanRight 
-accept: H, Y 
- 
-//​Strategie:​ ștergem la stânga până dăm de "​_",​ apoi ne întoarcem până dăm de 0 sau 1. 
-//După ștergem la dreapta până dam de "​_"​ si atunci scriem "​1"​. 
- 
-cleanRight,​0 
-cleanRight,​_,<​ 
- 
-cleanRight,​1 
-cleanRight,​_,<​ 
- 
-cleanRight,​_ 
-Reset,​_,>​ 
- 
-Reset,0 
-cleanLeft,​_,>​ 
- 
-Reset,1 
-cleanLeft,​_,>​ 
- 
-Reset,_ 
-Reset,​_,>​ 
- 
-cleanLeft,0 
-cleanLeft,​_,>​ 
- 
-cleanLeft,1 
-cleanLeft,​_,>​ 
- 
-cleanLeft,_ 
-Y,1,- 
- 
- 
-</​code>​ 
-</​hidden>​ 
-*/ 
- 
-5. Scrieți o Mașină Turing care inversează cuvântul primit pe bandă. 
- 
-/* 
-<​hidden>​ 
-Soluție [[https://​docs.google.com/​spreadsheets/​d/​1lc2s-U7TZV814FoH3f6G2xH_gIV1QlVg/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]] 
-<​code>​ 
-name: ex5 
-init: addXatEnd 
-accept: H, Y 
- 
-//​Strategie:​ Primul pas adăugăm un X la final. 
-//Pasul 2: Ne uităm la ultima cifră ce nu e X, o înlocuim cu un X, o adăugăm la capătul șirului nou format. 
-//La final ștergem toți X. 
- 
-addXatEnd,0 
-addXatEnd,​0,>​ 
- 
-addXatEnd,1 
-addXatEnd,​1,>​ 
- 
-addXatEnd,_ 
-readFirstX,​X,<​ 
- 
-addXatEnd,X 
-N,X,- 
- 
-readLastX,0 
-readLastX,​0,<​ 
- 
-readLastX,1 
-readLastX,​1,<​ 
- 
-readLastX,_ 
-stergeX,​_,>​ 
- 
-readLastX,X 
-readFirstX,​X,<​ 
- 
-readFirstX,​0 
-keep0,​X,>​ 
- 
-readFirstX,​1 
-keep1,​X,>​ 
- 
-readFirstX,​_ 
-stergeX,​_,>​ 
- 
-readFirstX,​X 
-readFirstX,​X,<​ 
- 
-keep0,0 
-keep0,​0,>​ 
- 
-keep0,1 
-keep0,​1,>​ 
- 
-keep0,_ 
-readLastX,​0,<​ 
- 
-keep0,X 
-keep0,​X,>​ 
- 
-keep1,0 
-keep1,​0,>​ 
- 
-keep1,1 
-keep1,​1,>​ 
- 
-keep1,_ 
-readLastX,​1,<​ 
- 
-keep1,X 
-keep1,​X,>​ 
- 
-stergeX,0 
-stergeX,​0,<​ 
- 
-stergeX,1 
-stergeX,​1,<​ 
- 
-stergeX,_ 
-Y,_,- 
- 
-stergeX,X 
-stergeX,​_,>​ 
- 
-name: machine 
-init: addXatEnd 
-accept: H, Y 
- 
-addXatEnd,0 
-addXatEnd,​0,>​ 
- 
-addXatEnd,1 
-addXatEnd,​1,>​ 
- 
-addXatEnd,_ 
-readFirstX,​X,<​ 
- 
-addXatEnd,X 
-N,X,- 
- 
-readLastX,0 
-readLastX,​0,<​ 
- 
-readLastX,1 
-readLastX,​1,<​ 
- 
-readLastX,_ 
-stergeX,​_,>​ 
- 
-readLastX,X 
-readFirstX,​X,<​ 
- 
-readFirstX,​0 
-keep0,​X,>​ 
- 
-readFirstX,​1 
-keep1,​X,>​ 
- 
-readFirstX,​_ 
-stergeX,​_,>​ 
- 
-readFirstX,​X 
-readFirstX,​X,<​ 
- 
-keep0,0 
-keep0,​0,>​ 
- 
-keep0,1 
-keep0,​1,>​ 
- 
-keep0,_ 
-readLastX,​0,<​ 
- 
-keep0,X 
-keep0,​X,>​ 
- 
-keep1,0 
-keep1,​0,>​ 
- 
-keep1,1 
-keep1,​1,>​ 
- 
-keep1,_ 
-readLastX,​1,<​ 
- 
-keep1,X 
-keep1,​X,>​ 
- 
-stergeX,0 
-stergeX,​0,<​ 
- 
-stergeX,1 
-stergeX,​1,<​ 
- 
-stergeX,_ 
-Y,_,- 
- 
-stergeX,X 
-stergeX,​_,>​ 
- 
- 
-</​code>​ 
-</​hidden>​ 
-*/ 
- 
- 
-==== 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. 
- 
-/* 
-<​hidden>​ 
-Soluție [[https://​docs.google.com/​spreadsheets/​d/​1NX6EwAsnc7RTa3brV8h5soj2x6Myfto1/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]] 
-<​code>​ 
-name: ex6 
-init: start 
-accept: H, Y 
- 
-//​Strategie:​ Pentru fiecare doua caractere de "​M",​ adăugăm un caracter de "​A"​ la final. 
-//Apoi, pentru fiecare doua caractere de "​A",​ adăugăm un M, and so on, pana rămânem cu doar 2 caractere pe banda. 
- 
-start,M 
-findOneMoreM,​_,>​ 
- 
-start,_ 
-N,_,- 
- 
-start,A 
-findOneMoreA,​_,>​ 
- 
-findOneMoreM,​M 
-checkIfEmptyM,​_,>​ 
- 
-findOneMoreM,​_ 
-N,_,- 
- 
-findOneMoreM,​A 
-N,_,- 
- 
-AddAnA,M 
-AddAnA,​M,>​ 
- 
-AddAnA,_ 
-reset,​A,<​ 
- 
-AddAnA,A 
-AddAnA,​A,>​ 
- 
-reset,M 
-reset,​M,<​ 
- 
-reset,_ 
-start,​_,>​ 
- 
-reset,A 
-reset,​A,<​ 
- 
-findOneMoreA,​M 
-N,_,- 
- 
-findOneMoreA,​_ 
-N,_,- 
- 
-findOneMoreA,​A 
-checkIfEmptyA,​_,>​ 
- 
-AddAnM,M 
-AddAnM,​M,>​ 
- 
-AddAnM,_ 
-reset,​M,<​ 
- 
-AddAnM,A 
-AddAnM,​A,>​ 
- 
-checkIfEmptyM,​M 
-AddAnA,​M,>​ 
- 
-checkIfEmptyM,​_ 
-Y,_,- 
- 
-checkIfEmptyM,​A 
-AddAnA,​A,>​ 
- 
-checkIfEmptyA,​M 
-AddAnM,​M,>​ 
- 
-checkIfEmptyA,​_ 
-Y,_,- 
- 
-checkIfEmptyA,​A 
-AddAnM,​A,>​ 
- 
- 
-</​code>​ 
-</​hidden>​ 
-*/ 
- 
-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 
- 
-/* 
-<​hidden>​ 
-Soluție [[https://​docs.google.com/​spreadsheets/​d/​17aCsQi6oEl5s9r9azQ4W972yh0Ur-rY3/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]] 
-<​code>​ 
-name: ex7 
-init: start 
-accept: H, Y 
- 
-//​Strategie:​ căutăm ultima paranteza deschisa "​(",​ îi căutăm pereche și le marcăm pe ambele cu X 
-//Daca la final rămân doar X-uri pe banda înseamnă ca șirul este echilibrat. 
- 
-start,( 
-start,​(,>​ 
- 
-start,) 
-start,​),>​ 
- 
-start,X 
-N,X,- 
- 
-start,_ 
-FindLast(,​_,<​ 
- 
-FindLast(,( 
-FindPereche,​X,>​ 
- 
-FindLast(,) 
-FindLast(,​),<​ 
- 
-FindLast(,X 
-FindLast(,​X,<​ 
- 
-FindLast(,_ 
-clearX,​_,>​ 
- 
-FindPereche,​( 
-N,(,- 
- 
-FindPereche,​) 
-FindLast(,​X,<​ 
- 
-FindPereche,​X 
-FindPereche,​X,>​ 
- 
-FindPereche,​_ 
-N,_,- 
- 
-clearX,( 
-N,(,- 
- 
-clearX,) 
-N,),- 
- 
-clearX,X 
-clearX,​_,>​ 
- 
-clearX,_ 
-Y,_,- 
- 
- 
-</​code>​ 
-</​hidden>​ 
-*/ 
- 
-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"​ 
- 
-/* 
-<​hidden>​ 
-Soluție [[https://​docs.google.com/​spreadsheets/​d/​1cSAH-z8hmqGZ49-u4dzlld4wh883fu0u/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]] 
-<​code>​ 
-name: ex8 
-init: start 
-accept: H, Y 
- 
-//​Strategie:​ Parcurgem șirul, când găsim un M, schimbăm simbolul din dreapta cu X, mutând toate caracterele o poziție la dreapta, 
-//ținem minte fiecare caracter abia schimbat cu ajutorul stărilor, 
-//apoi ne întoarcem, înlocuim X cu L si căutăm următorul M. 
- 
-start,M 
-startShift,​M,>​ 
- 
-start,L 
-start,​L,>​ 
- 
-start,X 
-N,X,- 
- 
-start,_ 
-Y,_,- 
- 
-startShift,​M 
-keepM,​X,>​ 
- 
-startShift,​L 
-keepL,​X,>​ 
- 
-startShift,​X 
-N,X,- 
- 
-startShift,​_ 
-Y,L,- 
- 
-keepM,M 
-keepM,​M,>​ 
- 
-keepM,L 
-keepL,​M,>​ 
- 
-keepM,X 
-N,X,- 
- 
-keepM,_ 
-reset,​M,<​ 
- 
-keepL,M 
-keepM,​L,>​ 
- 
-keepL,L 
-keepL,​L,>​ 
- 
-keepL,X 
-N,X,- 
- 
-keepL,_ 
-reset,​L,<​ 
- 
-reset,M 
-reset,​M,<​ 
- 
-reset,L 
-reset,​L,<​ 
- 
-reset,X 
-start,​L,>​ 
- 
-reset,_ 
-Y,_,- 
- 
- 
-</​code>​ 
-</​hidden>​ 
-*/ 
- 
-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"​ 
- 
-/* 
-<​hidden>​ 
-Soluție [[https://​docs.google.com/​spreadsheets/​d/​14EUgDigN133zj3xH9Lh_9T7dKuPr1Llh/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]] 
-<​code>​ 
-name: ex9 
-init: start 
-accept: H, Y 
- 
-//​Strategie:​ Primul pas, Johnny retine numărul 0, adică adăugăm un 0 la stânga lui J. 
-//După parcurgem șirul căutând banane. Când am găsit o banană mergem la stânga lui Johnny și facem un binary increment, exact ca în //exemplul introductiv. 
-//La final îl mutam pe Johnny și pe numărul din mintea sa la dreapta șirului. 
- 
-start,0 
-add0,0,< 
- 
-start,1 
-add0,1,< 
- 
-start,_ 
-Y,0,- 
- 
-start,J 
-add0,J,< 
- 
-start,X 
-N,_,- 
- 
-start,B 
-add0,B,< 
- 
-start,M 
-add0,M,< 
- 
-findB,0 
-findB,​0,>​ 
- 
-findB,1 
-findB,​1,>​ 
- 
-findB,_ 
-moveNrLast,​J,<​ 
- 
-findB,J 
-findB,​J,>​ 
- 
-findB,X 
-findB,​X,>​ 
- 
-findB,B 
-goBI,X,< 
- 
-findB,M 
-findB,​M,>​ 
- 
-goBI,0 
-goBI,0,< 
- 
-goBI,1 
-goBI,1,< 
- 
-goBI,_ 
-N,_,- 
- 
-goBI,J 
-doBI,J,< 
- 
-goBI,X 
-goBI,X,< 
- 
-goBI,B 
-goBI,B,< 
- 
-goBI,M 
-goBI,M,< 
- 
-add0,0 
-N,_,- 
- 
-add0,1 
-N,_,- 
- 
-add0,_ 
-findB,​0,>​ 
- 
-add0,J 
-N,_,- 
- 
-add0,X 
-N,_,- 
- 
-add0,B 
-N,_,- 
- 
-add0,M 
-N,_,- 
- 
-doBI,0 
-gotoJ,​1,>​ 
- 
-doBI,1 
-doBI,0,< 
- 
-doBI,_ 
-gotoJ,​1,>​ 
- 
-doBI,J 
-N,_,- 
- 
-doBI,X 
-N,_,- 
- 
-doBI,B 
-N,_,- 
- 
-doBI,M 
-N,_,- 
- 
-gotoJ,0 
-gotoJ,​0,>​ 
- 
-gotoJ,1 
-gotoJ,​1,>​ 
- 
-gotoJ,_ 
-N,_,- 
- 
-gotoJ,J 
-findB,​J,>​ 
- 
-gotoJ,X 
-gotoJ,​X,>​ 
- 
-gotoJ,B 
-N,_,- 
- 
-gotoJ,M 
-N,_,- 
- 
-moveNrLast,​0 
-moveNrLast,​0,<​ 
- 
-moveNrLast,​1 
-moveNrLast,​1,<​ 
- 
-moveNrLast,​_ 
-goBack,​_,>​ 
- 
-moveNrLast,​J 
-moveNrLast,​J,<​ 
- 
-moveNrLast,​X 
-moveNrLast,​B,<​ 
- 
-moveNrLast,​B 
-moveNrLast,​B,<​ 
- 
-moveNrLast,​M 
-moveNrLast,​M,<​ 
- 
-goBack,0 
-keep0,​_,>​ 
- 
-goBack,1 
-keep1,​_,>​ 
- 
-goBack,_ 
-N,_,- 
- 
-goBack,J 
-Y,_,- 
- 
-goBack,X 
-N,_,- 
- 
-goBack,B 
-N,_,- 
- 
-goBack,M 
-N,_,- 
- 
-keep0,0 
-keep0,​0,>​ 
- 
-keep0,1 
-keep0,​1,>​ 
- 
-keep0,_ 
-N,_,- 
- 
-keep0,J 
-keep02,​J,>​ 
- 
-keep0,X 
-N,_,- 
- 
-keep0,B 
-keep0,​B,>​ 
- 
-keep0,M 
-keep0,​M,>​ 
- 
-keep1,0 
-keep1,​0,>​ 
- 
-keep1,1 
-keep1,​1,>​ 
- 
-keep1,_ 
-N,_,- 
- 
-keep1,J 
-keep12,​J,>​ 
- 
-keep1,X 
-N,_,- 
- 
-keep1,B 
-keep1,​B,>​ 
- 
-keep1,M 
-keep1,​M,>​ 
- 
-put0,0 
-put0,0,> 
- 
-put0,1 
-put0,1,> 
- 
-put0,_ 
-moveNrLast,​0,<​ 
- 
-put0,J 
-N,_,- 
- 
-put0,X 
-N,_,- 
- 
-put0,B 
-put0,B,> 
- 
-put0,M 
-put0,M,> 
- 
-put1,0 
-put1,0,> 
- 
-put1,1 
-put1,1,> 
- 
-put1,_ 
-moveNrLast,​1,<​ 
- 
-put1,J 
-N,_,- 
- 
-put1,X 
-N,_,- 
- 
-put1,B 
-put1,B,> 
- 
-put1,M 
-put1,M,> 
- 
-keep02,0 
-keep02,​0,>​ 
- 
-keep02,1 
-keep02,​1,>​ 
- 
-keep02,_ 
-N,_,- 
- 
-keep02,J 
-put0,J,> 
- 
-keep02,X 
-N,_,- 
- 
-keep02,B 
-keep02,​B,>​ 
- 
-keep02,M 
-keep02,​M,>​ 
- 
-keep12,0 
-keep12,​0,>​ 
- 
-keep12,1 
-keep12,​1,>​ 
- 
-keep12,_ 
-N,_,- 
- 
-keep12,J 
-put1,J,> 
- 
-keep12,X 
-N,_,- 
- 
-keep12,B 
-keep12,​B,>​ 
- 
-keep12,M 
-keep12,​M,>​ 
- 
- 
-</​code>​ 
-</​hidden>​ 
-*/ 
- 
-==== 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"​ 
- 
-/* 
-<​hidden>​ 
-Soluție [[https://​docs.google.com/​spreadsheets/​d/​1ba-I4AgH9O7bdXox1zX_p26Ymb_-D85N/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]] 
-<​code>​ 
- 
-name: ex10 
-init: q1 
-accept: halt 
- 
-// q1 parcurge primul numar 
-// pana la separatorul dintre numere 
-q1,0 
-q1,0,> 
- 
-q1,1 
-q1,1,> 
- 
-q1,# 
-get_adding_number,#,<​ 
- 
-// get_adding_number ia urmatorul digit din primul numar 
-// pentru a-l adauga la al doilea numar, si il inlocuieste cu 
-// un X (care inseamna ca am folosit digit-ul) 
-get_adding_number,​0 
-go_second_0,​X,>​ 
- 
-get_adding_number,​1 
-go_second_1,​X,>​ 
- 
-get_adding_number,​X 
-get_adding_number,​X,<​ 
- 
-get_adding_number,​_ 
-finish,​_,>​ 
- 
-// go_second_0 si go_second_1 parcurge pana la al doilea numar 
-// retinand cat trebuie adaugat 
-go_second_0,#​ 
-go_to_place_0,#,>​ 
- 
-go_second_0,​X 
-go_second_0,​X,>​ 
- 
-go_second_1,#​ 
-go_to_place_1,#,>​ 
- 
-go_second_1,​X 
-go_second_1,​X,>​ 
- 
-// go_to_place_0 si go_to_place_1 parcurg al doilea numar pana 
-// unde am ajuns cu adunarea (cifrele deja parcurse au fost 
-// inlocuite cu a si b in loc de 0 si 1) 
-go_to_place_0,​0 
-go_to_place_0,​0,>​ 
- 
-go_to_place_0,​1 
-go_to_place_0,​1,>​ 
- 
-go_to_place_0,​a 
-add_0,​a,<​ 
- 
-go_to_place_0,​b 
-add_0,​b,<​ 
- 
-go_to_place_0,​_ 
-add_0,​_,<​ 
- 
-go_to_place_1,​0 
-go_to_place_1,​0,>​ 
- 
-go_to_place_1,​1 
-go_to_place_1,​1,>​ 
- 
-go_to_place_1,​a 
-add_1,​a,<​ 
- 
-go_to_place_1,​b 
-add_1,​b,<​ 
- 
-go_to_place_1,​_ 
-add_1,​_,<​ 
- 
-// go_first_number se intoarce spre dreapta la primul numar 
-go_first_number,​0 
-go_first_number,​0,<​ 
- 
-go_first_number,​1 
-go_first_number,​1,<​ 
- 
-go_first_number,​a 
-go_first_number,​a,<​ 
- 
-go_first_number,​b 
-go_first_number,​b,<​ 
- 
-go_first_number,#​ 
-get_adding_number,#,<​ 
- 
-// adaugam 0 la numarul curent si inlocuim numarul cu a/b pt 0/1 
-add_0,0 
-go_first_number,​a,<​ 
- 
-add_0,1 
-go_first_number,​b,<​ 
- 
-add_0,# 
-translate_right_a,#,>​ 
- 
-// adaugam 1 la numarul curent si inlocuim numarul cu a/b pt 0/1 
-add_1,0 
-go_first_number,​b,<​ 
- 
-add_1,1 
-add_second_1,​a,<​ 
- 
-add_1,# 
-translate_right_b,#,>​ 
- 
-add_second_1,​0 
-go_first_number,​1,<​ 
- 
-add_second_1,​1 
-add_second_1,​0,<​ 
- 
-add_second_1,#​ 
-translate_right_1,#,>​ 
- 
-// functii pentru translatarea la dreapta a celui de-al doilea numar, 
-// unde caracterele posibile pot fi 0,1,a,b 
-translate_right_0,​0 
-translate_right_0,​0,>​ 
- 
-translate_right_0,​1 
-translate_right_1,​0,>​ 
- 
-translate_right_0,​a 
-translate_right_a,​0,>​ 
- 
-translate_right_0,​b 
-translate_right_b,​0,>​ 
- 
-translate_right_0,​_ 
-go_first_number,​0,<​ 
- 
-translate_right_1,​0 
-translate_right_0,​1,>​ 
- 
-translate_right_1,​1 
-translate_right_1,​1,>​ 
- 
-translate_right_1,​a 
-translate_right_a,​1,>​ 
- 
-translate_right_1,​b 
-translate_right_b,​1,>​ 
- 
-translate_right_1,​_ 
-go_first_number,​1,<​ 
- 
-translate_right_a,​0 
-translate_right_0,​a,>​ 
- 
-translate_right_a,​1 
-translate_right_1,​a,>​ 
- 
-translate_right_a,​a 
-translate_right_a,​a,>​ 
- 
-translate_right_a,​b 
-translate_right_b,​a,>​ 
- 
-translate_right_a,​_ 
-go_first_number,​a,<​ 
- 
-translate_right_b,​0 
-translate_right_0,​b,>​ 
- 
-translate_right_b,​1 
-translate_right_1,​b,>​ 
- 
-translate_right_b,​a 
-translate_right_a,​b,>​ 
- 
-translate_right_b,​b 
-translate_right_b,​b,>​ 
- 
-translate_right_b,​_ 
-go_first_number,​b,<​ 
- 
-// cand ajungem in finish trebuie sa facem clean-up la banda 
-// sa stergem X-uri si # 
-// sa transformam a in 0 si b in 1 
- 
-finish,X 
-finish,​_,>​ 
- 
-finish,# 
-finish,​_,>​ 
- 
-finish,1 
-finish,​1,>​ 
- 
-finish,0 
-finish,​0,>​ 
- 
-finish,a 
-finish,​0,>​ 
- 
-finish,b 
-finish,​1,>​ 
- 
-finish,_ 
-halt,_,- 
-</​code>​ 
-</​hidden>​ 
-*/