Differences

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

Link to this comparison view

Next revision
Previous revision
aa:lab:sol:1 [2023/10/21 21:14]
tpruteanu created
aa:lab:sol:1 [2024/10/16 23:18] (current)
dmihai
Line 1: Line 1:
 ====== Solutii Mașina Turing ====== ====== Solutii Mașina Turing ======
  
-==== Exerciții basic ====+1. {{:​aa:​lab:​sol:​1.xlsx|}}
  
-1. Soluție: [[https://​docs.google.com/​spreadsheets/​d/​1U-T08UyTtM58RZ2j2aY05HFWKENFPPL1/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true/​|Excel.]]+<​hidden>​
 <​code>​ <​code>​
-name: ex1 + // Scrieți o Mașină Turing care primește un șir binar și verifică dacă începe 
-init: start + // și se termină cu simboluri distincte (e.g. 100110110).
-accept: H, Y+
  
-//starea de start este bineînțeles "​start"​ +//-------CONFIGURATION 
-//folosind stările "​expect0"​ si "​expect1",​ practic "​ținem in memorie"​ primul număr din șir +name: l1e1 
-//stările "​found0?"​ si "​found1?"​ verifică dacă ultima cifră este aceeași cu prima.+init: q1 
 +accept: Y, H
  
-start,0 +q1, 0 
-expect0,0,>+mem0, 0, >
  
-start,1 +q1, 1 
-expect1,1,>+mem1, 0, >
  
-start,_ +q1, _ 
-N,_,-+N, _, -
  
-expect0,0 
-expect0,​0,>​ 
  
-expect0,1 +mem0, 0 
-expect0,1,>+mem0, 0, >
  
-expect0,_ +mem0, 1 
-found0?,_,<+mem0, 1, >
  
-found0?,0 +mem0, _ 
-Y,0,-+expect1, _, <
  
-found0?,1 
-N,1,- 
  
-found0?,_ +mem1, 0 
-N,_,-+mem1, 0, >
  
-expect1,0 +mem1, 1 
-expect1,0,>+mem1, 1, >
  
-expect1,1 +mem1, _ 
-expect1,1,>+expect0, _, <
  
-expect1,_ 
-found1?,​_,<​ 
  
-found1?,0 +expect0, 0 
-N,0,-+Y, 0, -
  
-found1?,1 +expect0, 1 
-Y,1,-+N, 1, -
  
-found1?,_ 
-N,_,- 
  
 +expect1, 0
 +N, 0, -
 +
 +expect1, 1
 +Y, 1, -
 </​code>​ </​code>​
 +</​hidden>​
  
-2. Soluție [[https://​docs.google.com/​spreadsheets/​d/​10P5eq41BncWpAgPVf5O_xeRHGzNYmjyF/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]]+2. {{:aa:​lab:​sol:​2.xlsx}} 
 + 
 +<​hidden>​
 <​code>​ <​code>​
-name: ex2 +// Rezolvați exercițiul anterior pentru input în baza 10.
-init: start +
-accept: H, Y+
  
-//Strategie: ștergem prima cifra, mergem până la final, ștergem a doua cifră +//-------CONFIGURATION 
-//Stările de tipul "​FindLastX",​ șterg prima cifră, si merg până dau de "​_"​. +name: l1e2 
-//Stările de tipul "​EraseLastX",​ șterg ultima cifră, apoi dau reset. +init: q1 
-//Dacă o stare de tipul "​EraseLastX"​ descoperă tot _, înseamnă ca starea "​FindLastX"​ a șters ultima cifră. +accept: Y, H
-//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 +q1, 0 
-FindLast0,_,>+mem0, 0, >
  
-start,1 +q1, 1 
-FindLast1,_,>+mem1, 0, >
  
-start,_ +q1, 2 
-N,_,-+mem2, 0, >
  
-FindLast0,0 +q1, 3 
-FindLast0,0,>+mem3, 0, >
  
-FindLast0,1 +q1, 4 
-FindLast0,1,>+mem4, 0, >
  
-FindLast0,_ +q1, 5 
-EraseLast0,_,<+mem5, 0, >
  
-EraseLast0,0 +q1, 6 
-Reset,_,<+mem6, 0, >
  
-EraseLast0,1 +q1, 7 
-Reset,_,<+mem7, 0, >
  
-EraseLast0,_ +q1, 8 
-Y,_,-+mem8, 0, >
  
-FindLast1,0 +q1, 9 
-FindLast1,0,>+mem9, 0, >
  
-FindLast1,1 +q1, _ 
-FindLast1,1,>+N, _, -
  
-FindLast1,_ 
-EraseLast1,​_,<​ 
  
-EraseLast1,0 +mem0, 0 
-Reset,_,<+mem0, 0, >
  
-EraseLast1,1 +mem0, 1 
-Reset,_,<+mem0, 1, >
  
-EraseLast1,_ +mem0, 2 
-N,_,-+mem0, 2, >
  
-Reset,0 +mem0, 3 
-Reset,0,<+mem0, 3, >
  
-Reset,1 +mem0, 4 
-Reset,1,<+mem0, 4, >
  
-Reset,_ +mem0, 5 
-start,_,>+mem0, 5, >
  
 +mem0, 6
 +mem0, 6, >
  
 +mem0, 7
 +mem0, 7, >
  
-</code>+mem0, 8 
 +mem0, 8, >
  
-3. Soluție [[https://​docs.google.com/​spreadsheets/​d/​1oLU7_5MJ3YAVLeXSjCShGKFjYSWi4HBk/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]] +mem0, 9 
-<code> +mem0, 9, >
-name: ex3 +
-init: start +
-accept: H, Y+
  
-//parcurgem șirul, înlocuind 0 cu 1 si 1 cu 0. Trivial nu-i așa? (: +mem0, _ 
-start,0 +expectn0, _, <
-start,1,>+
  
-start,1 
-start,​0,>​ 
  
-start,_ +mem1, 0 
-H,_,-+mem1, 0, >
  
 +mem1, 1
 +mem1, 1, >
  
 +mem1, 2
 +mem1, 2, >
  
-</code> +mem1, 3 
 +mem1, 3, >
  
-4. Soluție [[https://​docs.google.com/​spreadsheets/​d/​1sMjIBxlEJVgZsG2WHKzMb80MCdWQNBY3/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]] +mem1, 4 
-<​code>​ +mem1, 4, >
-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. +mem1, 5 
-//După ștergem la dreapta până dam de "​_"​ si atunci scriem "​1"​.+mem1, 5, >
  
-cleanRight,0 +mem1, 6 
-cleanRight,_,<+mem1, 6, >
  
-cleanRight,1 +mem1, 7 
-cleanRight,_,<+mem1, 7, >
  
-cleanRight,_ +mem1, 8 
-Reset,_,>+mem1, 8, >
  
-Reset,0 +mem1, 9 
-cleanLeft,_,>+mem1, 9, >
  
-Reset,1 +mem1, _ 
-cleanLeft,_,>+expectn1, _, <
  
-Reset,_ 
-Reset,​_,>​ 
  
-cleanLeft,0 +mem2, 0 
-cleanLeft,_,>+mem2, 0, >
  
-cleanLeft,1 +mem2, 1 
-cleanLeft,_,>+mem2, 1, >
  
-cleanLeft,_ +mem2, 2 
-Y,1,-+mem2, 2, >
  
 +mem2, 3
 +mem2, 3, >
  
-</code>+mem2, 4 
 +mem2, 4, >
  
-5. Soluție [[https://​docs.google.com/​spreadsheets/​d/​1lc2s-U7TZV814FoH3f6G2xH_gIV1QlVg/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]] +mem2, 5 
-<​code>​ +mem2, 5, >
-name: ex5 +
-init: addXatEnd +
-accept: H, Y+
  
-//​Strategie:​ Primul pas adăugăm un X la final. +mem2, 6 
-//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. +mem2, 6, >
-//La final ștergem toți X.+
  
-addXatEnd,0 +mem2, 7 
-addXatEnd,0,>+mem2, 7, >
  
-addXatEnd,1 +mem2, 8 
-addXatEnd,1,>+mem2, 8, >
  
-addXatEnd,_ +mem2, 9 
-readFirstX,X,<+mem2, 9, >
  
-addXatEnd,X +mem2, _ 
-N,X,-+expectn2, _, <
  
-readLastX,0 
-readLastX,​0,<​ 
  
-readLastX,1 +mem3, 0 
-readLastX,1,<+mem3, 0, >
  
-readLastX,_ +mem3, 1 
-stergeX,_,>+mem3, 1, >
  
-readLastX,X +mem3, 2 
-readFirstX,X,<+mem3, 2, >
  
-readFirstX,0 +mem3, 3 
-keep0,X,>+mem3, 3, >
  
-readFirstX,1 +mem3, 4 
-keep1,X,>+mem3, 4, >
  
-readFirstX,_ +mem3, 5 
-stergeX,_,>+mem3, 5, >
  
-readFirstX,X +mem3, 6 
-readFirstX,X,<+mem3, 6, >
  
-keep0,0 +mem3, 7 
-keep0,0,>+mem3, 7, >
  
-keep0,1 +mem3, 8 
-keep0,1,>+mem3, 8, >
  
-keep0,_ +mem3, 9 
-readLastX,0,<+mem3, 9, >
  
-keep0,X +mem3, _ 
-keep0,X,>+expectn3, _, <
  
-keep1,0 
-keep1,​0,>​ 
  
-keep1,1 +mem4, 0 
-keep1,1,>+mem4, 0, >
  
-keep1,_ +mem4, 1 
-readLastX,1,<+mem4, 1, >
  
-keep1,X +mem4, 2 
-keep1,X,>+mem4, 2, >
  
-stergeX,0 +mem4, 3 
-stergeX,0,<+mem4, 3, >
  
-stergeX,1 +mem4, 4 
-stergeX,1,<+mem4, 4, >
  
-stergeX,_ +mem4, 5 
-Y,_,-+mem4, 5, >
  
-stergeX,X +mem4, 6 
-stergeX,_,>+mem4, 6, >
  
-name: machine +mem4, 7 
-init: addXatEnd +mem4, 7, >
-accept: H, Y+
  
-addXatEnd,0 +mem4, 8 
-addXatEnd,0,>+mem4, 8, >
  
-addXatEnd,1 +mem4, 9 
-addXatEnd,1,>+mem4, 9, >
  
-addXatEnd,_ +mem4, _ 
-readFirstX,X,<+expectn4, _, <
  
-addXatEnd,X 
-N,X,- 
  
-readLastX,0 +mem5, 0 
-readLastX,0,<+mem5, 0, >
  
-readLastX,1 +mem5, 1 
-readLastX,1,<+mem5, 1, >
  
-readLastX,_ +mem5, 2 
-stergeX,_,>+mem5, 2, >
  
-readLastX,X +mem5, 3 
-readFirstX,X,<+mem5, 3, >
  
-readFirstX,0 +mem5, 4 
-keep0,X,>+mem5, 4, >
  
-readFirstX,1 +mem5, 5 
-keep1,X,>+mem5, 5, >
  
-readFirstX,_ +mem5, 6 
-stergeX,_,>+mem5, 6, >
  
-readFirstX,X +mem5, 7 
-readFirstX,X,<+mem5, 7, >
  
-keep0,0 +mem5, 8 
-keep0,0,>+mem5, 8, >
  
-keep0,1 +mem5, 9 
-keep0,1,>+mem5, 9, >
  
-keep0,_ +mem5, _ 
-readLastX,0,<+expectn5, _, <
  
-keep0,X 
-keep0,​X,>​ 
  
-keep1,0 +mem6, 0 
-keep1,0,>+mem6, 0, >
  
-keep1,1 +mem6, 1 
-keep1,1,>+mem6, 1, >
  
-keep1,_ +mem6, 2 
-readLastX,1,<+mem6, 2, >
  
-keep1,X +mem6, 3 
-keep1,X,>+mem6, 3, >
  
-stergeX,0 +mem6, 4 
-stergeX,0,<+mem6, 4, >
  
-stergeX,1 +mem6, 5 
-stergeX,1,<+mem6, 5, >
  
-stergeX,_ +mem6, 6 
-Y,_,-+mem6, 6, >
  
-stergeX,X +mem6, 7 
-stergeX,_,>+mem6, 7, >
  
 +mem6, 8
 +mem6, 8, >
  
-</code>+mem6, 9 
 +mem6, 9, >
  
-==== Exerciții fun ==== +mem6, _ 
-6. Soluție [[https://​docs.google.com/​spreadsheets/​d/​1NX6EwAsnc7RTa3brV8h5soj2x6Myfto1/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]] +expectn6, _, <
-<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 +mem7, 0 
-findOneMoreM,_,>+mem7, 0, >
  
-start,_ +mem7, 1 
-N,_,-+mem7, 1, >
  
-start,A +mem7, 2 
-findOneMoreA,_,>+mem7, 2, >
  
-findOneMoreM,M +mem7, 3 
-checkIfEmptyM,_,>+mem7, 3, >
  
-findOneMoreM,_ +mem7, 4 
-N,_,-+mem7, 4, >
  
-findOneMoreM,A +mem7, 5 
-N,_,-+mem7, 5, >
  
-AddAnA,M +mem7, 6 
-AddAnA,M,>+mem7, 6, >
  
-AddAnA,_ +mem7, 7 
-reset,A,<+mem7, 7, >
  
-AddAnA,A +mem7, 8 
-AddAnA,A,>+mem7, 8, >
  
-reset,M +mem7, 9 
-reset,M,<+mem7, 9, >
  
-reset,_ +mem7, _ 
-start,_,>+expectn3, _, <
  
-reset,A 
-reset,​A,<​ 
  
-findOneMoreA,M +mem8, 0 
-N,_,-+mem8, 0, >
  
-findOneMoreA,_ +mem8, 1 
-N,_,-+mem8, 1, >
  
-findOneMoreA,A +mem8, 2 
-checkIfEmptyA,_,>+mem8, 2, >
  
-AddAnM,M +mem8, 3 
-AddAnM,M,>+mem8, 3, >
  
-AddAnM,_ +mem8, 4 
-reset,M,<+mem8, 4, >
  
-AddAnM,A +mem8, 5 
-AddAnM,A,>+mem8, 5, >
  
-checkIfEmptyM,M +mem8, 6 
-AddAnA,M,>+mem8, 6, >
  
-checkIfEmptyM,_ +mem8, 7 
-Y,_,-+mem8, 7, >
  
-checkIfEmptyM,A +mem8, 8 
-AddAnA,A,>+mem8, 8, >
  
-checkIfEmptyA,M +mem8, 9 
-AddAnM,M,>+mem8, 9, >
  
-checkIfEmptyA,_ +mem8, _ 
-Y,_,-+expectn8, _, <
  
-checkIfEmptyA,​A 
-AddAnM,​A,>​ 
  
 +mem9, 0
 +mem9, 0, >
  
 +mem9, 1
 +mem9, 1, >
 +
 +mem9, 2
 +mem9, 2, >
 +
 +mem9, 3
 +mem9, 3, >
 +
 +mem9, 4
 +mem9, 4, >
 +
 +mem9, 5
 +mem9, 5, >
 +
 +mem9, 6
 +mem9, 6, >
 +
 +mem9, 7
 +mem9, 7, >
 +
 +mem9, 8
 +mem9, 8, >
 +
 +mem9, 9
 +mem9, 9, >
 +
 +mem9, _
 +expectn9, _, <
 +
 +
 +expectn0, 0
 +N, 0, -
 +
 +expectn1, 1
 +N, 1, -
 +
 +expectn2, 2
 +N, 2, -
 +
 +expectn3, 3
 +N, 3, -
 +
 +expectn4, 4
 +N, 4, -
 +
 +expectn5, 5
 +N, 5, -
 +
 +expectn6, 6
 +N, 6, -
 +
 +expectn7, 7
 +N, 7, -
 +
 +expectn8, 8
 +N, 8, -
 +
 +expectn9, 9
 +N, 9, -
 +
 +
 +expectn0, 1
 +Y, 1, -
 +
 +expectn0, 2
 +Y, 2, -
 +
 +expectn0, 3
 +Y, 3, -
 +
 +expectn0, 4
 +Y, 4, -
 +
 +expectn0, 5
 +Y, 5, -
 +
 +expectn0, 6
 +Y, 6, -
 +
 +expectn0, 7
 +Y, 7, -
 +
 +expectn0, 8
 +Y, 8, -
 +
 +expectn0, 9
 +Y, 9, -
 +
 +
 +expectn1, 0
 +Y, 0, -
 +
 +expectn1, 2
 +Y, 2, -
 +
 +expectn1, 3
 +Y, 3, -
 +
 +expectn1, 4
 +Y, 4, -
 +
 +expectn1, 5
 +Y, 5, -
 +
 +expectn1, 6
 +Y, 6, -
 +
 +expectn1, 7
 +Y, 7, -
 +
 +expectn1, 8
 +Y, 8, -
 +
 +expectn1, 9
 +Y, 9, -
 +
 +
 +expectn2, 0
 +Y, 0, -
 +
 +expectn2, 1
 +Y, 1, -
 +
 +expectn2, 3
 +Y, 3, -
 +
 +expectn2, 4
 +Y, 4, -
 +
 +expectn2, 5
 +Y, 5, -
 +
 +expectn2, 6
 +Y, 6, -
 +
 +expectn2, 7
 +Y, 7, -
 +
 +expectn2, 8
 +Y, 8, -
 +
 +expectn2, 9
 +Y, 9, -
 +
 +
 +expectn3, 0
 +Y, 0, -
 +
 +expectn3, 1
 +Y, 1, -
 +
 +expectn3, 2
 +Y, 2, -
 +
 +expectn3, 4
 +Y, 4, -
 +
 +expectn3, 5
 +Y, 5, -
 +
 +expectn3, 6
 +Y, 6, -
 +
 +expectn3, 7
 +Y, 7, -
 +
 +expectn3, 8
 +Y, 8, -
 +
 +expectn3, 9
 +Y, 9, -
 +
 +
 +expectn4, 0
 +Y, 0, -
 +
 +expectn4, 1
 +Y, 1, -
 +
 +expectn4, 2
 +Y, 2, -
 +
 +expectn4, 3
 +Y, 3, -
 +
 +expectn4, 5
 +Y, 5, -
 +
 +expectn4, 6
 +Y, 6, -
 +
 +expectn4, 7
 +Y, 7, -
 +
 +expectn4, 8
 +Y, 8, -
 +
 +expectn4, 9
 +Y, 9, -
 +
 +
 +expect5, 0
 +Y, 0, -
 +
 +expect5, 1
 +Y, 1, -
 +
 +expect5, 2
 +Y, 2, -
 +
 +expect5, 3
 +Y, 3, -
 +
 +expect5, 4
 +Y, 4, -
 +
 +expect5, 6
 +Y, 6, -
 +
 +expect5, 7
 +Y, 7, -
 +
 +expect5, 8
 +Y, 8, -
 +
 +expect5, 9
 +Y, 9, -
 +
 +
 +expect6, 0
 +Y, 0, -
 +
 +expect6, 1
 +Y, 1, -
 +
 +expect6, 2
 +Y, 2, -
 +
 +expect6, 3
 +Y, 3, -
 +
 +expect6, 4
 +Y, 4, -
 +
 +expect6, 5
 +Y, 5, -
 +
 +expect6, 7
 +Y, 7, -
 +
 +expect6, 8
 +Y, 8, -
 +
 +expect6, 9
 +Y, 9, -
 +
 +
 +expect7, 0
 +Y, 0, -
 +
 +expect7, 1
 +Y, 1, -
 +
 +expect7, 2
 +Y, 2, -
 +
 +expect7, 3
 +Y, 3, -
 +
 +expect7, 4
 +Y, 4, -
 +
 +expect7, 5
 +Y, 5, -
 +
 +expect7, 6
 +Y, 6, -
 +
 +expect7, 8
 +Y, 8, -
 +
 +expect7, 9
 +Y, 9, -
 +
 +
 +expect8, 0
 +Y, 0, -
 +
 +expect8, 1
 +Y, 1, -
 +
 +expect8, 2
 +Y, 2, -
 +
 +expect8, 3
 +Y, 3, -
 +
 +expect8, 4
 +Y, 4, -
 +
 +expect8, 5
 +Y, 5, -
 +
 +expect8, 6
 +Y, 6, -
 +
 +expect8, 7
 +Y, 7, -
 +
 +expect8, 9
 +Y, 9, -
 +
 +
 +expect9, 0
 +Y, 0, -
 +
 +expect9, 1
 +Y, 1, -
 +
 +expect9, 2
 +Y, 2, -
 +
 +expect9, 3
 +Y, 3, -
 +
 +expect9, 4
 +Y, 4, -
 +
 +expect9, 5
 +Y, 5, -
 +
 +expect9, 6
 +Y, 6, -
 +
 +expect9, 7
 +Y, 7, -
 +
 +expect9, 8
 +Y, 8, -
 </​code>​ </​code>​
 +</​hidden>​
 +
 +3. {{:​aa:​lab:​sol:​3.xlsx}}
  
-7. Soluție [[https://​docs.google.com/​spreadsheets/​d/​17aCsQi6oEl5s9r9azQ4W972yh0Ur-rY3/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]]+<​hidden>​
 <​code>​ <​code>​
-name: ex7+// Scrieți o Mașină Turing care primește un șir binar și verifică dacă 
 +// are lungime impară și simbolul din mijloc este 0 (e.g. 101100011). 
 +name: l1e3
 init: start init: start
 accept: H, Y accept: H, Y
  
-//​Strategie:​ căutăm ultima paranteza deschisa "​("​, îi căutăm pereche și le marcăm pe ambele cu X +start, 0 
-//Daca la final rămân doar X-uri pe banda înseamnă ca șirul este echilibrat.+got0, _, >
  
-start,( +start, ​1 
-start,(,>+find_end, _, >
  
-start,) +start, ​_ 
-start,),>+N, _, -
  
-start,X 
-N,X,- 
  
-start,_ +find_end, 0 
-FindLast(,_,<+find_end, 0, >
  
-FindLast(,( +find_end, 1 
-FindPereche,X,>+find_end, 1, >
  
-FindLast(,) +find_end, _ 
-FindLast(,),<+delete_last, _, <
  
-FindLast(,X 
-FindLast(,​X,<​ 
  
-FindLast(,_ +delete_last, 0 
-clearX,_,>+reset, _, <
  
-FindPereche,( +delete_last, 1 
-N,(,-+reset, _, <
  
-FindPereche,) +// input was just "​1"​ 
-FindLast(,X,<+delete_last, _ 
 +N, _, -
  
-FindPereche,​X 
-FindPereche,​X,>​ 
  
-FindPereche,_ +reset, 0 
-N,_,-+reset, 0, <
  
-clearX,( +reset, 1 
-N,(,-+reset, 1, <
  
-clearX,) +reset, _ 
-N,),-+start, _, >
  
-clearX,X 
-clearX,​_,>​ 
  
-clearX,_ +got0, 0 
-Y,_,-+find_end, 0, >
  
 +got0, 1
 +find_end, 1, >
  
 +got0, _
 +Y, _, -
 </​code>​ </​code>​
 +</​hidden>​
  
-8. Soluție [[https://​docs.google.com/​spreadsheets/​d/​1cSAH-z8hmqGZ49-u4dzlld4wh883fu0u/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]]+4. {{:aa:​lab:​sol:​4.xlsx}} 
 + 
 +<​hidden>​
 <​code>​ <​code>​
-name: ex8+// Scrieți o Mașină Turing care primește un șir binar și 
 +// lasă pe bandă complementul lui (e.g. “100110100” → “011001011”) 
 +name: l1e4
 init: start init: start
 accept: H, Y 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, +start, 0 
-//ținem minte fiecare caracter abia schimbat cu ajutorul stărilor, +start, 1, >
-//apoi ne întoarcem, înlocuim X cu L si căutăm următorul M.+
  
-start,M +start, ​1 
-startShift,M,>+start, 0, >
  
-start,L +start, ​_ 
-start,L,>+H, _, - 
 +</​code>​ 
 +</hidden>
  
-start,X +5. {{:​aa:​lab:​sol:​5.xlsx}}
-N,X,-+
  
-start,_ +<​hidden>​ 
-Y,_,-+<​code>​ 
 +// 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”. 
 +name: l1e5 
 +init: start 
 +accept: H, Y
  
-startShift,M +start, 0 
-keepM,X,>+start, 0, <
  
-startShift,L +start, 1 
-keepL,X,>+start, 1, <
  
-startShift,X +start, _ 
-N,X,-+delete, _, >
  
-startShift,​_ 
-Y,L,- 
  
-keepM,M +delete, 0 
-keepM,M,>+delete, _, >
  
-keepM,L +delete, 1 
-keepL,M,>+delete, _, >
  
-keepM,X +delete, _ 
-N,X,-+H, 1, - 
 +</​code>​ 
 +</​hidden>​
  
-keepM,_ +6. {{:​aa:​lab:​sol:​6.xlsx}}
-reset,​M,<​+
  
-keepL,M +<​hidden>​ 
-keepM,L,>+<code> 
 +// Scrieți o Mașină Turing care inversează cuvântul primit pe bandă. 
 +name: l1e6 
 +init: start 
 +accept: H, Y
  
-keepL,L +// mașina o să memoreze primul simbol, o să-l șteargă, apoi va parcuge inputul 
-keepL,L,>+// până ajunge la final, lasă un spațiu liber și plasează simbolul memorat pe 
 +// prima celula goală, după spațiul liber; apoi revine la începutul șirului, 
 +// făcând recursiv această acțiune. 
 +start, 0 
 +mem0, _, >
  
-keepL,X +start, 1 
-N,X,-+mem1, _, >
  
-keepL,_ +start, _ 
-reset,L,<+H, _, >
  
-reset,M 
-reset,​M,<​ 
  
-reset,L +mem0, 0 
-reset,L,<+mem0, 0, >
  
-reset,X +mem0, 1 
-start,L,>+mem0, 1, >
  
-reset,_ +mem0, _ 
-Y,_,-+write_at_end_0, _, >
  
  
 +mem1, 0
 +mem1, 0, >
 +
 +mem1, 1
 +mem1, 1, >
 +
 +mem1, _
 +write_at_end_1,​ _, >
 +
 +
 +write_at_end_0,​ 0
 +write_at_end_0,​ 0, >
 +
 +write_at_end_0,​ 1
 +write_at_end_0,​ 1, >
 +
 +write_at_end_0,​ _
 +reset, 0, <
 +
 +
 +write_at_end_1,​ 0
 +write_at_end_1,​ 0, >
 +
 +write_at_end_1,​ 1
 +write_at_end_1,​ 1, >
 +
 +write_at_end_1,​ _
 +reset, 1, <
 +
 +
 +reset, 0
 +reset, 0, <
 +
 +reset, 1
 +reset, 1, <
 +
 +reset, _
 +reset2, _, <
 +
 +
 +reset2, 0
 +reset2, 0, <
 +
 +reset2, 1
 +reset2, 1, <
 +
 +reset2, _
 +start, _, >
 </​code>​ </​code>​
 +</​hidden>​
 +
 +7. {{:​aa:​lab:​sol:​7.xlsx}}
  
-9. Soluție [[https://​docs.google.com/​spreadsheets/​d/​14EUgDigN133zj3xH9Lh_9T7dKuPr1Llh/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]]+<​hidden>​
 <​code>​ <​code>​
-name: ex9+// Scrieți o Mașină Turing care primește un șir de “X”-uri și 
 +// verifică dacă lungimea acestuia este o putere a lui 2. 
 +name: l1e7
 init: start init: start
 accept: H, Y accept: H, Y
  
-//Strategie: Primul pas, Johnny retine numărul 0, adică adăugăm un 0 la stânga lui J. +// Vom folosi simbolul D pentru a marca X-uri (nu le ștergem ca să putem știi 
-//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. +// unde începe și se termină șirul (la simboluri blank). 
-//La final îl mutam pe Johnny și pe numărul din mintea sa la dreapta șirului.+// 
 +// Vom șterge 1 din două X-uri, apoi ne vom întoarce ​la început ​și vom repeta 
 +// procesul. 
 +// 
 +// Dacă găsim un nr. impar de X-uri, inputul e respins; în afară de cazul în 
 +// găsim un singur X (singura putere impară a lui 2), caz în care acceptăm. 
 +start, X 
 +check_if_just_one_X,​ D, >
  
-start,0 +start, ​D 
-add0,0,<+start, D, >
  
-start,1 +// 0 nu e o putere a lui 2. 
-add0,1,<+start, ​_ 
 +N, _, -
  
-start,_ 
-Y,0,- 
  
-start,J +check_if_just_one_X, D 
-add0,J,<+check_if_just_one_X, D, >
  
-start,X +check_if_just_one_X, _ 
-N,_,-+Y, _, -
  
-start,B +check_if_just_one_X, X 
-add0,B,<+skip, X, -
  
-start,M 
-add0,M,< 
  
-findB,0 +skip, X 
-findB,0,>+delete, X, >
  
-findB,1 +skip, D 
-findB,1,>+skip, D, >
  
-findB,_ +skip, _ 
-moveNrLast,J,<+N, _, -
  
-findB,J 
-findB,​J,>​ 
  
-findB,X +delete, X 
-findB,X,>+skip, D, >
  
-findB,B +delete, D 
-goBI,X,<+delete, D, >
  
-findB,M +delete, _ 
-findB,M,>+reset, _, <
  
-goBI,0 
-goBI,0,< 
  
-goBI,1 +reset, X 
-goBI,1,<+reset, X, <
  
-goBI,_ +reset, D 
-N,_,-+reset, D, <
  
-goBI,J +reset, _ 
-doBI,J,<+start, _, > 
 +</​code>​ 
 +</hidden>
  
-goBI,X +8. {{:​aa:​lab:​sol:​8.xlsx}}
-goBI,X,<+
  
-goBI,B +<​hidden>​ 
-goBI,B,<+<​code>​ 
 +// Scrieți o Mașină Turing care primește un șir de paranteze “(”, “)” ​ 
 +// și verifică dacă sunt echilibrate. 
 +name: l1e8 
 +init: start 
 +accept: H, Y
  
-goBI,M 
-goBI,M,< 
  
-add0,0 +// Whenever we find an open paranthesis, we search for a match and delete it. 
-N,_,-+// As before, we don't want to include blank symbols in the middle of the tape, 
 +// so we'll delete it by overwriting it with the symbol "​D"​. 
 +start, ) 
 +N, ), -
  
-add0,1 +start, ( 
-N,_,-+find_), _, >
  
-add0,_ +start, D 
-findB,0,>+start, _, >
  
-add0,J +start, _ 
-N,_,-+Y, _, -
  
-add0,X 
-N,_,- 
  
-add0,B +find_), ( 
-N,_,-+find_), (, >
  
-add0,M +find_), D 
-N,_,-+find_), D, >
  
-doBI,0 +find_), ) 
-gotoJ,1,>+reset, D, <
  
-doBI,1 
-doBI,0,< 
  
-doBI,_ +reset, ( 
-gotoJ,1,>+reset, (, <
  
-doBI,J +reset, ) 
-N,_,-+reset, ), <
  
-doBI,X +reset, D 
-N,_,-+reset, D, <
  
-doBI,B +reset, _ 
-N,_,-+start, _, > 
 +</​code>​ 
 +</​hidden>​
  
-doBI,M +9. {{:​aa:​lab:​sol:​9.xlsx}}
-N,_,-+
  
-gotoJ,0 +<​hidden>​ 
-gotoJ,0,>+<code> 
 +// Scrieți o Mașină Turing care primește un număr în baza 2 și verifică dacă 
 +// e divizibil cu 5. 
 +name: l1e9 
 +init: r0 
 +accept: H, Y
  
-gotoJ,1 +// Ideea este să reținem în starea curentă, resturile împărțirii la 5, care sunt 
-gotoJ,1,>+// cinci la număr: 0, 1, 2, 3, 4 
 +// Putem să ne imaginăm că la orice moment de timp, am citit primii biți din 
 +// input, formând un număr n, despre care ținem minte doar restul împărțirii 
 +// la 5, numit r; când ne mutăm la dreapta, citind un nou bit din input, 
 +// avem de fapt un nou număr: 
 +//  - dacă citim 0, avem n * 2 
 +//  - dacă citim 1, avem n * 2 + 1 
 +// 
 +// Dar nu trebuie să ținem minte tot numărul, doar restul împărțirii la 5; deci, 
 +// de exemplu, dacă avem r = 3, și citim un 1, atunci r devine 2 
 +// (adică 3 * 2 + 1 mod 5). 
 +r0, 0 
 +r0, 0, >
  
-gotoJ,_ +r0, 1 
-N,_,-+r1, 1, >
  
-gotoJ,J +r0, _ 
-findB,J,>+Y, _, -
  
-gotoJ,X 
-gotoJ,​X,>​ 
  
-gotoJ,B +r1, 0 
-N,_,-+r2, 0, >
  
-gotoJ,M +r1, 1 
-N,_,-+r3, 1, >
  
-moveNrLast,0 +r1, _ 
-moveNrLast,0,<+N, _, -
  
-moveNrLast,​1 
-moveNrLast,​1,<​ 
  
-moveNrLast,_ +r2, 0 
-goBack,_,>+r4, 0, >
  
-moveNrLast,J +r2, 1 
-moveNrLast,J,<+r0, 1, >
  
-moveNrLast,X +r2, _ 
-moveNrLast,B,<+N, _, -
  
-moveNrLast,​B 
-moveNrLast,​B,<​ 
  
-moveNrLast,M +r3, 0 
-moveNrLast,M,<+r1, 0, >
  
-goBack,0 +r3, 1 
-keep0,_,>+r2, 1, >
  
-goBack,1 +r3, _ 
-keep1,_,>+N, _, -
  
-goBack,_ 
-N,_,- 
  
-goBack,J +r4, 0 
-Y,_,-+r3, 0, >
  
-goBack,X +r4, 1 
-N,_,-+r4, 1, >
  
-goBack,B +r1, _ 
-N,_,-+N, _, - 
 +</​code>​ 
 +</​hidden>​
  
-goBack,M +10. {{:​aa:​lab:​sol:​10.xlsx}}
-N,_,-+
  
-keep0,0 +<​hidden>​ 
-keep0,0,>+<​code>​ 
 +// Scrieți o Mașină Turing care primește un cuvânt binar, găsește primul  
 +// simbol “0” și inserează un “1” în stânga lui (deci tot ce apare la  
 +// dreapta va trebui mutat cu o poziție). 
 +name: l1e10 
 +init: start 
 +accept: H, Y
  
-keep0,1 +start, 0 
-keep0,1,>+shift_input0, 1, >
  
-keep0,_ +start, 1 
-N,_,-+start, 1, >
  
-keep0,J +start, _ 
-keep02,J,>+H, _, -
  
-keep0,X 
-N,_,- 
  
-keep0,B +shift_input0, 0 
-keep0,B,>+shift_input0, 0, >
  
-keep0,M +shift_input0, 1 
-keep0,M,>+shift_input1, 0, >
  
-keep1,0 +shift_input0, _ 
-keep1,0,>+H, 0, -
  
-keep1,1 
-keep1,​1,>​ 
  
-keep1,_ +shift_input1, 0 
-N,_,-+shift_input0, 1, >
  
-keep1,J +shift_input1, 1 
-keep12,J,>+shift_input1, 1, >
  
-keep1,X +shift_input1, _ 
-N,_,-+H, 1, - 
 +</​code>​ 
 +</​hidden>​
  
-keep1,B +11. {{:​aa:​lab:​sol:​11.xlsx}}
-keep1,​B,>​+
  
-keep1,M +<​hidden>​ 
-keep1,M,>+<​code>​ 
 +// 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 (e.g. “1011#​11001” → “100100”). 
 +name: l1e11 
 +init: start 
 +accept: H, Y
  
-put0,0 +// E mai ușor să adunăm cel de-al doilea număr la primul, creând rezultatul 
-put0,0,>+// "​peste"​ primul număr (altfel în cazul în care al doilea număr e mai scurt, 
 +// sau adunarea produce overflow, ar trebui să shiftăm rezultatul). 
 +// Ca să știm la ce cifră din primul număr am jos, vom folosi simboluri  
 +// auxiliare Z și O (pentru 0 și 1), cât lucrăm, și le vom înlocui abia la 
 +// final. 
 +start, 0 
 +go_to_#, 0, >
  
-put0,1 +start, 1 
-put0,1,>+go_to_#, 1, >
  
-put0,_ +start, # 
-moveNrLast,0,<+H, _, >
  
-put0,J 
-N,_,- 
  
-put0,X +go_to_#, 0 
-N,_,-+go_to_#, 0, >
  
-put0,B +go_to_#, 1 
-put0,B,>+go_to_#, 1, >
  
-put0,M +go_to_#, Z 
-put0,M,>+go_to_#, Z, >
  
-put1,0 +go_to_#, O 
-put1,0,>+go_to_#, O, >
  
-put1,1 +go_to_#, # 
-put1,1,>+go_to_end, #, >
  
-put1,_ 
-moveNrLast,​1,<​ 
  
-put1,J +go_to_end, 0 
-N,_,-+go_to_end, 0, >
  
-put1,X +go_to_end, 1 
-N,_,-+go_to_end, 1, >
  
-put1,B +go_to_end, _ 
-put1,B,>+get_lsd, _, <
  
-put1,M 
-put1,M,> 
  
-keep02,0 +get_lsd, 0 
-keep02,0,>+lsd_0, _, <
  
-keep02,1 +get_lsd, 1 
-keep02,1,>+lsd_1, _, <
  
-keep02,_ 
-N,_,- 
  
-keep02,J +// n-au mai rămas cifre de prelucrat din al doilea număr 
-put0,J,>+get_lsd, # 
 +rewrite_first, _, <
  
-keep02,X +lsd_0, 0 
-N,_,-+lsd_0, 0, <
  
-keep02,B +lsd_0, 1 
-keep02,B,>+lsd_0, 1, <
  
-keep02,M +lsd_0, # 
-keep02,M,>+lsd_0_after_#​, #, <
  
-keep12,0 
-keep12,​0,>​ 
  
-keep12,1 +lsd_1, 0 
-keep12,1,>+lsd_1, 0, <
  
-keep12,_ +lsd_1, 1 
-N,_,-+lsd_1, 1, <
  
-keep12,J +lsd_1, # 
-put1,J,>+lsd_1_after_#​, #, <
  
-keep12,X 
-N,_,- 
  
-keep12,B +// Sărim peste cifrele "deja afectate"​. 
-keep12,B,>+lsd_0_after_#​, Z 
 +lsd_0_after_#​, Z, <
  
-keep12,M +lsd_0_after_#​, O 
-keep12,M,>+lsd_0_after_#​, O, <
  
  
-</code>+lsd_1_after_#,​ Z 
 +lsd_1_after_#,​ Z, <
  
-==== Exerciții tryhard ==== +lsd_1_after_#,​ O 
-10. Soluție [[https://​docs.google.com/​spreadsheets/​d/​1ba-I4AgH9O7bdXox1zX_p26Ymb_-D85N/​edit?​usp=sharing&​ouid=113096868136191520794&​rtpof=true&​sd=true|Excel.]] +lsd_1_after_#,​ O, <
-<code>+
  
-name: ex10 
-init: q1 
-accept: halt 
  
-// q1 parcurge ​primul ​numar +// marcăm o nouă cifră prelucrată din primul ​număr 
-// pana la separatorul dintre numere +lsd_0_after_#​, 0 
-q1,0 +go_to_#, Z, >
-q1,0,>+
  
-q1,1 +lsd_0_after_#​, 1 
-q1,1,>+go_to_#, O, >
  
-q1,# +lsd_0_after_#, _ 
-get_adding_number,#,<+go_to_#, Z, >
  
-// 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 +lsd_1_after_#​, 0 
-go_second_1,X,>+go_to_#, O, >
  
-get_adding_number,X +// acum ar trebui să intrăm într-un mod de "​binary increment"​ al primului număr, 
-get_adding_number,X,<+// în care incrementăm tot spre stânga, fără a marca cifrele! 
 +lsd_1_after_#,​ 1 
 +increment, Z, <
  
-get_adding_number,_ +increment, 1 
-finish,_,>+increment, 0, <
  
-// go_second_0 si go_second_1 parcurge pana la al doilea numar +increment, 0 
-// retinand cat trebuie adaugat +go_to_#, 1, >
-go_second_0,​# +
-go_to_place_0,#,>+
  
-go_second_0,X +increment, _ 
-go_second_0,X,>+go_to_#, 1, >
  
-go_second_1,​# +lsd_1_after_#, _ 
-go_to_place_1,#,>+go_to_#, O, >
  
-go_second_1,​X 
-go_second_1,​X,>​ 
  
-// go_to_place_0 si go_to_place_1 parcurg al doilea numar pana +rewrite_first, 0 
-// unde am ajuns cu adunarea (cifrele deja parcurse au fost +rewrite_first, 0, <
-// 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 +rewrite_first, 1 
-go_to_place_0,1,>+rewrite_first, 1, <
  
-go_to_place_0,a +rewrite_first, Z 
-add_0,a,<+rewrite_first, 0, <
  
-go_to_place_0,b +rewrite_first, O 
-add_0,b,<+rewrite_first, 1, <
  
-go_to_place_0,_ +rewrite_first, _ 
-add_0,_,<+H, _, > 
 +</​code>​ 
 +</hidden>
  
-go_to_place_1,​0 +12. {{:​aa:​lab:​sol:​12.xlsx}}
-go_to_place_1,​0,>​+
  
-go_to_place_1,1 +<​hidden>​ 
-go_to_place_1,1,>+<​code>​ 
 +// Scrieți o Mașină Turing care primește un șir binar și lasă pe bandă,  
 +// după un caracter “#”, numărul de 0-uri, în bază 2 
 +// (e.g. “100010110” → “100010110#​101”). 
 +name: l1e12 
 +init: start 
 +accept: H, Y
  
-go_to_place_1,a +// De fiecare dată când găsim un 0, vom incrementa un contor. 
-add_1,a,<+// De data asta, ne vom folosi de soluția de la ex. 10, ca să shiftăm contorul 
 +// spre dreapta, de fiecare dată când mai trebuie adăugat un bit. 
 +// Nu putem șterge 0-urile, dar o să le marcăm temporar cu Z.
  
-go_to_place_1,b +start, 1 
-add_1,b,<+start, 1, >
  
-go_to_place_1,_ +start, 0 
-add_1,_,<+goto_counter, Z, >
  
-// go_first_number se intoarce spre dreapta la primul numar +start, Z 
-go_first_number,0 +start, Z, >
-go_first_number,0,<+
  
-go_first_number,1 +start, # 
-go_first_number,1,<+restore_0, #, <
  
-go_first_number,a +// dacă nu am găsit niciun 0, trebuie lăsat numărul "​0"​ pe bandă. 
-go_first_number,a,<+start, _ 
 +w0, #, >
  
-go_first_number,​b 
-go_first_number,​b,<​ 
  
-go_first_number,# +w0, _ 
-get_adding_number,#,<+H, 0, -
  
-// adaugam 0 la numarul curent si inlocuim numarul cu a/b pt 0/1 
-add_0,0 
-go_first_number,​a,<​ 
  
-add_0,1 +goto_counter, 0 
-go_first_number,b,<+goto_counter, 0, >
  
-add_0,# +goto_counter, 1 
-translate_right_a,#,>+goto_counter, 1, >
  
-// adaugam 1 la numarul curent si inlocuim numarul cu a/b pt 0/1 +// "​inițializăm"​ contorul prima dată când ajungem ​la sfârșit 
-add_1,0 +goto_counter, _ 
-go_first_number,b,<+goto_end, #, >
  
-add_1,1 +goto_counter, # 
-add_second_1,a,<+goto_end, #, >
  
-add_1,# 
-translate_right_b,#,>​ 
  
-add_second_1,0 +goto_end, 0 
-go_first_number,1,<+goto_end, 0, >
  
-add_second_1,1 +goto_end, 1 
-add_second_1,0,<+goto_end, 1, >
  
-add_second_1,# +goto_end, _ 
-translate_right_1,#,>+increment, _, <
  
-// 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 +increment, 0 
-translate_right_1,0,>+reset, 1, <
  
-translate_right_0,a +increment, 1 
-translate_right_a,0,>+increment, 0, <
  
-translate_right_0,b +increment, # 
-translate_right_b,0,>+start_shift, #, >
  
-translate_right_0,​_ 
-go_first_number,​0,<​ 
  
-translate_right_1,0 +start_shift, 1 
-translate_right_0,1,>+shift1, 1, >
  
-translate_right_1,1 +start_shift, 0 
-translate_right_1,1,>+shift0, 1, >
  
-translate_right_1,a +// asta se poate întâmpla doar când inițializem contorul 
-translate_right_a,1,>+start_shift, _ 
 +reset, 1, <
  
-translate_right_1,​b 
-translate_right_b,​1,>​ 
  
-translate_right_1,_ +shift1, 0 
-go_first_number,1,<+shift0, 1, >
  
-translate_right_a,0 +shift1, 1 
-translate_right_0,a,>+shift1, 1, >
  
-translate_right_a,1 +shift1, _ 
-translate_right_1,a,>+reset, 1, <
  
-translate_right_a,​a 
-translate_right_a,​a,>​ 
  
-translate_right_a,b +shift0, 0 
-translate_right_b,a,>+shift0, 0, >
  
-translate_right_a,_ +shift0, 1 
-go_first_number,a,<+shift1, 0, >
  
-translate_right_b,0 +shift0, _ 
-translate_right_0,b,>+reset, 0, <
  
-translate_right_b,​1 
-translate_right_1,​b,>​ 
  
-translate_right_b,a +reset, 0 
-translate_right_a,b,>+reset, 0, <
  
-translate_right_b,b +reset, 1 
-translate_right_b,b,>+reset, 1, <
  
-translate_right_b,_ +reset, # 
-go_first_number,b,<+reset, #, <
  
-// cand ajungem in finish trebuie sa facem clean-up la banda +reset, Z 
-// sa stergem X-uri si # +reset, Z, <
-// sa transformam a in 0 si b in 1+
  
-finish,X +reset, _ 
-finish,_,>+start, _, >
  
-finish,# 
-finish,​_,>​ 
  
-finish,1 +restore_0, Z 
-finish,1,>+restore_0, 0, <
  
-finish,0 +restore_0, 1 
-finish,0,>+restore_0, 1, <
  
-finish,a +restore_0, _ 
-finish,0,>+H, _, >
  
-finish,b 
-finish,​1,>​ 
- 
-finish,_ 
-halt,_,- 
 </​code>​ </​code>​
 +</​hidden>​
 +