Solutii Mașina Turing
1. 1.xlsx
Click to display ⇲
Click to hide ⇱
// Scrieți o Mașină Turing care primește un șir binar și verifică dacă începe // și se termină cu simboluri distincte (e.g. 100110110). //-------CONFIGURATION name: l1e1 init: q1 accept: Y, H q1, 0 mem0, 0, > q1, 1 mem1, 0, > q1, _ N, _, - mem0, 0 mem0, 0, > mem0, 1 mem0, 1, > mem0, _ expect1, _, < mem1, 0 mem1, 0, > mem1, 1 mem1, 1, > mem1, _ expect0, _, < expect0, 0 Y, 0, - expect0, 1 N, 1, - expect1, 0 N, 0, - expect1, 1 Y, 1, -
2. 2.xlsx
Click to display ⇲
Click to hide ⇱
// Rezolvați exercițiul anterior pentru input în baza 10. //-------CONFIGURATION name: l1e2 init: q1 accept: Y, H q1, 0 mem0, 0, > q1, 1 mem1, 0, > q1, 2 mem2, 0, > q1, 3 mem3, 0, > q1, 4 mem4, 0, > q1, 5 mem5, 0, > q1, 6 mem6, 0, > q1, 7 mem7, 0, > q1, 8 mem8, 0, > q1, 9 mem9, 0, > q1, _ N, _, - mem0, 0 mem0, 0, > mem0, 1 mem0, 1, > mem0, 2 mem0, 2, > mem0, 3 mem0, 3, > mem0, 4 mem0, 4, > mem0, 5 mem0, 5, > mem0, 6 mem0, 6, > mem0, 7 mem0, 7, > mem0, 8 mem0, 8, > mem0, 9 mem0, 9, > mem0, _ expectn0, _, < mem1, 0 mem1, 0, > mem1, 1 mem1, 1, > mem1, 2 mem1, 2, > mem1, 3 mem1, 3, > mem1, 4 mem1, 4, > mem1, 5 mem1, 5, > mem1, 6 mem1, 6, > mem1, 7 mem1, 7, > mem1, 8 mem1, 8, > mem1, 9 mem1, 9, > mem1, _ expectn1, _, < mem2, 0 mem2, 0, > mem2, 1 mem2, 1, > mem2, 2 mem2, 2, > mem2, 3 mem2, 3, > mem2, 4 mem2, 4, > mem2, 5 mem2, 5, > mem2, 6 mem2, 6, > mem2, 7 mem2, 7, > mem2, 8 mem2, 8, > mem2, 9 mem2, 9, > mem2, _ expectn2, _, < mem3, 0 mem3, 0, > mem3, 1 mem3, 1, > mem3, 2 mem3, 2, > mem3, 3 mem3, 3, > mem3, 4 mem3, 4, > mem3, 5 mem3, 5, > mem3, 6 mem3, 6, > mem3, 7 mem3, 7, > mem3, 8 mem3, 8, > mem3, 9 mem3, 9, > mem3, _ expectn3, _, < mem4, 0 mem4, 0, > mem4, 1 mem4, 1, > mem4, 2 mem4, 2, > mem4, 3 mem4, 3, > mem4, 4 mem4, 4, > mem4, 5 mem4, 5, > mem4, 6 mem4, 6, > mem4, 7 mem4, 7, > mem4, 8 mem4, 8, > mem4, 9 mem4, 9, > mem4, _ expectn4, _, < mem5, 0 mem5, 0, > mem5, 1 mem5, 1, > mem5, 2 mem5, 2, > mem5, 3 mem5, 3, > mem5, 4 mem5, 4, > mem5, 5 mem5, 5, > mem5, 6 mem5, 6, > mem5, 7 mem5, 7, > mem5, 8 mem5, 8, > mem5, 9 mem5, 9, > mem5, _ expectn5, _, < mem6, 0 mem6, 0, > mem6, 1 mem6, 1, > mem6, 2 mem6, 2, > mem6, 3 mem6, 3, > mem6, 4 mem6, 4, > mem6, 5 mem6, 5, > mem6, 6 mem6, 6, > mem6, 7 mem6, 7, > mem6, 8 mem6, 8, > mem6, 9 mem6, 9, > mem6, _ expectn6, _, < mem7, 0 mem7, 0, > mem7, 1 mem7, 1, > mem7, 2 mem7, 2, > mem7, 3 mem7, 3, > mem7, 4 mem7, 4, > mem7, 5 mem7, 5, > mem7, 6 mem7, 6, > mem7, 7 mem7, 7, > mem7, 8 mem7, 8, > mem7, 9 mem7, 9, > mem7, _ expectn3, _, < mem8, 0 mem8, 0, > mem8, 1 mem8, 1, > mem8, 2 mem8, 2, > mem8, 3 mem8, 3, > mem8, 4 mem8, 4, > mem8, 5 mem8, 5, > mem8, 6 mem8, 6, > mem8, 7 mem8, 7, > mem8, 8 mem8, 8, > mem8, 9 mem8, 9, > mem8, _ expectn8, _, < 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, -
3. 3.xlsx
Click to display ⇲
Click to hide ⇱
// 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 accept: H, Y start, 0 got0, _, > start, 1 find_end, _, > start, _ N, _, - find_end, 0 find_end, 0, > find_end, 1 find_end, 1, > find_end, _ delete_last, _, < delete_last, 0 reset, _, < delete_last, 1 reset, _, < // input was just "1" delete_last, _ N, _, - reset, 0 reset, 0, < reset, 1 reset, 1, < reset, _ start, _, > got0, 0 find_end, 0, > got0, 1 find_end, 1, > got0, _ Y, _, -
4. 4.xlsx
Click to display ⇲
Click to hide ⇱
// 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 accept: H, Y start, 0 start, 1, > start, 1 start, 0, > start, _ H, _, -
5. 5.xlsx
Click to display ⇲
Click to hide ⇱
// 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 start, 0 start, 0, < start, 1 start, 1, < start, _ delete, _, > delete, 0 delete, _, > delete, 1 delete, _, > delete, _ H, 1, -
6. 6.xlsx
Click to display ⇲
Click to hide ⇱
// Scrieți o Mașină Turing care inversează cuvântul primit pe bandă. name: l1e6 init: start accept: H, Y // mașina o să memoreze primul simbol, o să-l șteargă, apoi va parcuge inputul // 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, _, > start, 1 mem1, _, > start, _ H, _, > mem0, 0 mem0, 0, > mem0, 1 mem0, 1, > mem0, _ 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, _, >
7. 7.xlsx
Click to display ⇲
Click to hide ⇱
// 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 accept: H, Y // Vom folosi simbolul D pentru a marca X-uri (nu le ștergem ca să putem știi // unde începe și se termină șirul (la simboluri blank). // // 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, D start, D, > // 0 nu e o putere a lui 2. start, _ N, _, - check_if_just_one_X, D check_if_just_one_X, D, > check_if_just_one_X, _ Y, _, - check_if_just_one_X, X skip, X, - skip, X delete, X, > skip, D skip, D, > skip, _ N, _, - delete, X skip, D, > delete, D delete, D, > delete, _ reset, _, < reset, X reset, X, < reset, D reset, D, < reset, _ start, _, >
8. 8.xlsx
Click to display ⇲
Click to hide ⇱
// 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 // Whenever we find an open paranthesis, we search for a match and delete it. // 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, ), - start, ( find_), _, > start, D start, _, > start, _ Y, _, - find_), ( find_), (, > find_), D find_), D, > find_), ) reset, D, < reset, ( reset, (, < reset, ) reset, ), < reset, D reset, D, < reset, _ start, _, >
9. 9.xlsx
Click to display ⇲
Click to hide ⇱
// 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 // Ideea este să reținem în starea curentă, resturile împărțirii la 5, care sunt // 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, > r0, 1 r1, 1, > r0, _ Y, _, - r1, 0 r2, 0, > r1, 1 r3, 1, > r1, _ N, _, - r2, 0 r4, 0, > r2, 1 r0, 1, > r2, _ N, _, - r3, 0 r1, 0, > r3, 1 r2, 1, > r3, _ N, _, - r4, 0 r3, 0, > r4, 1 r4, 1, > r1, _ N, _, -
10. 10.xlsx
Click to display ⇲
Click to hide ⇱
// 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 start, 0 shift_input0, 1, > start, 1 start, 1, > start, _ H, _, - shift_input0, 0 shift_input0, 0, > shift_input0, 1 shift_input1, 0, > shift_input0, _ H, 0, - shift_input1, 0 shift_input0, 1, > shift_input1, 1 shift_input1, 1, > shift_input1, _ H, 1, -
11. 11.xlsx
Click to display ⇲
Click to hide ⇱
// 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 // E mai ușor să adunăm cel de-al doilea număr la primul, creând rezultatul // "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, > start, 1 go_to_#, 1, > start, # H, _, > go_to_#, 0 go_to_#, 0, > go_to_#, 1 go_to_#, 1, > go_to_#, Z go_to_#, Z, > go_to_#, O go_to_#, O, > go_to_#, # go_to_end, #, > go_to_end, 0 go_to_end, 0, > go_to_end, 1 go_to_end, 1, > go_to_end, _ get_lsd, _, < get_lsd, 0 lsd_0, _, < get_lsd, 1 lsd_1, _, < // n-au mai rămas cifre de prelucrat din al doilea număr get_lsd, # rewrite_first, _, < lsd_0, 0 lsd_0, 0, < lsd_0, 1 lsd_0, 1, < lsd_0, # lsd_0_after_#, #, < lsd_1, 0 lsd_1, 0, < lsd_1, 1 lsd_1, 1, < lsd_1, # lsd_1_after_#, #, < // Sărim peste cifrele "deja afectate". lsd_0_after_#, Z lsd_0_after_#, Z, < lsd_0_after_#, O lsd_0_after_#, O, < lsd_1_after_#, Z lsd_1_after_#, Z, < lsd_1_after_#, O lsd_1_after_#, O, < // marcăm o nouă cifră prelucrată din primul număr lsd_0_after_#, 0 go_to_#, Z, > lsd_0_after_#, 1 go_to_#, O, > lsd_0_after_#, _ go_to_#, Z, > lsd_1_after_#, 0 go_to_#, O, > // acum ar trebui să intrăm într-un mod de "binary increment" al primului număr, // în care incrementăm tot spre stânga, fără a marca cifrele! lsd_1_after_#, 1 increment, Z, < increment, 1 increment, 0, < increment, 0 go_to_#, 1, > increment, _ go_to_#, 1, > lsd_1_after_#, _ go_to_#, O, > rewrite_first, 0 rewrite_first, 0, < rewrite_first, 1 rewrite_first, 1, < rewrite_first, Z rewrite_first, 0, < rewrite_first, O rewrite_first, 1, < rewrite_first, _ H, _, >
12. 12.xlsx
Click to display ⇲
Click to hide ⇱
// 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 // De fiecare dată când găsim un 0, vom incrementa un contor. // 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. start, 1 start, 1, > start, 0 goto_counter, Z, > start, Z start, Z, > start, # restore_0, #, < // dacă nu am găsit niciun 0, trebuie lăsat numărul "0" pe bandă. start, _ w0, #, > w0, _ H, 0, - goto_counter, 0 goto_counter, 0, > goto_counter, 1 goto_counter, 1, > // "inițializăm" contorul prima dată când ajungem la sfârșit goto_counter, _ goto_end, #, > goto_counter, # goto_end, #, > goto_end, 0 goto_end, 0, > goto_end, 1 goto_end, 1, > goto_end, _ increment, _, < increment, 0 reset, 1, < increment, 1 increment, 0, < increment, # start_shift, #, > start_shift, 1 shift1, 1, > start_shift, 0 shift0, 1, > // asta se poate întâmpla doar când inițializem contorul start_shift, _ reset, 1, < shift1, 0 shift0, 1, > shift1, 1 shift1, 1, > shift1, _ reset, 1, < shift0, 0 shift0, 0, > shift0, 1 shift1, 0, > shift0, _ reset, 0, < reset, 0 reset, 0, < reset, 1 reset, 1, < reset, # reset, #, < reset, Z reset, Z, < reset, _ start, _, > restore_0, Z restore_0, 0, < restore_0, 1 restore_0, 1, < restore_0, _ H, _, >