start     Articole     Despre mine     Contact     Cursul ABCprog    

Calculatorul ne face mai prosti?

Nu mai stim sa extragem radacina patrata dintr-un numar (caci avem Calculator), nu mai stim sa scriem de mana (caci avem Word), nu mai stim sa comunicam fata in fata (caci avem Facebook).

Sarcini care pana acum ceva vreme erau rezervate exclusiv omului au ajuns task-uri banale pentru un calculator. Asa ca nu ma mira cum de multa lume se intreaba daca nu cumva calculatorul ne face mai prosti.

E legitim sa crezi ca abilitatile intelectuale ale omului vor avea de suferit ca urmare a incetarii antrenarii lor. La fel cum un muschi se atrofiaza in timp daca nu este folosit.

Dar nu cumva sarcinile “intelectuale” pe care ni le-au preluat calculatoarele sunt doar sarcini de rutina, care ne limitau la un univers marunt? Nu cumva calculatoarele ne-au eliberat de poveri sacaitoare, oferindu-ne libertatea de a ne antrena “muschi” intelectuali pe care nici nu stiam ca ii aveam?

 

Acum ceva vreme am primit o problema simpatica: Avand la dispozitie numerele 1, 3, 4, si 6 si oricare 4 operatii algebrice de baza (+, -, *, /) sa le combin astfel incat sa obtin ca rezultat valoarea 24.

Am memorat problema cu gandul ca voi sta sa ma gandesc la o solutie cand voi avea timp. Pana atunci, insa, nu am putut sa nu realizez ca in cel mai rau caz va trebui sa incerc toate combinatiile posibile, ceea ce e un numar foarte mare.

Da? Cat de mare? Si uita asa am inceput sa ma gandesc cum as putea sa modelez problema intr- o maniera completa, simpla si fara ambiguitati — asa incat s-o pot da unui calculator s-o rezolve.

Cu alte cuvinte: “Esti suficient de destept cat sa rezolvi problema asta?”; “Poate ca nu, dar stiu sa comand un calculator s-o rezolve. Se pune? :)”.

 

Tu ce parere ai? (Lasa-mi intr-un comentariu raspunsul.)

 

In continuare voi discuta modul in care am rezolvat problema. De fapt, modul in care am pus calculatorul la munca in locul meu.

(Nu e atat de importanta problema propriu-zisa, cat mesajul pe care vreau sa il transmit, si anume acela ca ne limitam enorm daca privim calculatorul doar ca pe o unealta de consum (de muzica, filme, poze si jocuri), neluand in considerare faptul ca el este in realitate un foarte puternic instrument de creatie.)

Buuun! Deci vreau sa verific toate variantele posibile… Cum fac?…

Imi trebuie o codare a tuturor solutiilor posibile.

E clar ca solutia va fi ceva de genul: D1 o1 D2 o2 D3 o3 D4 = 24, unde D1, D2, D3 si D4 sunt cele 4 numere (adica fiecare poate fi 1, 3, 4 sau 6), iar o1, o2, o3 pot fi oricare dintre cele 4 operatii aritmetice de baza (+, -, *, /).

Nu e specificat in problema, dar intuiesc ca am voie sa folosesc si paranteze. Cum pot modela asta? Pai, parantezele vor dicta ordinea in care se evalueaza cei trei operatori (o1, o2 si o3). Prin combinatii diverse de paranteze pot avea ordini diferite de evaluare a operatorilor.

Si cate ordini diferite pot avea? (Altfe spus, avand trei obiecte diferite, in cate moduri distincte le pot aseza in linie?) Matematica zice ca 3! . Adica “3 factorial”. Adica 1*2*3. Adica 6.

 

Deci pana acum ce am in modelul asta abstract de solutie posibila?:

– 4 numere (D1, D2, D3, D4), fiecare putand lua ca valoare una dintre cele 4 valori din problema (1, 3, 4, 6);

– 3 operatori (o1, o2, o3), fiecare putand fi una dintre cele 4 operatii aritmetice (+, -, *, /);

– 6 ordini de evaluare a operatorilor (sau, altfel spus, 6 moduri de a pune parantezele in expresia D1 o1 D2 o2 D3 o3 D4).

La un calcul simplu reiese ca pot avea 4*4*4*4*4*4*4*6 astfel de solutii (potentiale) posibile. (Bineinteles ca unele dintre aceste solutii potentiale nu sunt valabile (cum ar fi, de exemplu, cazul in care cel putin doua dintre numerele D1, D2, D3, D4 sunt egale), insa ma intereseaza acum doar numarul total.)

Adica voi avea de verificat 3*2^15 = 96*1024 variante de solutii posibile.

Destul de multe, dar estimez ca nu ar trebui sa dureze mai mult de cateva secunde (sau, poate, zeci de secunde).

 

OK. Asadar, problema pare rezolvabila. Hai sa vedem cum.

Revenind la ce ziceam mai sus, mi-ar trebui drept codare a unei solutii posibile un vector de 8 elemente in care sa memorez cele 4 numere (D1, D2, D3, D4), cei trei operatori (o1, o2, o3) si ordinea parantezelor. De exemplu, le pot avea plasate in vector in ordinea asta:

P, D1, D2, D3, D4, o1, o2, o3.

Daca ma gandesc ca elementele acestui vector plasate in ordinea asta ar fi cifrele unui numar, vad ca practic pentru a genera toate solutiile posibile ar trebui sa generez toate numerele de la 00000000 pana la 53333333 (cu mentiunea ca ultimele 7 cifre pot lua doar valorile de la 0 la 3, deci: 0000000, 00000001, 00000002, 00000003, 00000010, 00000011, …).

Ceea ce nu e chiar dificil de facut, nu? Iata rezultatul:

(Browserul tau nu suporta Canvas!…)


Apasa “Reseteaza…” si apoi “Executa…”. Gata? Iata solutia! (Da, punctele alea verzi reprezinta solutia problemei noastre.) Pentru a mai pastra un pic de mister, nu public aici solutia gasita dupa rularea programului, ci te las pe tine sa o descifrezi (studiind codul sursa al programului).

(Nu stii sa programezi? Cartea electronica “Abecedar de programare – De la zero barat la bun de programat” e cea mai rapida si mai placuta metoda de a-ti face debutul in programare pe care o cunosc.)

 

Ti-a placut? Da share, aboneaza-te la newsletter si da Like la pagina de Facebook pentru a fi la curent cu noutatile. Si spune-mi intr-un comentariu ce crezi: calculatoarele ne fac mai destepti, sau dimpotriva?

Florin





Loading Facebook Comments ...