Differences
This shows you the differences between two versions of the page.
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> | ||
+ |