This is an old revision of the document!


Solutii Mașina Turing

Exerciții basic

1. Soluție: Excel.

name: ex1
init: start
accept: H, Y

//starea de start este bineînțeles "start"
//folosind stările "expect0" si "expect1", practic "ținem in memorie" primul număr din șir
//stările "found0?" si "found1?" verifică dacă ultima cifră este aceeași cu prima.

start,0
expect0,0,>

start,1
expect1,1,>

start,_
N,_,-

expect0,0
expect0,0,>

expect0,1
expect0,1,>

expect0,_
found0?,_,<

found0?,0
Y,0,-

found0?,1
N,1,-

found0?,_
N,_,-

expect1,0
expect1,0,>

expect1,1
expect1,1,>

expect1,_
found1?,_,<

found1?,0
N,0,-

found1?,1
Y,1,-

found1?,_
N,_,-

2. Soluție Excel.

name: ex2
init: start
accept: H, Y

//Strategie: ștergem prima cifra, mergem până la final, ștergem a doua cifră
//Stările de tipul "FindLastX", șterg prima cifră, si merg până dau de "_".
//Stările de tipul "EraseLastX", șterg ultima cifră, apoi dau reset.
//Dacă o stare de tipul "EraseLastX" descoperă tot _, înseamnă ca starea "FindLastX" a șters ultima cifră.
//Deci șirul are un număr impar de cifre. iar, in funcție de valoarea lui X vedem dacă se află un 0 sau un 1 la mijloc.

start,0
FindLast0,_,>

start,1
FindLast1,_,>

start,_
N,_,-

FindLast0,0
FindLast0,0,>

FindLast0,1
FindLast0,1,>

FindLast0,_
EraseLast0,_,<

EraseLast0,0
Reset,_,<

EraseLast0,1
Reset,_,<

EraseLast0,_
Y,_,-

FindLast1,0
FindLast1,0,>

FindLast1,1
FindLast1,1,>

FindLast1,_
EraseLast1,_,<

EraseLast1,0
Reset,_,<

EraseLast1,1
Reset,_,<

EraseLast1,_
N,_,-

Reset,0
Reset,0,<

Reset,1
Reset,1,<

Reset,_
start,_,>


3. Soluție Excel.

name: ex3
init: start
accept: H, Y

//parcurgem șirul, înlocuind 0 cu 1 si 1 cu 0. Trivial nu-i așa? (:
start,0
start,1,>

start,1
start,0,>

start,_
H,_,-


4. Soluție Excel.

name: ex4
init: cleanRight
accept: H, Y

//Strategie: ștergem la stânga până dăm de "_", apoi ne întoarcem până dăm de 0 sau 1.
//După ștergem la dreapta până dam de "_" si atunci scriem "1".

cleanRight,0
cleanRight,_,<

cleanRight,1
cleanRight,_,<

cleanRight,_
Reset,_,>

Reset,0
cleanLeft,_,>

Reset,1
cleanLeft,_,>

Reset,_
Reset,_,>

cleanLeft,0
cleanLeft,_,>

cleanLeft,1
cleanLeft,_,>

cleanLeft,_
Y,1,-

5. Soluție Excel.

name: ex5
init: addXatEnd
accept: H, Y

//Strategie: Primul pas adăugăm un X la final.
//Pasul 2: Ne uităm la ultima cifră ce nu e X, o înlocuim cu un X, o adăugăm la capătul șirului nou format.
//La final ștergem toți X.

addXatEnd,0
addXatEnd,0,>

addXatEnd,1
addXatEnd,1,>

addXatEnd,_
readFirstX,X,<

addXatEnd,X
N,X,-

readLastX,0
readLastX,0,<

readLastX,1
readLastX,1,<

readLastX,_
stergeX,_,>

readLastX,X
readFirstX,X,<

readFirstX,0
keep0,X,>

readFirstX,1
keep1,X,>

readFirstX,_
stergeX,_,>

readFirstX,X
readFirstX,X,<

keep0,0
keep0,0,>

keep0,1
keep0,1,>

keep0,_
readLastX,0,<

keep0,X
keep0,X,>

keep1,0
keep1,0,>

keep1,1
keep1,1,>

keep1,_
readLastX,1,<

keep1,X
keep1,X,>

stergeX,0
stergeX,0,<

stergeX,1
stergeX,1,<

stergeX,_
Y,_,-

stergeX,X
stergeX,_,>

name: machine
init: addXatEnd
accept: H, Y

addXatEnd,0
addXatEnd,0,>

addXatEnd,1
addXatEnd,1,>

addXatEnd,_
readFirstX,X,<

addXatEnd,X
N,X,-

readLastX,0
readLastX,0,<

readLastX,1
readLastX,1,<

readLastX,_
stergeX,_,>

readLastX,X
readFirstX,X,<

readFirstX,0
keep0,X,>

readFirstX,1
keep1,X,>

readFirstX,_
stergeX,_,>

readFirstX,X
readFirstX,X,<

keep0,0
keep0,0,>

keep0,1
keep0,1,>

keep0,_
readLastX,0,<

keep0,X
keep0,X,>

keep1,0
keep1,0,>

keep1,1
keep1,1,>

keep1,_
readLastX,1,<

keep1,X
keep1,X,>

stergeX,0
stergeX,0,<

stergeX,1
stergeX,1,<

stergeX,_
Y,_,-

stergeX,X
stergeX,_,>

Exerciții fun

6. Soluție Excel.

name: ex6
init: start
accept: H, Y

//Strategie: Pentru fiecare doua caractere de "M", adăugăm un caracter de "A" la final.
//Apoi, pentru fiecare doua caractere de "A", adăugăm un M, and so on, pana rămânem cu doar 2 caractere pe banda.

start,M
findOneMoreM,_,>

start,_
N,_,-

start,A
findOneMoreA,_,>

findOneMoreM,M
checkIfEmptyM,_,>

findOneMoreM,_
N,_,-

findOneMoreM,A
N,_,-

AddAnA,M
AddAnA,M,>

AddAnA,_
reset,A,<

AddAnA,A
AddAnA,A,>

reset,M
reset,M,<

reset,_
start,_,>

reset,A
reset,A,<

findOneMoreA,M
N,_,-

findOneMoreA,_
N,_,-

findOneMoreA,A
checkIfEmptyA,_,>

AddAnM,M
AddAnM,M,>

AddAnM,_
reset,M,<

AddAnM,A
AddAnM,A,>

checkIfEmptyM,M
AddAnA,M,>

checkIfEmptyM,_
Y,_,-

checkIfEmptyM,A
AddAnA,A,>

checkIfEmptyA,M
AddAnM,M,>

checkIfEmptyA,_
Y,_,-

checkIfEmptyA,A
AddAnM,A,>

7. Soluție Excel.

name: ex7
init: start
accept: H, Y

//Strategie: căutăm ultima paranteza deschisa "(", îi căutăm pereche și le marcăm pe ambele cu X
//Daca la final rămân doar X-uri pe banda înseamnă ca șirul este echilibrat.

start,(
start,(,>

start,)
start,),>

start,X
N,X,-

start,_
FindLast(,_,<

FindLast(,(
FindPereche,X,>

FindLast(,)
FindLast(,),<

FindLast(,X
FindLast(,X,<

FindLast(,_
clearX,_,>

FindPereche,(
N,(,-

FindPereche,)
FindLast(,X,<

FindPereche,X
FindPereche,X,>

FindPereche,_
N,_,-

clearX,(
N,(,-

clearX,)
N,),-

clearX,X
clearX,_,>

clearX,_
Y,_,-

8. Soluție Excel.

name: ex8
init: start
accept: H, Y

//Strategie: Parcurgem șirul, când găsim un M, schimbăm simbolul din dreapta cu X, mutând toate caracterele o poziție la dreapta,
//ținem minte fiecare caracter abia schimbat cu ajutorul stărilor,
//apoi ne întoarcem, înlocuim X cu L si căutăm următorul M.

start,M
startShift,M,>

start,L
start,L,>

start,X
N,X,-

start,_
Y,_,-

startShift,M
keepM,X,>

startShift,L
keepL,X,>

startShift,X
N,X,-

startShift,_
Y,L,-

keepM,M
keepM,M,>

keepM,L
keepL,M,>

keepM,X
N,X,-

keepM,_
reset,M,<

keepL,M
keepM,L,>

keepL,L
keepL,L,>

keepL,X
N,X,-

keepL,_
reset,L,<

reset,M
reset,M,<

reset,L
reset,L,<

reset,X
start,L,>

reset,_
Y,_,-

9. Soluție Excel.

name: ex9
init: start
accept: H, Y

//Strategie: Primul pas, Johnny retine numărul 0, adică adăugăm un 0 la stânga lui J.
//După parcurgem șirul căutând banane. Când am găsit o banană mergem la stânga lui Johnny și facem un binary increment, exact ca în //exemplul introductiv.
//La final îl mutam pe Johnny și pe numărul din mintea sa la dreapta șirului.

start,0
add0,0,<

start,1
add0,1,<

start,_
Y,0,-

start,J
add0,J,<

start,X
N,_,-

start,B
add0,B,<

start,M
add0,M,<

findB,0
findB,0,>

findB,1
findB,1,>

findB,_
moveNrLast,J,<

findB,J
findB,J,>

findB,X
findB,X,>

findB,B
goBI,X,<

findB,M
findB,M,>

goBI,0
goBI,0,<

goBI,1
goBI,1,<

goBI,_
N,_,-

goBI,J
doBI,J,<

goBI,X
goBI,X,<

goBI,B
goBI,B,<

goBI,M
goBI,M,<

add0,0
N,_,-

add0,1
N,_,-

add0,_
findB,0,>

add0,J
N,_,-

add0,X
N,_,-

add0,B
N,_,-

add0,M
N,_,-

doBI,0
gotoJ,1,>

doBI,1
doBI,0,<

doBI,_
gotoJ,1,>

doBI,J
N,_,-

doBI,X
N,_,-

doBI,B
N,_,-

doBI,M
N,_,-

gotoJ,0
gotoJ,0,>

gotoJ,1
gotoJ,1,>

gotoJ,_
N,_,-

gotoJ,J
findB,J,>

gotoJ,X
gotoJ,X,>

gotoJ,B
N,_,-

gotoJ,M
N,_,-

moveNrLast,0
moveNrLast,0,<

moveNrLast,1
moveNrLast,1,<

moveNrLast,_
goBack,_,>

moveNrLast,J
moveNrLast,J,<

moveNrLast,X
moveNrLast,B,<

moveNrLast,B
moveNrLast,B,<

moveNrLast,M
moveNrLast,M,<

goBack,0
keep0,_,>

goBack,1
keep1,_,>

goBack,_
N,_,-

goBack,J
Y,_,-

goBack,X
N,_,-

goBack,B
N,_,-

goBack,M
N,_,-

keep0,0
keep0,0,>

keep0,1
keep0,1,>

keep0,_
N,_,-

keep0,J
keep02,J,>

keep0,X
N,_,-

keep0,B
keep0,B,>

keep0,M
keep0,M,>

keep1,0
keep1,0,>

keep1,1
keep1,1,>

keep1,_
N,_,-

keep1,J
keep12,J,>

keep1,X
N,_,-

keep1,B
keep1,B,>

keep1,M
keep1,M,>

put0,0
put0,0,>

put0,1
put0,1,>

put0,_
moveNrLast,0,<

put0,J
N,_,-

put0,X
N,_,-

put0,B
put0,B,>

put0,M
put0,M,>

put1,0
put1,0,>

put1,1
put1,1,>

put1,_
moveNrLast,1,<

put1,J
N,_,-

put1,X
N,_,-

put1,B
put1,B,>

put1,M
put1,M,>

keep02,0
keep02,0,>

keep02,1
keep02,1,>

keep02,_
N,_,-

keep02,J
put0,J,>

keep02,X
N,_,-

keep02,B
keep02,B,>

keep02,M
keep02,M,>

keep12,0
keep12,0,>

keep12,1
keep12,1,>

keep12,_
N,_,-

keep12,J
put1,J,>

keep12,X
N,_,-

keep12,B
keep12,B,>

keep12,M
keep12,M,>

Exerciții tryhard

10. Soluție Excel.

name: ex10
init: q1
accept: halt

// q1 parcurge primul numar
// pana la separatorul dintre numere
q1,0
q1,0,>

q1,1
q1,1,>

q1,#
get_adding_number,#,<

// get_adding_number ia urmatorul digit din primul numar
// pentru a-l adauga la al doilea numar, si il inlocuieste cu
// un X (care inseamna ca am folosit digit-ul)
get_adding_number,0
go_second_0,X,>

get_adding_number,1
go_second_1,X,>

get_adding_number,X
get_adding_number,X,<

get_adding_number,_
finish,_,>

// go_second_0 si go_second_1 parcurge pana la al doilea numar
// retinand cat trebuie adaugat
go_second_0,#
go_to_place_0,#,>

go_second_0,X
go_second_0,X,>

go_second_1,#
go_to_place_1,#,>

go_second_1,X
go_second_1,X,>

// go_to_place_0 si go_to_place_1 parcurg al doilea numar pana
// unde am ajuns cu adunarea (cifrele deja parcurse au fost
// inlocuite cu a si b in loc de 0 si 1)
go_to_place_0,0
go_to_place_0,0,>

go_to_place_0,1
go_to_place_0,1,>

go_to_place_0,a
add_0,a,<

go_to_place_0,b
add_0,b,<

go_to_place_0,_
add_0,_,<

go_to_place_1,0
go_to_place_1,0,>

go_to_place_1,1
go_to_place_1,1,>

go_to_place_1,a
add_1,a,<

go_to_place_1,b
add_1,b,<

go_to_place_1,_
add_1,_,<

// go_first_number se intoarce spre dreapta la primul numar
go_first_number,0
go_first_number,0,<

go_first_number,1
go_first_number,1,<

go_first_number,a
go_first_number,a,<

go_first_number,b
go_first_number,b,<

go_first_number,#
get_adding_number,#,<

// adaugam 0 la numarul curent si inlocuim numarul cu a/b pt 0/1
add_0,0
go_first_number,a,<

add_0,1
go_first_number,b,<

add_0,#
translate_right_a,#,>

// adaugam 1 la numarul curent si inlocuim numarul cu a/b pt 0/1
add_1,0
go_first_number,b,<

add_1,1
add_second_1,a,<

add_1,#
translate_right_b,#,>

add_second_1,0
go_first_number,1,<

add_second_1,1
add_second_1,0,<

add_second_1,#
translate_right_1,#,>

// functii pentru translatarea la dreapta a celui de-al doilea numar,
// unde caracterele posibile pot fi 0,1,a,b
translate_right_0,0
translate_right_0,0,>

translate_right_0,1
translate_right_1,0,>

translate_right_0,a
translate_right_a,0,>

translate_right_0,b
translate_right_b,0,>

translate_right_0,_
go_first_number,0,<

translate_right_1,0
translate_right_0,1,>

translate_right_1,1
translate_right_1,1,>

translate_right_1,a
translate_right_a,1,>

translate_right_1,b
translate_right_b,1,>

translate_right_1,_
go_first_number,1,<

translate_right_a,0
translate_right_0,a,>

translate_right_a,1
translate_right_1,a,>

translate_right_a,a
translate_right_a,a,>

translate_right_a,b
translate_right_b,a,>

translate_right_a,_
go_first_number,a,<

translate_right_b,0
translate_right_0,b,>

translate_right_b,1
translate_right_1,b,>

translate_right_b,a
translate_right_a,b,>

translate_right_b,b
translate_right_b,b,>

translate_right_b,_
go_first_number,b,<

// cand ajungem in finish trebuie sa facem clean-up la banda
// sa stergem X-uri si #
// sa transformam a in 0 si b in 1

finish,X
finish,_,>

finish,#
finish,_,>

finish,1
finish,1,>

finish,0
finish,0,>

finish,a
finish,0,>

finish,b
finish,1,>

finish,_
halt,_,-