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,>+mem10, >
  
-start,_ +q1, _ 
-N,_,-+N, _, -
  
-expect0,0 
-expect0,​0,>​ 
  
-expect0,1 +mem00 
-expect0,1,>+mem00, >
  
-expect0,_ +mem01 
-found0?,_,<+mem01>
  
-found0?,0 +mem0_ 
-Y,0,-+expect1_<
  
-found0?,1 
-N,1,- 
  
-found0?,_ +mem10 
-N,_,-+mem10>
  
-expect1,0 +mem11 
-expect1,0,>+mem11, >
  
-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 "​_"​. +namel1e2 
-//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: YH
-//Deci șirul are un număr impar de cifre. iarin funcție de valoarea lui X vedem dacă se află un 0 sau un 1 la mijloc.+
  
-start,0 +q1, 0 
-FindLast0,_,>+mem00, >
  
-start,1 +q1, 1 
-FindLast1,_,>+mem10, >
  
-start,_ +q12 
-N,_,-+mem20>
  
-FindLast0,0 +q13 
-FindLast0,0,>+mem3, 0, >
  
-FindLast0,1 +q14 
-FindLast0,1,>+mem40, >
  
-FindLast0,_ +q15 
-EraseLast0,_,<+mem50>
  
-EraseLast0,0 +q16 
-Reset,_,<+mem60>
  
-EraseLast0,1 +q17 
-Reset,_,<+mem70>
  
-EraseLast0,_ +q18 
-Y,_,-+mem80>
  
-FindLast1,0 +q19 
-FindLast1,0,>+mem9, 0, >
  
-FindLast1,1 +q1_ 
-FindLast1,1,>+N_-
  
-FindLast1,_ 
-EraseLast1,​_,<​ 
  
-EraseLast1,0 +mem0, 0 
-Reset,_,<+mem00>
  
-EraseLast1,1 +mem0, 1 
-Reset,_,<+mem01>
  
-EraseLast1,_ +mem02 
-N,_,-+mem02>
  
-Reset,0 +mem03 
-Reset,0,<+mem03>
  
-Reset,1 +mem04 
-Reset,1,<+mem04>
  
-Reset,_ +mem05 
-start,_,>+mem05, >
  
 +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,+expectn0_<
-start,1,>+
  
-start,1 
-start,​0,>​ 
  
-start,_ +mem10 
-H,_,-+mem10>
  
 +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, 
-<​code>​ +mem14, >
-name: ex4 +
-init: cleanRight +
-accept: HY+
  
-//​Strategie:​ ștergem la stânga până dăm de "​_"​apoi ne întoarcem până dăm de 0 sau 1. +mem15 
-//După ștergem la dreapta până dam de "​_"​ si atunci scriem "​1"​.+mem1, 5, >
  
-cleanRight,0 +mem16 
-cleanRight,_,<+mem16>
  
-cleanRight,1 +mem17 
-cleanRight,_,<+mem17>
  
-cleanRight,_ +mem18 
-Reset,_,>+mem18, >
  
-Reset,0 +mem19 
-cleanLeft,_,>+mem19, >
  
-Reset,1 +mem1_ 
-cleanLeft,_,>+expectn1, _, <
  
-Reset,_ 
-Reset,​_,>​ 
  
-cleanLeft,0 +mem2, 0 
-cleanLeft,_,>+mem20, >
  
-cleanLeft,1 +mem2, 1 
-cleanLeft,_,>+mem21, >
  
-cleanLeft,_ +mem22 
-Y,1,-+mem22>
  
 +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, 
-<​code>​ +mem25, >
-name: ex5 +
-init: addXatEnd +
-accept: HY+
  
-//​Strategie:​ Primul pas adăugăm un X la final. +mem2, 6 
-//Pasul 2: Ne uităm la ultima cifră ce nu e Xo înlocuim cu un Xo adăugăm la capătul șirului nou format. +mem26>
-//La final ștergem toți X.+
  
-addXatEnd,0 +mem27 
-addXatEnd,0,>+mem27, >
  
-addXatEnd,1 +mem28 
-addXatEnd,1,>+mem28, >
  
-addXatEnd,_ +mem29 
-readFirstX,X,<+mem29>
  
-addXatEnd,X +mem2_ 
-N,X,-+expectn2_<
  
-readLastX,0 
-readLastX,​0,<​ 
  
-readLastX,1 +mem30 
-readLastX,1,<+mem30>
  
-readLastX,_ +mem31 
-stergeX,_,>+mem31, >
  
-readLastX,X +mem32 
-readFirstX,X,<+mem32>
  
-readFirstX,0 +mem33 
-keep0,X,>+mem33, >
  
-readFirstX,1 +mem34 
-keep1,X,>+mem34, >
  
-readFirstX,_ +mem35 
-stergeX,_,>+mem35, >
  
-readFirstX,X +mem36 
-readFirstX,X,<+mem36>
  
-keep0,0 +mem37 
-keep0,0,>+mem37, >
  
-keep0,1 +mem38 
-keep0,1,>+mem38, >
  
-keep0,_ +mem39 
-readLastX,0,<+mem39>
  
-keep0,X +mem3_ 
-keep0,X,>+expectn3_<
  
-keep1,0 
-keep1,​0,>​ 
  
-keep1,1 +mem40 
-keep1,1,>+mem40, >
  
-keep1,_ +mem41 
-readLastX,1,<+mem4, 1, >
  
-keep1,X +mem42 
-keep1,X,>+mem42, >
  
-stergeX,0 +mem43 
-stergeX,0,<+mem43>
  
-stergeX,1 +mem44 
-stergeX,1,<+mem44>
  
-stergeX,_ +mem45 
-Y,_,-+mem45>
  
-stergeX,X +mem46 
-stergeX,_,>+mem46, >
  
-name: machine +mem4, 7 
-init: addXatEnd +mem4, 7>
-accept: HY+
  
-addXatEnd,0 +mem48 
-addXatEnd,0,>+mem48, >
  
-addXatEnd,1 +mem49 
-addXatEnd,1,>+mem49, >
  
-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,_ +mem52 
-stergeX,_,>+mem52, >
  
-readLastX,X +mem53 
-readFirstX,X,<+mem53>
  
-readFirstX,0 +mem54 
-keep0,X,>+mem54, >
  
-readFirstX,1 +mem55 
-keep1,X,>+mem55, >
  
-readFirstX,_ +mem56 
-stergeX,_,>+mem56, >
  
-readFirstX,X +mem57 
-readFirstX,X,<+mem57>
  
-keep0,0 +mem58 
-keep0,0,>+mem58, >
  
-keep0,1 +mem59 
-keep0,1,>+mem59, >
  
-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,_ +mem62 
-readLastX,1,<+mem62>
  
-keep1,X +mem63 
-keep1,X,>+mem63, >
  
-stergeX,0 +mem64 
-stergeX,0,<+mem64>
  
-stergeX,1 +mem65 
-stergeX,1,<+mem65>
  
-stergeX,_ +mem66 
-Y,_,-+mem66>
  
-stergeX,X +mem67 
-stergeX,_,>+mem67, >
  
 +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 +mem70 
-findOneMoreM,_,>+mem70, >
  
-start,_ +mem71 
-N,_,-+mem71>
  
-start,A +mem72 
-findOneMoreA,_,>+mem72, >
  
-findOneMoreM,M +mem73 
-checkIfEmptyM,_,>+mem73, >
  
-findOneMoreM,_ +mem74 
-N,_,-+mem74>
  
-findOneMoreM,A +mem75 
-N,_,-+mem75>
  
-AddAnA,M +mem76 
-AddAnA,M,>+mem76, >
  
-AddAnA,_ +mem77 
-reset,A,<+mem77>
  
-AddAnA,A +mem78 
-AddAnA,A,>+mem78, >
  
-reset,M +mem79 
-reset,M,<+mem79>
  
-reset,_ +mem7, _ 
-start,_,>+expectn3, _, <
  
-reset,A 
-reset,​A,<​ 
  
-findOneMoreA,M +mem80 
-N,_,-+mem80>
  
-findOneMoreA,_ +mem81 
-N,_,-+mem81>
  
-findOneMoreA,A +mem82 
-checkIfEmptyA,_,>+mem82, >
  
-AddAnM,M +mem83 
-AddAnM,M,>+mem83, >
  
-AddAnM,_ +mem84 
-reset,M,<+mem84>
  
-AddAnM,A +mem85 
-AddAnM,A,>+mem85, >
  
-checkIfEmptyM,M +mem86 
-AddAnA,M,>+mem86, >
  
-checkIfEmptyM,_ +mem87 
-Y,_,-+mem87>
  
-checkIfEmptyM,A +mem88 
-AddAnA,A,>+mem88, >
  
-checkIfEmptyA,M +mem89 
-AddAnM,M,>+mem89, >
  
-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 +start0 
-//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_end0 
-FindLast(,_,<+find_end0>
  
-FindLast(,( +find_end1 
-FindPereche,X,>+find_end1, >
  
-FindLast(,) +find_end_ 
-FindLast(,),<+delete_last_, <
  
-FindLast(,X 
-FindLast(,​X,<​ 
  
-FindLast(,_ +delete_last0 
-clearX,_,>+reset, _, <
  
-FindPereche,( +delete_last1 
-N,(,-+reset_<
  
-FindPereche,) +// input was just "​1"​ 
-FindLast(,X,<+delete_last_ 
 +N_-
  
-FindPereche,​X 
-FindPereche,​X,>​ 
  
-FindPereche,_ +reset0 
-N,_,-+reset0<
  
-clearX,( +reset1 
-N,(,-+reset1<
  
-clearX,) +reset_ 
-N,),-+start_>
  
-clearX,X 
-clearX,​_,>​ 
  
-clearX,_ +got00 
-Y,_,-+find_end0>
  
 +got0, 1
 +find_end, 1, >
  
 +got0, _
 +Y, _, -
 </​code>​ </​code>​
 +</​hidden>​
  
-8Soluț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+start0 
-//ținem minte fiecare caracter abia schimbat cu ajutorul stărilor, +start1>
-//apoi ne întoarcemînlocuim X cu L si căutăm următorul M.+
  
-start,M +start, ​1 
-startShift,M,>+start0, >
  
-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: HY
  
-startShift,M +start0 
-keepM,X,>+start0<
  
-startShift,L +start1 
-keepL,X,>+start1<
  
-startShift,X +start_ 
-N,X,-+delete_>
  
-startShift,​_ 
-Y,L,- 
  
-keepM,M +delete0 
-keepM,M,>+delete_, >
  
-keepM,L +delete1 
-keepL,M,>+delete_, >
  
-keepM,X +delete_ 
-N,X,-+H1, - 
 +</​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 simbolo 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 +start1 
-N,X,-+mem1_>
  
-keepL,_ +start, _ 
-reset,L,<+H_>
  
-reset,M 
-reset,​M,<​ 
  
-reset,L +mem00 
-reset,L,<+mem00>
  
-reset,X +mem01 
-start,L,>+mem01, >
  
-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 nrimpar 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,<+startD>
  
-start,1 +// 0 nu e o putere a lui 2. 
-add0,1,<+start, ​_ 
 +N_-
  
-start,_ 
-Y,0,- 
  
-start,J +check_if_just_one_XD 
-add0,J,<+check_if_just_one_XD>
  
-start,X +check_if_just_one_X_ 
-N,_,-+Y, _, -
  
-start,B +check_if_just_one_XX 
-add0,B,<+skipX-
  
-start,M 
-add0,M,< 
  
-findB,0 +skipX 
-findB,0,>+deleteX, >
  
-findB,1 +skipD 
-findB,1,>+skipD, >
  
-findB,_ +skip, _ 
-moveNrLast,J,<+N_-
  
-findB,J 
-findB,​J,>​ 
  
-findB,X +delete, X 
-findB,X,>+skipD, >
  
-findB,B +deleteD 
-goBI,X,<+deleteD>
  
-findB,M +delete_ 
-findB,M,>+reset_<
  
-goBI,0 
-goBI,0,< 
  
-goBI,1 +resetX 
-goBI,1,<+resetX, <
  
-goBI,_ +resetD 
-N,_,-+resetD<
  
-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: HY
  
-goBI,M 
-goBI,M,< 
  
-add0,0 +// Whenever we find an open paranthesiswe 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,_ +startD 
-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,>+resetD<
  
-doBI,1 
-doBI,0,< 
  
-doBI,_ +reset( 
-gotoJ,1,>+reset(<
  
-doBI,J +reset) 
-N,_,-+reset)<
  
-doBI,X +resetD 
-N,_,-+resetD<
  
-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 timpam 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,_ +r01 
-N,_,-+r11>
  
-gotoJ,J +r0_ 
-findB,J,>+Y_-
  
-gotoJ,X 
-gotoJ,​X,>​ 
  
-gotoJ,B +r10 
-N,_,-+r20>
  
-gotoJ,M +r11 
-N,_,-+r31>
  
-moveNrLast,0 +r1_ 
-moveNrLast,0,<+N_-
  
-moveNrLast,​1 
-moveNrLast,​1,<​ 
  
-moveNrLast,_ +r20 
-goBack,_,>+r40, >
  
-moveNrLast,J +r21 
-moveNrLast,J,<+r01>
  
-moveNrLast,X +r2_ 
-moveNrLast,B,<+N_-
  
-moveNrLast,​B 
-moveNrLast,​B,<​ 
  
-moveNrLast,M +r30 
-moveNrLast,M,<+r10>
  
-goBack,0 +r31 
-keep0,_,>+r21, >
  
-goBack,1 +r3_ 
-keep1,_,>+N, _, -
  
-goBack,_ 
-N,_,- 
  
-goBack,J +r40 
-Y,_,-+r30>
  
-goBack,X +r41 
-N,_,-+r41>
  
-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 binargă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: HY
  
-keep0,1 +start0 
-keep0,1,>+shift_input0, 1, >
  
-keep0,_ +start1 
-N,_,-+start1>
  
-keep0,J +start_ 
-keep02,J,>+H_-
  
-keep0,X 
-N,_,- 
  
-keep0,B +shift_input00 
-keep0,B,>+shift_input00, >
  
-keep0,M +shift_input01 
-keep0,M,>+shift_input10, >
  
-keep1,0 +shift_input0_ 
-keep1,0,>+H, 0, -
  
-keep1,1 
-keep1,​1,>​ 
  
-keep1,_ +shift_input10 
-N,_,-+shift_input01>
  
-keep1,J +shift_input11 
-keep12,J,>+shift_input11, >
  
-keep1,X +shift_input1_ 
-N,_,-+H1, - 
 +</​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 2big-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_end0 
-N,_,-+go_to_end0>
  
-put1,X +go_to_end1 
-N,_,-+go_to_end1>
  
-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_00 
-N,_,-+lsd_00<
  
-keep02,B +lsd_01 
-keep02,B,>+lsd_01<
  
-keep02,M +lsd_0# 
-keep02,M,>+lsd_0_after_#​#<
  
-keep12,0 
-keep12,​0,>​ 
  
-keep12,1 +lsd_10 
-keep12,1,>+lsd_10<
  
-keep12,_ +lsd_11 
-N,_,-+lsd_11<
  
-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ângafără a marca cifrele! 
 +lsd_1_after_#,​ 1 
 +increment, Z, <
  
-get_adding_number,_ +increment1 
-finish,_,>+increment0<
  
-// 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_firstZ 
-add_0,a,<+rewrite_first0, <
  
-go_to_place_0,b +rewrite_firstO 
-add_0,b,<+rewrite_first1, <
  
-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 0vom incrementa un contor. 
-add_1,a,<+// De data astane vom folosi de soluția de la ex. 10ca 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 +start1 
-add_1,b,<+start1>
  
-go_to_place_1,_ +start0 
-add_1,_,<+goto_counterZ>
  
-// go_first_number se intoarce spre dreapta la primul numar +startZ 
-go_first_number,0 +startZ>
-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 0trebuie 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,#,<+H0-
  
-// 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_counter0 
-go_first_number,b,<+goto_counter0>
  
-add_0,# +goto_counter1 
-translate_right_a,#,>+goto_counter1, >
  
-// 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_end0>
  
-add_second_1,1 +goto_end, 1 
-add_second_1,0,<+goto_end1>
  
-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 +increment0 
-translate_right_1,0,>+reset1<
  
-translate_right_0,a +increment1 
-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_shift1 
-translate_right_0,1,>+shift1, 1, >
  
-translate_right_1,1 +start_shift0 
-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,_ +shift10 
-go_first_number,1,<+shift0, 1, >
  
-translate_right_a,0 +shift11 
-translate_right_0,a,>+shift11, >
  
-translate_right_a,1 +shift1_ 
-translate_right_1,a,>+reset1<
  
-translate_right_a,​a 
-translate_right_a,​a,>​ 
  
-translate_right_a,b +shift00 
-translate_right_b,a,>+shift00, >
  
-translate_right_a,_ +shift01 
-go_first_number,a,<+shift10>
  
-translate_right_b,0 +shift0_ 
-translate_right_0,b,>+reset0<
  
-translate_right_b,​1 
-translate_right_1,​b,>​ 
  
-translate_right_b,a +reset0 
-translate_right_a,b,>+reset0<
  
-translate_right_b,b +reset1 
-translate_right_b,b,>+reset1<
  
-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_0Z 
-finish,1,>+restore_00<
  
-finish,0 +restore_01 
-finish,0,>+restore_01<
  
-finish,a +restore_0_ 
-finish,0,>+H_, >
  
-finish,b 
-finish,​1,>​ 
- 
-finish,_ 
-halt,_,- 
 </​code>​ </​code>​
 +</​hidden>​
 +