A trecut si anul asta olimpiada. Imi amintesc cum in fiecare an, dupa olimpiada, ma gandeam ca anul viitor va fi mult mai bine. Dar gandurile astea dispareau si la urmatoarea olipiada ma apucam de pregatiri abia cu o saptamana sau doua inainte de judeteana. Rezultatele erau la fel, adica lipseau. Asta pana cand am participat serios la concursul Bursele Agora, care m-a fortat intr-un fel sa fac o pregatire pe tot parcursul anului.

Puteti citi cateva posturi despre concursul de anul asta pe blogul lui Florin Manea, care a fost presedintele comisiei stiintifice anul acesta:
* ONI 2008: Impresii
* ONI 2008: Subiectele
* ONI 2008: Prefata

S-a facut un mare pas in fata cu adaugarea medaliilor, ca si la celelalte olimpiade (mate, fizica). Cred ca acestea vor ajuta foarte mult la motivarea participantilor spre a isi creste nivelul de la an la an.

Eu regret faptul ca anul asta nu s-a facut Oni By Net. Era o traditie buna care e pacat ca a fost intrerupta. Chiar vorbeam cu ceva vreme inainte de concurs cu Catalin Francu si ne gandeam sa participam. Florin avea pe blogul lui un argument ca poti oricum sa rezolvi problemele offline. Se vede ca nu a participat la un Oni By Net, e foarte misto sa iti poti compara fortele cu concurentii de la concursul oficial. Nu se poate asemana experienta respectiva cu rezolvatul catorva probleme intr-o arhiva oarecare. Sper ca la anul sa fie reluata organizarea acestei parti a concursului. Din cate am inteles, Liviu Valsan ar fi vrut sa ajute la organizarea ei.

Felicitari castigatorilor, iar celorlalti spor la munca si bafta mare la anul!

Inca un demo foarte tare de la Microsoft Research. Imi plac ideile astea istete si foarte simplu de pus in practica.

Cum v-a placut prima problema, voi continua sa postez din cand in cand probleme interesante. Din cate imi amintesc, cred ca urmatoarea este de la olimpiadele rusesti ca si prima de altfel. Rusii au pe la concursuri tot felul de probleme cretze care par simple dupa ce le vezi solutia.

Avem opt lanterne ce emit lumina in forma unor triedre drepte. Sa se demonstreze ca oricare ar fi pozitia lanternelor in spatiu (consideram lanternele ca niste puncte), exista o orientare a triedrelor de lumina astfel ca oricare punct din spatiu sa fie luminat de cel putin o lanterna.

Discutati problema la sectiunea de comentarii. In doua zile voi publica solutia mea, daca nu apare aceeasi solutie pe forum.

Problema cu lanternele a fost rezolvata de Radu Cebanu, Dumitru Daniliuc, Stefan Istrate , Catalin Francu si Stefan Ciobaca.

Va prezint in continuare solutiile. Este interesant de urmarit cum sunt gandite solutiile, care desi sunt echivalente sunt prezentate putin diferit.

Stefan Ciobaca generalizeaza problema:
Eu as fi propus generalizarea: ai 2^n triedre drepte in n dimensiuni.

Rezolvarea prin divide et impera: iei cele 2^n puncte si le separi printr-un hiperplan astfel incat jumate sa fie de-o parte, jumate de cealalta parte s.a.m.d., avand in vedere ca toate hiperplanele sa fie perpendiculare intre ele. Evident, chestia asta se poate. Apoi, fiecare triedru il orientezi spre semisemisemi...semi spatiul total opus si cu marginile paralele cu axele de coordonate q.e.d.
Imi place cum se vede defectul profesional de programator citind demonstratia.

Solutia lui Radu:

Rezolvam prin inductie dupa nr de dimensiuni.

In primul rand: fixezi o directie pt primul plan, il muti paralelel cu el insusi astfel incat sa separe punctele in 2 parti egale, 4 de o parte, 4 de alta (daca stau mai multe pe planul ala exact,nu conteaza, alegi cateva si le declari de o parte, sa fie 4 si restul de cealalta).
Apoi sa zicem ca le luam pe alea de deasupra:
proiectiile lor pe planul respectiv sunt 4 puncte care conform inductiei (pt doua dimensiuni) acopera planul. Cu diedrele din plan faci triedre cu a 3-a dreapta in jos ca sa acopere semispatiul inferior. La fel pt alea de sub plan, pui dreapta a 3-a din triedru in sus ca sa acopere semispatiul superior.
Radu a lasat demonstratia putin incompleta avand incredere ca ma prind singur de cazul 2d si 1d.

Solutia lui Catalin:
Ideea mea e sa gasesc o solutie in care triedrele au laturile orientate paralel cu axele, pentru simplitate.

- Rotim sistemul astfel incat sa nu existe doua lanterne cu coordonate X, Y sau Z egale (pentru a scapa de cazuri particulare).

- Parcurgem lanternele in ordine crescatoare a coordonatei x. Pe primele 4 le marcam cu X+, pe ultimele 4 cu X-.

- Parcurgem cele patru lanterne X+ in ordine crescatoare a coordonatei y. Pe primele doua le marcam cu Y+, pe celelalte doua cu Y-. La fel si
pentru cele patru lanterne X-.

- Parcurgem cele doua lanterne X+Y+ in ordine crescatoare a coordonatei z. Pe prima o marcam cu Z+, pe a doua cu Z-. La fel si pentru celelalte 6 lanterne marcate cu X+Y-, X-Y+, X-Y-.

Avem opt lanterne marcate cu X+Y+Z+, X+Y+Z-, pana la X-Y-Z-. Acum le pozitionam paralel cu axele Ox, Oy, Oz si in sensurile indicate de semne. De exemplu, lanterna X+Y-Z-

va lumina catre sensul pozitiv al axei Ox si catre sensurile negative ale axelor Oy si Oz; cu alte cuvinte, ea va lumina punctul de coordonate (+inf, -inf, -inf).

Dandu-se un punct P(x,y,z), trebuie demonstrat ca exista o lanterna care il lumineaza. Analizam coordonata x. Datorita constructiei, x va fi fie mai mare decat toate coordonatele x ale lanternelor marcate cu X+, fie mai mic decat toate coordonatele x ale lanternelor marcate cu X- (fie ambele, daca x este situat intre cele doua grupuri de 4 lanterne). Alegem acel set de 4 lanterne si reluam rationamentul pe axele Oy si Oz. in final, obtinem minim o lanterna care lumineaza punctul P.

Si la Catalin se vede programatorul din spatele solutiei. Se observa cum structura rezolvarii este bazata pe vectorii de cate 3 elemente in baza 2.

Stefan Istrate are o solutie foarte misto, cu desene dragute, pe care o gasiti pe forum . Merita sa o cititi!

Solutia lui Dumitru nu o am scrisa.

La solutia lui Stefan Ciobaca si cea a lui Catalin Francu nu e demonstrata ipoteza ca putem gasi un sistem de coordonate in care toate punctele au coordonatele x1, x2, .. respectiv diferite . Va incurajez sa va incercati puterile pe aceasta subproblema in sectiunea de comentarii

O problema similara a fost propusa la un ACM in regiunea din Nord Estul Europei: Se cere iluminarea planului cu n lanterne (n <= 30) de coordonate date, ce pot fi rotite, al caror fascicul emite lumina sub un unghi de marime 2pi/n. Pentru fiecare lanterna trebuie returnata orientarea ei. La aceasta problema, pe langa solutia ei, e interesant si algoritmul folosit pentru evaluarea corectitudinii unui rezultat.

Pentru mai multe probleme interesante cu lanterne puteti citi urmatoarele lucrari:

Bose, J., L. Guibas, A. Lubiw, M. Overmars, D. Souvaine and J. Urrutia, "The floodlight illumination problem"
Czyzowicz, J., E. Rivera-Campo and J. Urrutia, "Optimal floodlight illumination of stages"

Cristi si Mircea au simplificat modul in care se pot face comentarii pe blog. Daca sunteti curiosi de detaliile tehnice va puteti uita la changeurile facute aici si aici . Comentariile arata acum asa:

Mai ar fi de lucru, dar e un pas mare in fata ca utilizabilitate.

Cautam de ceva vreme bloguri interesante legate de programare, si am dat la un moment dat peste blogs.msdn.com si peste studentclub.ro. Primele sunt bloguri ale unor angajati Microsoft si urmatoarele sunt bloguri ale unor studenti romani, membrii de organizatii studentesti asociate Microsoft.

Pe ambele platforme apar destul de des stiri despre noile si fascinantele tehnologii M$. Pe blogs.msdn.com sunt si multe posturi interesante si inteleg ca, din cand in cand, oamenii trebuie sa isi promoveze tehnologiile si chestiile la care muncesc. Ceea ce nu inteleg este promovarea aceluiasi gen de subiecte propagandistice de catre studenti. Cei care sunt interesati de asemenea chestii, oricum le pot lua direct de la sursa. Nu inteleg inca aceasta entuziasmare la tot ce e nou, si mi se pare o incercare nereusita de a parea la fel de cool ca fratii lor mai mari care lucreaza la M$.

Nu toate blogurile, sau toate posturile de pe studentclub sunt rele, dar multe care le-am vazut m-au lasat cu o impresie proasta. Exista si posturi foarte bune cum ar fi acesta in care doi frati povestesc experienta lor la internship la Microsoft, din vara aceasta. Daca va uitati atent ii vedeti in poza pe Mircea Pasoi si pe Tiberiu Florea , care au fost si ei la internship la M$ peste vara.

via Mircea

Sunt interesante CHAPTCHAurile bazate pe matematica. Ele pe langa ca pot diferentia intre oameni si calculatoare, pot separa si oameni pe diverse nivele de abilitati matematice.

Cateva exemple:

2 + 2 = ?

Colegii mei de liceu, de la formatia Grimus, lanseaza albumul de debut Panikon puteti asculta cateva melodii aici Bravo Vali, Cristi si Bogdan! Bafta mare!

Mie imi plac piesele Backseat Driver, Different Color Shues si Solitude. Sa imi spuneti care va plac voua.

Bogdan Ionescu, primul admis la Politehnica din Milano

Asta dupa ce Olimpic roman arestat in Italia pentru furt

Pe alta nota, despre olimpici romani, si aici chiar despre un membru al echipei infoarena: Interviu cu Filip Buruiana, locul intai la Balcaniada de Informatica Felicitari Filip!

Manevra inteligenta pe bursa facuta de Porche

Un articol misto referitor la Barack Obama scris de Cristian Tudor Popescu

Update: Baietii de la Grimus au videoclipul la piesa Backseat Driver pe youtube

Update2: Azi, inca un articol despre alt super hacker roman.

In timpul liceului, am avut de trei ori ocazia sa concurez la Olimpiada Nationala de Informatica. N-au fost patru, asa cum mi-as fi dorit, dar pentru ca fiecare mi-a mai deschis putin ochii in ceea ce priveste concursurile scolare, m-am gandit sa va impartasesc si voua cateva concluzii pe care le-am considerat, la timpul lor, utile.

2004 - Buzau

In primul rand, am aflat ca ONI nu e un concurs la care au acces doar super-elitele care in copilarie programau in loc sa fure corcoduse sau sa dea cu piciorul in minge. :) Indiferent de nivelul de la care pornim (in cazul meu, de la 0 la inceputul liceului), distanta pana la ONI poate fi parcursa prin munca de catre orice elev care-si doreste asta cu adevarat.

Am mai invatat ca miracolele nu se intampla prea des. Desi am fost nemultumit de cele 60 (50+10) de puncte obtinute, le meritam cu prisosinta si, la nivelul la care eram, mult mai multe nu se puteau obtine. E bine sa dai ce ai mai bun, dar la fel de bine e sa estimezi sincer cat de pregatit esti.

Nu mi-a placut ca ne-au trimis acasa in timpul primei probe de baraj (din considerente organizatorice), dar pana si drumul cu trenul inapoi spre Bucuresti a folosit la ceva. Niciodata un concurent mai slab decat tine (sau care a avut, pur si simplu, o prestatie slaba) nu trebuie ironizat sau desconsiderat. Dupa doua probe de concurs, participantii se impart in "calificati" si "necalificati", nu in "destepti" si "prosti".

2005 - Galati

Nu e suficient sa lucrezi mult, trebuie sa fii eficient. Fata de Buzau am obtinut un rezultat mult mai bun, si totusi am vazut cum altii progresasera in rastimpul unui an semnificativ mai repede decat mine. Poate ca ai rezolvat 100 de probleme in ultima luna, dar cu adevarat important e cat de utile au fost ele. Cu siguranta puteai face 50 care sa te ajute mai mult. Alegeti-va cu grija ce lucrati! Le multumesc lui Catalin Tiseanu si Andrei Teodorescu pentru aceasta lectie. Ma repet, dar recomand cel putin un site cu probleme de idee. Cel al olimpiadei poloneze sau SPOJ/SGU, dar acolo trebuie sa descoperiti singuri "perlele". Si, bineinteles, infoarena. ;)

"Networking"-ul se face greu, dar fara el sansele de reusita scad dramatic. Trebuie sa abordezi alti oameni cu care sa ai o colaborare benefica pentru toata lumea. Nu trebuie sa-ti fie frica sa spui altora lucrurile pe care tu le stii, dar e esential sa fii corect. Sa dai aproximativ la fel de mult cat primesti, si asta inseamna inclusiv sa te bagi in vorba cu cei foarte buni doar dupa ce le poti spune ceva care sa-i intereseze.

Norocul exista si conteaza. Am fost la limita deasupra liniei de intrare in lot, si cele 30 de puncte pe care le-am obtinut in a doua zi de baraj au contribuit decisiv. Cred ca respectiva experienta m-a marcat mult, dar m-a si ajutat sa privesc lucrurile dintr-un alt unghi.

2006 - Targoviste

Pe masura ce devii mai bun, norocul conteaza mai putin sau "The harder I work, the luckier I get". A fost frustrant sa nu progresez dupa inca un an (am obtinut tot locurile 9-10 si mentiune), dar stiam ca de data asta meritam mai mult decat ce obtinusem. Iar confirmarea a venit la baraj (unde n-am mai avut emotii) si la loturi.

Performanta e suma mai multor factori, dintre care pe unii ii ignoram fara sa fie cazul. Psihicul (mentalitatea de invingator, linistea interioara, respectul de sine) fac de multe ori diferenta intre un castigator si un simplu concurent. In ultima jumatate de ora a unei probe te emotionezi si nu mai gandesti limpede. Daca te clasezi prost la ONI, te descurajezi si la baraj. Sunt probleme cu care se confrunta toata lumea, dar in privinta lor chiar se poate face ceva. Analizati-va comportamentul din trecut, izolati factorii la care nu ati lucrat, si acordati-le o atentie sporita.

Lumea nu incepe si nu se termina cu olimpiadele. Cu cat am progresat mai mult, cu atat mi-am dat seama mai bine de asta. Trebuie sa fii concentrat si preocupat de concurs, dar daca nu reusesti sa te detasezi de agitatia generala o iei razna. Comportamentul perfect intr-o zi de ONI? Te trezesti cu dorinta de a rezolva probleme, te rupi de orice altceva in timpul probei, dar la o ora dupa ce s-a terminat te plimbi, te linistesti, te gandesti la altele. Daca nu poti dormi seara din cauza grijilor, nu e OK.

Bonus: 2007 - Cluj

Treaba comisiei nu e una usoara, si-mi pare bine ca am cunoscut si cealalta parte a baricadei. Fara niste oameni pe care ii criticam extrem de usor, olimpiada ar scadea calitativ destul de repede. Respectati comisia. :)

Tot ce mai pot spune acum e ca duc dorul anilor in care participam la Olimpiada Nationala, asa cum o sa-l duceti si voi. Pana atunci, profitati la maxim de ocazia pe care o aveti ca sa va demonstrati talentul, ca sa invatati si ca sa va distrati pe cinste. Nu in ultimul rand, va urez tuturor multa bafta!

Tiberiu Florea - greco.ro

Discutam mai demult cu Mihai Patrascu si eram curiosi ce se intampla cu medaliatii romani la olimpiada internationala de informatica dupa terminarea liceului. Am pus o pagina wiki pe infoarena cu olimpici si datele s-au adunat imediat. Mihai spera ca prin obtinerea listei sa poata incuraja pe unii profesori de la MIT sa dea o importanta mai mare rezultatelor la concursurile de programare in procesul de admitere. Ideea era sa se gaseasca o corelatie intre obtinerea unor rezultate la olimpiade si facultatea urmata sau jobul dupa terminarea facultatii. Rezultatele obtinute le puteti vedea aici . Ele sunt un set de date foarte interesante! si ne dau o fereastra spre parcursul unor oameni interesanti. Insa nu putem trage concluzia dorita de Mihai, ca multi ajung sa aiba rezultate in cercetare. 22 din totalul de 58 de olimpici romani si moldoveni medaliati la olimpiada internationala de informatica lucreaza sau au facut un internship la Google.

Pot trage concluzia (putin trista) ca multi programatori foarte buni (nu doar olimpicii) prefera sa lucreze la o firma tare din strainatate in loc sa ramana in tara. Domeniul IT trebuie recunoscut ca unul de viitor si oamenii buni ar trebui incurajati sa ramana in Romania si sa puna osul la treaba.

Gasiti aici unul dintre cele cinci posturi scrise de Mihai pe tema destinelor olimpicilor.

shameless plug: Daca esti un programator foarte bun sau daca cunosti programatori foarte buni care sunt interesati de un job la Google spuneti-le sa ma contacteze la cosminn ~ at ~ gmail.com. Si ca o paranteza finala, sunt foarte multi programatori extraordinari la Google care nu au avut in viata lor nici o treaba cu olimpiadele.

In timpul facultatii aveam colegi care se intrebau daca diverse certificari, cum ar fi cele date de Microsoft sau Sun, sunt utile intr-un CV. Eu nu am crezut niciodata ca ar fi bune sau folositoare. Mi s-au parut o modalitate relativ simpla de a mai scrie o linie in CV daca el e cam gol.

Acum sunt si mai convins de inutilitatea lor, nu conteaza deloc ca apare o certificare sau alta, sau chiar zece certificari in CV. Este mult mai importanta experienta ta, proiectele misto la care ai lucrat decat faptul ca ai studiat cateva zile pentru un examen grila unde inveti diverse detalii exoterice ale limbajului sau tehnologiei in care te certifici. Cand te angajezi undeva esti testat de obicei destul de bine pe partea tehnica si sunt si alte chestii importante cum ar fi abilitatile de comunicare, faptul ca ai sau nu o certificare va fi probabil ultimul lucru la care se va uita cineva.

La Google s-a incercat mai demult abordarea stiintifica a problemei angajarii de personal. Un experiment a fost testarea daca vreun termen sau succesiune de termeni ce apare in CV cum ar fi "programming contest" se coreleaza cu decizia de angajare sau neangajare a cuiva. S-a gasit un singur astfel de termen, acesta era "certified". Iar termenul se corela negativ.

Certificarile nici macar nu sunt greu de obtinut. Ar fi si absurd deoarece companiile ce le ofera vor sa faca bani din asta si vor sa aiba cat mai multi oameni ce le dau. Deci sunt direct interesate ca testele sa nu para usoare (astfel testele dureaza cateva ore si au zeci sau sute de intrebari), dar totusi majoritatea celor ce au depus putin efort sa le treaca cu brio.

Stiu ca la certificarile java 90% din intrebarile de la testele reale le gasesti in teste de pe net. Astfel invatarea pentru examen se trasforma pentru unii in memorarea intrebarilor mai dure pentru a nu le gresi in testul real. Aparitia marii majoritati a intrebarilor din testul grila real in testele de pregature de pe internet nu este ceva normal daca vrei ca rezultatul la acest test sa garanteze un nivel tehnic bun celor l-au trecut. Dar garantarea nivelului tehnic nu este prima prioritate a testului.

Si totusi aceste teste pot fi utile. Incepatorii in un anumit limbaj pot folosi un asemenea test pentru a isi face o imagine mai in detaliu despre limbajul care il studiaza. Dar cred ca sunt si alte tehnici mai bune sa inveti un limbaj nou. De exemplu poti incerca sa faci un mic proiect in acel limbaj, si pe langa ca inveti limbajul ramai si cu ceva util pe urma acestui efort. Din cauza ca certificarile sunt utile doar incepatorilor, cand vad ca un CV are trecut ca lucru important o certificare, imi ridic un semn de intrebare.

Mircea a bagat un feature nou. De acum avem un count la numarul comentariilor de la fiecare post, ca toate blogurile respectabile, nu vivi? ;)

Imi face placere sa va anunt aparitia la editura ALL a carti "C++, Introducere in Standard Template Library" a carui autor este domnul profesor Constantin Galatan de la Colegiul National "Liviu Rebreanu" din Bistrita. Il cunosc inca de pe vremea liceului pe domnul Galatan care e un profesor de informatica profesionist si dedicat. Mi-as dori ca toti profesorii de informatica din tara sa puna atata suflet in meseria lor. El a fost organizator a partii de informatica a concursului interjudetean "Grigore Moisil" in 2006, a fost in comisiile stiintifice la ONI 2006, ONI 2007, iar in 2008 la ONI fost seful comisiei stiintifice la clasa a 9-a, a facut de asemenea parte din comisie la loturile din 2007 si va face parte din comisia loturilor din 2008, a facut parte din echipa .campion in 2006, 2007 si 2008. De asemenea inaintea cartii pe care v-am anuntat-o, a mai publicat cartea Secrete C++ Va las mai departe cu cateva cuvinte din partea domnului profesor:

La sugestia lui Cristian George Strat de a informa membrii infoarena despre aparitia unei carti de STL, m-am decis in cele din urma sa scriu cateva cuvinte, legate nu doar de STL.

Cred ca nu voi surprinde pe nimeni daca afirm ca ceea ce se petrece pe infoarena se urmareste cu mult interes, nu numai de catre elevi si studenti, ci si de catre alti oameni, printre care multi profesori. Acestia din urma nu activeaza pe forum, insa nu din cauza lipsei de interes. Este mai degraba intelegerea faptului ca pe infoarena elevii si studentii trebuie sa se simta in largul lor, sa discute liber. Desi s-ar putea ca unii sa ma contrazica, eu cred ca in momentul in care un profesor intervine pe un fir de discutie, exista probabilitatea ca o anumita stanjeneala sa se faca simtita.

Infoarena este acum un fenomen care-si manifesta influenta pozitiva asupra celor care studiaza informatica. Ca unul dintre cei care lucreaza efectiv cu elevi ai claselor de mate-info, simt ajutorul tot mai puternic al infoarenei. Nu de la bun inceput l-am simtit. Pana anul trecut, trebuie sa spun ca imi convingeam cu greutate elevii sa intre pe infoarena ca sa participe de pilda, la concursuri. Cineva chiar mi-a spus odata: "domunule profesor, ce rost mai are sa intru pentru 0 sau 10 puncte ?. Sunt prea grele problemele". Am fost nevoit sa admit acest lucru. Chiar pentru copiii cu performante onorabile: calificari la nationale sau mentiuni la ONI, problemele de pe infoarena au fost de multe ori prea dificile. Desigur ca nivelul ridicat de dificultate a contribuit mult la formarea elitelor, a celor super pregatiti, dar hai sa vedem cati elevi super pregatiti avem in tara? Treizeci ? Patruzeci ?

Exista o categorie de elevi la sectiile de mate-info, sa-i spunem prin abuz de limbaj "patura mijlocie", formata din persoane cu multe calitati. Numarul lor este de ordinul sutelor, poate chiar a miilor in aceasta tara. Acesti copii merita tot efortul nostru. Din randurile lor se pot ivi adevarati olimpici iar in viitor, informaticieni valorosi. Au insa nevoie de o mana de ajutor ferma care sa-i sustina si sa-i ridice in stratosfera performantei.

Ultimele initiative ale infoarenei: "Arhiva Educationala", accesul liber la sursele unor probleme, sectiuni de concurs pentru cei mici, si evident forumul, sunt veriga lipsa, legatura dintre infoarena si multimea de elevi.

Cand intru acum in laborator si gasesc cinci, pana la cincisprezece copii care isi cauta ceva de facut pe infoarena, realizez ca cineva mi-a intins si mie o mana in munca cu acesti elevi.

In final, revin la cartea de STL, "C++. Introducere in Standard Template Library" pe care am publicat-o la editura ALL. Lucrarea poate fi utilizata atat ca tutorial cat si ca referinta completa STL. Este de folos celor care utilizeaza deja STL dar vor sa se perfectioneze, dar si incepatorilor. Contine si un capitol special de lucru cu sabloane in C++. Informatii suplimentare gasiti aici

Tucu Galatan

Atunci cand vrei sa te apuci de un lucru sau sa imbunatatesti un anumit proiect, unul din primii pasi pe care trebuie sa ii faci e studiul modului in care alti oameni au reusit deja sa atinga obiectivele pe care ti le propui. Desi noi, cei din comunitatea infoarena, nu avem functii in Ministerul Educatiei, parerea mea e ca putem sa ne gandim ce putem face pentru "imbunatatirea" olimpiadei de informatica din Romania.

Sa vedem, deci, ce tari stau mai bine ca noi din acest punct de vedere. Statele Unite ale Americii au un concurs destul de cunoscut elevilor romani, care permite oricui sa participe online la probele sustinute "proctored" (sub supraveghere) de elevii americani. Cu siguranta, concursul USACO a avut un impact puternic in Romania: foarte multa lume a trecut prin programul de pregatire de pe site-ul lor, majoritatea celor care spera sa ajunga la ONI participa constant la rundele online, si cel putin 3 romani (poate mai multi, de 3 stiu eu) au fost invitati, in urma rezultatelor foarte bune, sa participe la faza finala din America. Personal, nu cred ca USACO e un model prea bun pentru olimpiadele din Romania, din mai multe motive. In primul rand, foarte putini americani studiaza informatica ("programming", cum ii zice USACO), si numarul celor care-si incearca sansele la acest concurs e unul destul de mic. Din acest motiv, conducatorul lotului american (Rob Kolstad) poate sa tina legatura cu multi dintre concurenti de-a lungul anilor, sa discute cu parintii si profesorii lor, si sa creeze cel mai bun concurs in raport cu interesul national. Foarte ciudat e ca nu se stie de la inceput ce pondere are fiecare proba, stabilirea constantelor pentru calculul formulei finale fiind una din atributiile aceluiasi Kolstad, dupa ce concursul s-a incheiat!

Nici nu vreau sa-mi imaginez ce fel de scandaluri ar iesi in Romania in urma unei astfel de abordari, mai ales avand in vedere ca la noi unii parinti sunt mai preocupati de rezultatele concursurilor decat copiii lor, si sunt gata oricand sa faca circ atunci cand simt ca cineva a comis vreo nedreptate fata de ei. De altfel, nici mie nu-mi place ideea in sine. In America, acolo unde pana si admiterea la facultate se face in urma unui proces subiectiv, asa ceva e tolerabil. Dar in Romania, avand in vedere istoria ultimilor 60 de ani, nu putem aplica eficient un astfel de sistem.

Doua tari la care privim de multa vreme cu respect (pentru rezultatele obtinute) sunt China si Rusia. Ajungem, ca de obicei, la concluzia ca in tarile in care traiul este un chin (rusii de rand traiesc in saracia pe care le-au adus-o comunismul si apoi acapararea tuturor resurselor tarii de catre oligarhia sustinuta de Kremlin, iar chinezii au fost "imblanziti" de catre sistemul politic represiv si inuman), apar si talentele extraordinare. Pe langa generalizarile despre o presupusa inteligenta colectiva a natiunilor, se pare ca daca esti deznadajduit si ti se pare ca nu prea ai cum sa scapi de soarta dura, faci tot ce-ti sta in putinta ca sa exploatezi o ocazie atunci cand ea apare. Sa revenim totusi la olimpiade. Din pacate, nu avem atat de multe informatii despre cele din Rusia si China. Exista diverse informatii care s-au scurs, insa numai cei care cunosc limba rusa au acces la problemele si solutiile de la rusi, in timp ce pentru celelalte s-ar putea ca nici macar limba chineza sa nu fie de ajuns. Conform lui Zhu Zeyuan , guvernul chinez a desfiintat site-ul IOI Forum, acolo unde se discutau si probleme din tara lor, tocmai pentru a-i impiedica pe straini sa acceada la ele. Ceea ce stim, insa, e ca problemele din ambele parti sunt foarte grele si interesante, si ca ambele tari se bazeaza pe organizarea unui numar ridicat de tabere de pregatire, a caror eficienta a fost demonstrata. De asemenea, China alege participantii la IOI cu un an inainte, pentru a le da suficiente ocazii sa se pregateasca si sa aduca glorie patriei. Parerea mea e ca ar trebui, eventual cu ajutorul celor care inteleg limba rusa, sa studiem mai mult ceea ce se intampla la ei si sa vedem ce se poate adapta in Romania. Sa-i lasam pe chinezi in pace, pentru ca in Romania nu vom manca niciodata orez de placere si nici nu vom spune ca mersul pe bicicleta e hobby-ul nostru national, imbinand utilul cu placutul. Suntem pur si simplu prea diferiti de ei.

In Europa sunt mai multe locuri in care ne-am putea uita. Croatii si slovacii, printre altii, se descurca destul de bine in ceea ce priveste organizarea olimpiadelor. Totusi, parerea mea e ca polonezii dau cel mai bun exemplu . Site-ul lor, tradus partial in engleza, e o resursa indispensabila pentru cei care vor sa rezolve probleme care sa le dezvolte creativitatea. Multi dintre noi au stat zile / saptamani / luni gandindu-se la cate o problema de acolo, constatand ca de fapt se rezolva cu o idee simpla, dar greu de gasit. Nu cred ca e vreun alt concurs care sa sintetizeze mai bine ceea ce inteleg eu prin ideea de "olimpiada de informatica" (desi mai demult gandeam altfel, si mi se parea ca un concurs ca al lor e prea "incorect" fata de cei care se pregatesc mult - vorbim despre asta intr-un alt post).

Olimpiada poloneza are 3 faze cu subiecte unice pe tara. De multe ori, cea mai grea e "etapa locala", insa elevii au la dispozitie aproape o luna pentru a se gandi la subiectele propuse. Aceasta standardizare a evaluarii a insemnat o simplificare a intregului proces competitional, si "mai simplu" inseamna de multe ori "mai bun", sau cel putin "mai logic". De ce sa te concentrezi pe un sistem complicat, cand poti sa te concentrezi pe subiectele propriu-zise? Problemele au un grad mare de originalitate, in spatele lor sunt idei adevarate (nu reformulari ale altor cerinte mai vechi), si solutiile sunt foarte ingenioase. De asemenea, cei care pricep limba poloneza isi pot comanda "blue book"-urile, acele carti care contin toate solutiile, explicatiile si "rezervele" care nu s-au dat, sumarizand intreaga activitate dintr-un an de zile. Nu exista solutii redactate in 3 randuri care sa faca o simpla trimitere la alte carti, iar ceea ce se obtine astfel reprezinta o resursa cu totul deosebita pentru cei care vor sa se puna la curent cu tot ce a miscat in anii precedenti in concursurile poloneze de informatica. Primii clasati la faza finala (ca si in multe alte tari dezvoltate, nu exista separare pe clase si nici macar sistemul juniors / seniors ca la croati) primesc premii foarte consistente de la sponsorii destul de puternici si interesati. Cei mai buni primesc si dreptul de a participa la CPSPC (Czech - Polish - Slovak Preparation Contest), un concurs foarte puternic, dar fara o miza deosebita. Un fel de lot la comun pentru 3 tari. In afara faptului ca obtinerea unui loc de IOI necesita si un pic de noroc (pt. ca se bazeaza pe rezolvarea a numai 5 probleme in etapa a 3-a), mi se pare ca avem foarte multe de invatat de la ceea ce au facut si fac in continuare polonezii. Mereu vor exista cateva aspecte de imbunatatit, si acest lucru e normal!

Oricum, ca sa n-o mai lungim prea mult. Cine sunt cei interesati de imbunatatirea sistemului competitional la informatica? Si ce pot face ei in sensul acesta? Pentru ca e frumos sa discutam, dar e si mai frumos sa tragem niste concluzii, sa redactam niste planuri, si sa mergem cu ele la "factorii de decizie", incluzand aici oficialitatile din minister si potentialii sponsori. Isi doreste cineva destul de mult sa avem si noi o olimpiada mai buna, din toate punctele de vedere?

Virgil Palanciuc este olimpic international "din garda veche" si Software Engineer de 8 ani. A lucrat in departamentul de compilatoare al Freescale Romania iar momentan este Project Manager la Evo Software. Impreuna cu Bogdan Nitulescu si o armata de asistenti (printre care ma numar si eu) preda cursul de compilatoare la UPB. Recent Virgil a trimis un email catre studentii acestui curs pe lista de discutii asociata. Noua ni s-a parut interesant si util mesajul transmis si ne-am gandit sa vi-l impartasim si voua prin intermediul blogului :)

Silviu Ganceanu

Doamna profesoara Athanasiu obisnuia sa scrie articole in PC Magazine, prin care sa transmita mesaje studentilor, sa corecteze unele perceptii pe care le considera gresite, si asa mai departe. Unele dintre ele le mai gasiti inca pe pagina Utile a cursului CPL. Poate ca in timp, vor deveni "obsolete", poate ca au devenit deja, sau poate ca vor fi mereu actuale.

Eu din pacate nu am talentul epic al ei, si nici experienta sa. Dar de data asta o sa ma risc, sa scriu un "articol" similar cu articolele ei incercand sa raspund la intrebarea "De ce e important pentru voi acest curs de compilatoare". Am observat in ultimul timp o atitudine care tinde sa prinda elan odata cu raspandirea accesului la internet - am auzit mult prea des parerea ca "De ce e nevoie sa stiu asta? Daca am nevoie, caut pe net". O parere partial corecta... totusi doar partial. Invitat intr-o emisiune TV, acum cativa ani, Neagu Djuvara a recunoscut că nu stie data bataliei de la Podul Inalt: "Am totul notat pe fise, nu retin datele". Asa e, nu trebuie sa retii toate datele pentru a fi un mare istoric. Nu trebuie sa retii toate metodele si interfetele din Java API pentru a fi un programator bun - e un exercitiu de memorare complet inutil.

Insa: atitudinea aceasta e, din pacate, prea des dusa in extrem - pana la punctul la care, cand unui student de la A/C i s-a cerut sa incrementeze o variabila, a scris pe tabla doar "++" (fara numele varibilei), scuzandu-se ca "nu are nevoie sa stie sintaxa C, poate sa o caute in manual oricand". Desigur ca voi intelegeti absurditatea acestei atitudini - dar exista forme mult mai "nevinovate" de manifestare a unei atitudini similare. Cea mai comuna este atitudinea studentului care atunci cand are o tema de facut la scoala, cauta ceva similar pe internet si adapteaza. Scuza, invariabil, este ca "reutilizarea e extrem de importanta" si ca "la serviciu nimeni nu-ti cere sa scrii totul de la 0, refolosesti tot ce poti". Asa este, la serviciu refolosesti. Dar voi acum sunteti intr-o perioada in care nu trebuie sa produceti cod util, ci trebuie sa intelegeti. E prea putin relevant cu ce nota terminati scoala, mai nimeni nu o sa va intrebe de asta. E mult mai important sa intelegeti cat mai mult cum functioneaza lucrurile, sa intelegeti ca lucrurile nu functioneaza "by magic" in calculatoare, ci urmeaza o logica foarte clara, ca daca faci ceva intr-un anumit fel poate fi eficient, sau ineficient, si asa mai departe. Sa intelegeti ca un "+=" nu e intotdeauna operatia inocenta care pare a fi, daca ne uitam strict la sintaxa. De aceea e important cursul de compilatoare (si cel de sisteme de operare), fiindca, poate mai mult decat oricare alte cursuri, fac legatura intre 2 lumi: cea a limbajelor de nivel inalt, a "abstractizarilor" - in care programatorul "zboara deasupra lucrurilor" si pierde de multe ori legatura cu "realitatea hardware" - si lumea "de jos" - in care lucrurile trebuie puse cap la cap, legate intre ele, adaptate la procesor, simplificate, facute sa functioneze ca un tot unitar. E ceva ce nu veti gasi niciodata pe google - nu fara a sti deja ce cautati. Daca stiti paradigmele de programare, daca stiti cum si de ce functioneaza constructiile si mecanismele dintr-un limbaj de programare - atunci va va fi mult mai usor sa adaptati la un orice alt limbaj nou fiindca veti intelege ca limbajul e doar un instrument facut pentru a va mari productivitatea, la fel ca si un IDE, debugger samd. Si nu veti cadea in capcana de a va auto-intitula "Programator Java" / "Programator .NET".

La interviu la Google, din cate mi s-a spus, daca un candidat stie de dinainte raspunsul la o intrebare raspunsul lui este complet ignorat. Ceva similar faceam si eu (fara sa stiu ca Google face asta): de exemplu pun candidatii sa scrie o functie de cautare a unui subsir intr-un sir de caractere si daca e evident ca stie algoritmul Boyer-Moore, atunci il pun sa scrie altceva - e prea putin relevant faptul ca a memorat un algoritm. Dar e foarte important daca el intelege complexitatea algoritmului pe care l-a scris, daca atunci cand i se cere sa scrie o varianta mai eficienta, stie "de unde sa apuce problema" pentru a cauta o solutie mai eficienta, si "de ce solutia curenta nu e eficienta".

Cititi de exemplu articolul acesta - fara sa fiu neaparat 100% de acord cu el, mi se par interesante (si probabil extrem de relevante pentru el) intrebarile "de filtrare" pe care le pune la interviu. Nimeni nu va ofera "pe tava" raspunsul la asa ceva si sunt probleme dureros de prezente in anumite medii. E ceva ce nu inveti in mod direct la scoala dar, daca ai inteles cum functioneaza un procesor, cum functioneaza un compilator, cum functioneaza un linker, cum functioneaza un sistem de operare, ai o sansa sa te descurci.

In fine, inchei acest mail cu un link la articolul care m-a facut de fapt sa-l scriu - il gasiti aici. Mi s-a parut impresionant cum un om de varsta tatalui meu reuseste sa inteleaga internetul mai bine decat multi oameni tineri, de 20 ani. Sau ma rog, eu asa cred, ca l-a inteles foarte foarte bine: "Dar a fi cultivat nu înseamnă a şti, înseamnă a şti să cauţi. Nu a şti să utilizezi o „maşină de căutare", ci a transforma căutarea într-un parcurs laborios, imprevizibil, plin de fertile derapaje colaterale. Cultura nu te îmbogăţeşte prin ceea ce îţi livrează în mod expres, ci prin aventura drumului, prin barocul tatonărilor. Cultura e facultatea de a decide ce e de făcut cînd nu ştii ceva: cum să pui întrebarea, la ce uşă să baţi, în care orizont să te mişti."

Dl. Plesu vorbeste despre cultura, dar eu zic ca e perfect valabil in contextul mai larg al "cunoasterii" - fix asta trebuie sa invatati voi din facultate: cum sa pui intrebarea, la ce usa sa bati, in care orizont sa te misti. Asta e lucrul cu care trebuie sa ramaneti - cum se rezolva o tema si in nici un caz cu "am reusit sa fac niste modificari prin analogie intr-un program de pe net, deci se cheama ca m-am descurcat sa o fac".

Spor la lucru la tema 2, apucati-va de lucru din timp ca e mult mai grea ca tema 1 :)

  Virgil.

P.S. Tocmai m-a intrebat ceva un coleg de la alta echipa - nu intelegea de ce in ASP atunci cand pune "listbox" in pagina nu poate face un item din lista sa fie hyperlink, pe cand daca pune "gridview" se poate. Nu i-a trecut prin cap ca ar afla raspunsul extrem de usor daca s-ar uita ce HTML se genereaza in spatele acelor controale ASP ...

Tocmai am simtit un cutremur, a durat vreo 30 de secunde si mi-a zgaltait putin biroul (5.6 grade magnitudine). Am avut senzatii contrastante, pe de o parte ma gandeam ca este primul meu cutremur in CA dupa ce am auzit mult despre ele, si pe cealalta ca ghiozdanul cu chestii de prim ajutor mi-e acasa. Urmatorul gand in minte mi-a fost faptul ca sistemele Google sunt failsafe si daca s-ar strica cateva harddiskuri tot nu ar fi probleme.

Ce mai, "Living on the edge!" in fata calculatorului :).

Am tot auzit lucruri bune despre limbajul de programare Python si unde lucrez are o sustinere destul de mare. Am devenit din ce in ce mai curios si la inceputul verii am scris cateva programele ca sa imi incerc puterile.

Pentru ca inveti un limbaj nu prin a citi o gramada de carti ci prin lucra in el, am cautat o modalitate de a scrie cateva programe simple. Am intrat pe projecteuler.net . Acesta e un site cu in jur de 200 de probleme si fiecare problema are ca raspuns un numar. Poti incerca sa gasesti rezultatul folosind creionul si hartia sau sa codezi un program in orice limbaj. Dupa ce ai rezolvat o problema ai acces la threadul de pe forum unde discuta cei ce au rezolvat problema. Acolo sunt multi oameni care isi posteaza rezolvarile cat mai concise sau cat mai eficiente si astfel vezi mai multe solutii diferite de a ta si inveti smecherii de limbaj sau algoritmi mai buni.

Dupa cateva luni imi place limbajul foarte mult. Chestia cea mai misto e ca am ajuns sa ma simt productiv foarte repede in el. E un limbaj interpretat asa ca nu trebuie sa astepti dupa compilare. Pe langa asta are o consola in care poti sa incerci sa vezi ce fac diverse bucati de cod. Lucru foarte util cand nu stii limbajul. De asemenea este destul de intuitiv. S-a intamplat de mai multe ori sa nu fiu sigur de cum se fac unele lucruri, sa le incerc si sa mearga.

Alt avantaj este acela ca limbajul e dynamically si strongly typed. Asta inseamna ca nu o sa iti mai bati capul ca in C++ cu erori interminabile de compilare si mai inseamna ca limbajul suporta programarea cu generice. Astfel putem avea programe de genul:

>>> def suma(a, b):
...   return a + b
>>> suma(1, 2)
3
>>> suma('mere', 'pere')
'merepere'

Imi place ca indentarea codului face parte din limbaj, aceasta restrictie ajuta mult la lizibilitatea programelor pentru ca impune un stil de codat similar pentru toata lumea. Iar lizibilitatea unui cod este foarte importanta, pentru ca petrecem mult mai mult timp citind cod decat scriind cod nou.

De asemenea limbajul incearca sa ajute programatorul cat mai mult, izoland detalii care nu sunt importante. De exemplu la operatiile pe intregi avem implementate numere mari si nu mai trebuie sa avem grija sa nu facem overflow.

Este un limbaj succint. Spre deosebire de java, pentru a face ceva nu trebuie sa scrii foarte mult.

Are foarte multe librarii, unele dintre ele intrate deja in limbajul de baza. Ca exemple as aminti NumPy,o librarie de calcule numerice, care contine printre altele metode din algebra liniara sau generatoare de numere aleatoare, sqlite care se ocupa cu operatii pe o baza de date si PIL o librarie de prelucrare a imaginilor.

In Python se poate folosi si paradigma programarii functionale. El are elemente ca map(), reduce(), filter(), si operatorul lambda.
Metoda map(functie, secventa) ne intoarce o lista care sunt rezultatele aplicarii functiei peste elementele unei secvente. Operatorul reduce(functie, lista) ne intoarce rezultatul aplicarii cumulate a functiei peste elementele secventei. Putem scrie cod de genul:

>>> # un sir de intregi din unul de stringuri
>>> map(int, ["1", "2", "3"])
[1, 2, 3]
>>>  # suma elementelor din un sir
>>> reduce(lambda x,y: x + y, [1, 2, 3])
6
>>>  # filtram elementele impare
>>> filter(lambda x: x % 2 == 0, [1, 2, 3])
[2]

Faptul ca limbajul nu este unul pur functional, face invatarea ideilor din programarea functionala mai usoara.

Mai imi plac si list comprehensions care sunt doar zahar sintactic, dar le folosesc destul de des. Ele sunt o modalitate naturala si succinta de a crea liste. Va dau mai jos cateva exemple:
>>>  # patratele numerelor de la 1 la 4
>>> [x**2 for x in range(1, 5)]
[1, 4, 9, 16]
>>> # pentru doi vectori a si b
>>> a, b = [1, 2, 3, 4], [1,4,8,16]
>>> # toate sumele intre un element din a si unul din b
>>> [x + y for x in a for y in b]
[2, 5, 9, 17, 3, 6, 10, 18, 4, 7, 11, 19, 5, 8, 12, 20]

Si imi mai plac tuplurile pentru ca de multe ori ai nevoie de cate un tip de date rapid. De exemplu un punct 3 dimensional il putem obtine ca punct = (-1, 0, 11).

Ca minusuri, unul mare este eficienta. Astfel cand scriam solutii pentru probleme de la google code jam, unele erau de 50 pana la 100 de ori mai incete ca varianta implementata in java sau C++. Dar cred ca productivitatea programatorului este mult mai importanta ca eficienta codului, iar Python lucreaza bine cu limbajul C si bucatile ineficiente pot fi reimplementate in C.

Sper ca, daca nu ati lucrat deja in Python, v-am trezit putin apetitul. Daca aveti deja experienta cu Python ce caracteristici v-au placut? Cei care nu sunt convinsi inca pot citi aici cum se poate face un spell corrector in 21 de linii de Python.

Am incercat sa gasesc cateva motive pentru un student la informatica, care nu a avut contact cu olimpiadele in liceu, sa participe la concursurile ACM in timpul facultatii. Ce ar fi folositor pentru el in dorinta de a deveni un programator mai bun? Am ajuns la urmatoarea lista:

  • ca sa mai scrii o linie in CV
  • ca sa iti dai seama ca programezi foarte incet
  • ca sa vezi ce greu e sa lucrezi in echipa in conditii extreme
  • ca sa programezi ceva interesant
  • ca sa intelegi algoritmica si structurile de date la un nivel ce trece de superficialitate
  • ca sa cunosti alti oameni cu pasiune mare pentru programare
  • ca sa ti se para banale intrebarile de coding de la interviurile microsoft sau google
  • ca sa inveti chestii mai importante decat ultima tehnologie la moda, cum ar fi identificarea rapida a bugurilor, claritatea codului, proiectarea programului inainte de implementare sau metode de optimizare a timpului si memoriei
  • ca sa rezolvi o problema complet a carei solutie merge pe toate cazurile
  • ca sa inveti ca nu orice problema se rezolva cu "metoda backtracking"
  • ca sa poti scrie un post pe blog

Ce motive aveti voi pentru a participa sau pentru a nu participa la acest concurs?

Pol Catalin mi-a aratat un demo de la SIGGRAPH 2007 . Demonstratia este impresionanta, si ne arata cum, cu un algoritm simplu, putem obtine o calitate foarte buna cand redimensionam imagini. Algoritmul functioneaza bine chiar daca imaginea finala e mai mare decat cea initiala.

M-am uitat pe la alte paperuri si demouri de la SIGGRAPH si am dat peste plasma pong, un joculet foarte misto care mi-a adus aminte de vremurile din liceu cand pierdeam ore in sir implementand diversi algoritmi ce generau plasme sau focuri.

Puteti vedea mai jos cele doua demouri, primul e de cinci minute, iar al doilea de doua. Enjoy!

Update Gasiti aici lucrarea care descrie algoritmul folosit.

Vivi a scris pe blogul lui un post misto despre utilitatea olimpicilor intr-o firma de programare. Il gasiti aici .

E interesant atat postul cat si comentariile legate de el. Voi ce parere aveti?

Discutam de mai multă vreme cu Cătălin Frâncu despre proiecte personale şi despre Dex Online . Cu Cătălin am mai discutat pe blogul infoarena aici şi aici . Acum, la mai bine de un an dupa acele discuţii el a scris un articol foarte interesant despre traiectoria acestui proiect. Articolul este destul de lung, dar cred că e foarte interesant şi puteţi învăţa mult din el. De obicei înveţi din experienta proprie şi durează o perioada până treci prin destule proiecte incât să ai o privire de ansamblu. Articolul ăsta poate să vă scurteze acea perioadă. Aşa că luaţi o cană de cafea sau ceai şi vă urez lectură plăcută!

Scopul articolului

Acest articol prezintă diverse aspecte din existenţa de şapte ani a proiectului DEX online. Totuşi, articolul nu este în primul rând despre DEX online. Îl scriu la sugestia lui Cosmin Negruşeri pentru comunitatea infoarena.ro. Intenţia articolului este să disece, pentru foştii şi actualii olimpici la informatică, un exemplu de proiect din lumea reală, pentru a sublinia diferenţele între 1000 de progrămele de câte 100 de linii şi un program de 100.000 de linii, între programarea de unul singur şi lucrul în echipă, într-un proiect cu multe alte faţete decât cea informatică.

Textul pune în lumină particularităţi de natură tehnică, socială, etică şi financiară ale proiectului DEX online. Dintre acestea, voi insista pe latura etică şi socială a proiectului, pentru că de acolo au venit mai multe provocări şi realizări decât din domeniile tehnic şi financiar. Documentul se lansează adesea în judecăţi de natură morală, cu riscul de a plictisi. Sunt de părere că administratorul unui proiect cu oarecare utilitate practică nu poate rămâne amoral, ci trebuie să ia nişte decizii.

Nu recomand nimănui să facă lucrurile exact aşa cum le-am făcut noi. DEX online ar putea fi mai prezentabil. Sau ar putea oferi un corector ortografic pentru Word. Sau ar putea costa 5€/lună pentru accesul nelimitat la definiţii. Sau şi-ar putea răsplăti colaboratorii cu 10 centi pentru fiecare definiţie trimisă. Sau ar putea include un dicţionar urban. Acestea toate sunt hotărâri pe care le ia coordonatorul unui proiect în funcţie de timpul disponibil şi de scopurile echipei sale.

Auto organizarea proiectului

DEX online nu are manageri, nu are avocaţi, nu are contabili, nu are şedinţe, nu are ore fixe. Într-un cuvânt, DEX online nu are o ierarhie. DEX online are un website şi o listă de discuţii pentru voluntari, plus alte câteva unelte secundare (un sistem de gestiune a bug-urilor, un sistem de gestiune a emailurilor de la utilizatori, o pagină wiki practic nefolosită). Oamenii sunt cei mai productivi atunci când le oferi o listă de lucruri pe care le pot face în folosul proiectului şi îi laşi să facă ce le place cel mai mult. Ca urmare, avem unele definiţii care stau necorectate de luni de zile, deşi între timp am corectat mii de alte definiţii. Mie, ca programator, îmi revine sarcina de a crea o interfaţă în care voluntarii să poată lucra eficient. De aceea, îmi petrec mai mult timp lucrând la pagina moderatorului (invizibilă publicului larg) decât la paginile publice.

Este surprinzător ce oameni de calitate poţi aduna dacă menţii o listă de email activă timp de 7 ani. Ei rezolvă multe din problemele care pe mine mă depăşesc. De fapt, am încetat să mă mai consider „conducătorul” proiectului după primele 6 luni; prefer titlul istoric de „fondator” sau pe cel de „coordonator”. De exemplu, primim zilnic emailuri cu întrebări de natură lingvistică la care eu nu aş şti să răspund. Sau ne-am izbit de fineţuri legale. Sau a trebuit să creez o schemă MySQL pentru nişte date pe care nu le înţelegeam la nivel conceptual. Din fericire, pe lista noastră de discuţii există lingvişti, avocaţi şi programatori care ne-au scos întotdeauna din impas. Cu timpul, separarea funcţiilor s-a produs de la sine. De exemplu, sistemul de email are o coadă de mesaje destinate mie, cu cerinţe la care numai eu pot răspunde. La restul mesajelor aproape nu mă mai uit, pentru că alţi voluntari şi-au însuşit această parte a sistemului şi se ocupă impecabil de ea.

DEX online nu a avut niciodată ambiţii pe termen lung sau OKR-uri (obiective şi rezultate cheie). Sună un pic paradoxal, dar poţi avea nişte idei generale despre ce ar trebui făcut, fără să faci din asta o obligaţie. Poţi să te aştepţi să atingi obiectivul X la momenul T fără să promiţi că vei îndeplini obiectivul Y, care depinde de X, la momentul T + 1. De exemplu, am început prin a culege definiţii din DEX. Bazându-ne pe progresul zilnic, am estimat că va dura cam 5 ani să culegem tot DEX-ul (până la urmă a durat doar 3). Dar nu ne-am gândit la modul serios cu ce ne vom ocupa timpul după aceea sau ce vom face cu baza de date odată ce va fi completă. Nu mi-a plăcut niciodată acest gen de presiune, am preferat să nu le-o induc voluntarilor, şi nu se poate spune că am bătut pasul pe loc din cauza asta. Nici unui voluntar nu i s-a părut inacceptabil că am muncit trei ani pentru a culege un dicţionar, nici nu ne-am trezit în vreo dimineaţă sâcâiţi de gândul că trebuie să mai introducem 50 de definiţii şi poate n-avem chef.

Un aspect care poate dezamăgi, dar aşa s-a întâmplat, a fost începutul întâmplător al proiectului. Nu am stat zile în şir să mă gândesc „la ce-aş putea eu munci care să aibă un impact seminificativ pe internetul românesc?”. Abia după ce lucrasem la el vreun an am conştientizat că DEX online ar putea ajunge un site de referinţă. Ideea proiectului mi-a venit în 2001, când eram student în Boston şi foloseam zilnic dicţionare explicative englezeşti online pentru a-mi scrie temele. Pe de altă parte, duceam lipsa unui dicţionar explicativ românesc. Odată am avut o dispută cu un prieten asupra pluralului lui „cratiţă”: el susţinea că este „cratiţe”, iar eu „crătiţi”. Răspunsul, care i-a dat dreptate, a trebuit să aştepte câteva luni până am mers în vacanţă în România. De acolo am venit înapoi cu un DEX, dar m-am gândit că ar fi frumos să existe o variantă pe internet, de pe urma căreia să profite toată lumea, nu doar eu. Dar, având în vedere că după 6 luni de existenţă DEX online cuprindea vreo 50 de definiţii, din care vreo 45 introduse de mine, nu l-am luat foarte în serios. Ulterior, Federaţia Română de Scrabble (F.R.Sc.) a descoperit site-ul şi a început să contribuie masiv cu definiţii. Probabil acolo a fost punctul critic al proiectului şi, privind înapoi, mi se pare că s-a întâmplat un lucru nemaipomenit de improbabil ca 10 oameni să-şi pună încrederea într-un proiect cvasianonim, care ar fi putut merge prost din nenumărate motive. Concluzia acestui paragraf este că inspiraţia vine de unde nu te aştepţi.

Finanţe

DEX online nu vehiculează nici un fel de sume băneşti. Am evitat ca proiectul să aducă orice fel de venituri, din motive multiple.

  1. Banii aduc discordie. Singurul caz în care poate aş accepta să caut profit de pe urma siteului ar fi dacă toţi colaboratorii proiectului ne-am umple de bani, ceea ce o judecată la rece arată că nu e cazul. Veniturile ar fi imposibil de repartizat echitabil, deoarece natura muncii depusă de fiecare voluntar este diferită şi deci greu de cuantificat. Unii răspund la emailuri, alţii introduc sau corectează definiţii, alţii scriu cod, alţii lucrează la generarea flexiunilor.
  2. Veniturile vin din reclamă, iar reclama strică un site. Îl strică mai mult (dacă este o reclamă cu „daţi click pe maimuţă”) sau mai puţin (dacă este Google AdSense), dar îl strică, pentru că prin natura ei reclama are scopul de a distrage utilizatorul de la conţinutul paginii.
  3. O altă sursă de venituri ar fi limitarea accesului gratuit şi introducerea de costuri pentru accesul complet la baza de date, care nu intră în discuţie, deoarece nu se potriveşte filozofiei noastre.
  4. Veniturile trebuie contorizate, raportate la Fisc, impozitate, ceea ce duce la nevoia înregistrării unei firme, la angajarea unui contabil şi alte probleme cu care preferăm să nu ne dăm bătăi de cap.
  5. Odată ce un serviciu generează venituri, apare automat nevoia de mai multe venituri în flux continuu pentru a acoperi nişte cheltuieli periodice (tot ceea ce înseamnă cheltuielile unei firme). Ori, DEX online a ajuns acolo unde este tocmai pentru că nu l-am împins în nici un fel de la spate şi nu l-am tratat ca pe un serviciu, ceva de care trebuie să te ocupi în fiecare zi la oră fixă.

DEX online nu are nici cheltuieli seminificative. Am obţinut tot ce ne-a trebuit de la oameni şi firme care au apreciat calitatea proiectului: găzduirea, unele dintre dicţionare, fonduri pentru cumpărarea unui software de OCR. Cea mai mare donaţie însă este timpul liber al fiecăruia dintre participanţi.

Free as in freedom

În prezent, baza de date şi codul DEX online sunt disponibile sub licenţa GPL, dar am trecut prin diferite stadii până a ajunge aici.

Până în 2004, când DEX online conţinea cam 30.000 de definiţii, nici nu ne-am pus problema unei licenţe, mai ales că încă nu ştiam cu ce ochi priveşte Academia Română proiectul DEX online. Intenţia mea era în continuare să aştept până la reglementarea situaţiei cu Academia şi, eventual, DEX online să intre sub tutela acestui for.

Totuşi, în timp ce Academia nu manifesta nici un interes pentru DEX online, restul internetului românesc începuse să ne remarce. Apăruseră multe concepţii greşite şi critici la adresa DEX online, iar noi, ocupaţi cu introducerea datelor, neglijasem să ne expunem clar principiile într-un document. În paralel, interesul pentru baza de date era în creştere şi fusesem de mai multe ori vizitaţi de crawlere web a căror intenţie părea să fie să transfere toate definiţiile (comportamentul era evident diferit de al unui motor de căutare general). De asemenea, se punea problema dacă definiţiile preluate din DEX reprezintă un furt intelectual sau nu.

În acest context, am petrecut câteva zile schimbând emailuri cu ceilalţi membri ai proiectului şi, în final, am pus licenţa GFDL (GNU Free Documentation Licence) pe baza de date. Ulterior, am înlocuit GFDL cu GPL (General Public License), care se aplică la fel de bine scopurilor noastre şi evită nişte neajunsuri ale GFDL (în privinţa traducerilor şi a incompatibilităţii cu unele distribuţii de Linux). Licenţierea bazei de date a rezolvat multe probleme de natură etică, dar şi tehnică:

  • Am demonstrat că scopul primar al DEX online este să-i ajute pe vorbitorii de limbă română, nu să obţină profit material.
  • Am preîntâmpinat crearea unei pieţe negre pentru baza de date. Este imposibil să împiedici copierea unei definiţii odată ce o afişezi pe ecran.
  • Am permis programatorilor să folosească baza noastră de date pentru diverse aplicaţii interesante, ei având garanţia că nu putem să ne răzgândim mâine şi să le spunem „accesul la baza de date nu mai este liber” (în acest sens, licenţa GPL protejează mai degrabă documentul decât pe autorul său).
  • Deşi relaţia noastră cu Academia Română are încă un semn de întrebare, cel puţin am eliminat orice alte părţi din această dispută.
  • Din punct de vedere etic, am oferit în mod liber rodul unui proiect care, la rândul lui, s-a folosit din plin de resurse libere şi gratuite (nu doar software, dar şi munca voluntarilor, găzduirea, lista modelelor de flexiune, dicţionarele de la firma Siveco sau -- de ce nu -- educaţia mea, pentru care n-am cheltuit niciodată vreun ban).

Proiecte externe bazate pe DEX online

Ca dovadă că decizia de a redistribui liber baza de date a fost bună, iată ce unelte externe folosesc baza de date a DEX online (numai cele despre care am aflat noi):

  • Clienţi pentru consultarea offline a bazei de definiţii (vezi secţiunea de unelte)
  • Dicţionar pentru telefoanele mobile: http://www.jarcraft.com/page.php?9
  • Corector ortografic pentru OpenOffice, Firefox şi Thunderbird: http://www.archeus.ro/lingvistica/CorectorOrtografic
  • Dicţionar de rime: http://stefann22.lx.ro/
  • Client de Google Talk: http://www.archeus.ro/lingvistica/CautareGTalk
  • Spânzurătoarea: http://www.roportal.ro/jocuri/joaca-online/54.htm

Momente semnificative

Nefiind împovărat de griji financiare sau de obiective pe termen lung, DEX online a avut o existenţă destul de liniştită. Din acest punct de vedere, mă bucur că DEX online a rămas în stadiul de proiect făcut în timpul liber. Au existat totuşi câteva momente când viitorul proiectului a fost foarte nesigur sau, dimpotrivă, când proiectul a avansat în salturi foarte mari.

În primul rând, după cum am arătat, începutul a fost greoi. Mulţi factori făceau proiectul să arate cam neviabil. Cuprindea cu totul cam 50 de definiţii. Nu era disponibil tot timpul, deoarece era găzduit pe calculatorul meu din cămin, pe care îl mai şi rebootam uneori în Windows ca să mă joc câte ceva. Iar aspectul grafic era de-a dreptul îngrozitor: în primii 2 ani, DEX oline nu a folosit nici un fel de CSS, pentru că nu ştiam ce este acela. Mai exact, când am început proiectul DEX online, ştiam doar în mare ce este aceea o „pagină dinamică”: un program care e de presupus să producă ieşire HTML, care este servită clientului. Restul (HTML, formulare HTML, MySQL, Perl / PHP) le-am învăţat din mers. DEX online avea un fundal violet, fonturi negre şi tabele cu chenare groase. În diverse browsere, diverse caractere Unicode apăreau mai mari, mai mici, mai groase decât caracterele ASCII sau erau înlocuite de pătrăţele. Probabil că dacă aş vedea astăzi o iniţiativă asemănătoare, aş cataloga-o drept neserioasă. Este admirabil că primii noştri voluntari au reuşit să vadă dincolo de prezentare şi să se axeze pe conţinut.

De un alt impas ne-am izbit în 2004, când am reuşit să luăm legătura cu editura care a publicat DEX ediţiile 1996 şi 1998 (motivul pentru care nu le-am scris mai devreme a fost că aveau un website făcut complet în Flash, neindexat, la vremea aceea, de nici un motor de căutare; nu aveau nici legături către site, deci nu i-am putut găsi). Prima reacţie a editurii când le-am prezentat proiectul a fost „trebuie să închideţi siteul acum, altfel veţi suporta consecinţele legale”. Ca urmare, prima măsură pe care am luat-o a fost să aplicăm licenţa GFDL pe date, pentru ca în cazul în care ar fi trebuit să închidem siteul, datele să aibă o şansă să se răspândească. Ulterior, am ajuns la concluzia că ediţiile 1996 şi 1998 ale DEX sunt 99% identice cu ediţiile 1984 şi chiar 1975, care, fiind publicate în perioada comunistă, nu conţineau nici un fel de informaţii de copyright. Editura nu şi-a dat nici până astăzi acordul expres pentru DEX online, dar nici nu ne-a mai pus beţe în roate şi îi suntem recunoscători pentru aceasta.

În septembrie 2004, DEX online a sărit brusc de la 65.000 de definţii la vreo 240,000. Firma Siveco, care deţine drepturile de copiere asupra mai multor dicţionare (de sinonime, de antonime etc.) ne-a acordat permisiunea de a le republica sub licenţa GFDL. Câştigul a fost substanţial, dar ne-a dat şi foarte mult de lucru în lunile următoare. Am muncit mult la scripturile care au importat aceste definiţii, dar chiar şi aşa datele au fost importate cu destule erori, care au trebuit depistate şi corectate manual. Paradoxal, mulţi dintre oamenii cu pregătire lingvistică din jurul DEX online consideră aceste dicţionare ca fiind slabe calitativ (nu neapărat prin definiţii incorecte, cât prin definiţii inconsistente, neînchiderea tranzitivă a setului de sinonime şi alte motive). Totuşi, la acel moment erau cele mai bune date pe care le aveam la dispoziţie. E drept că pentru 1% din căutări rezultatele sunt nemulţumitoare, dar eu consider că acesta este un procentaj foarte bun.

Un eveniment interesant s-a petrecut în noiembrie 2006, când a apărut primul dicţionar urban pentru limba română (http://123urban.ro). Băieţii de la 123urban au o misiune foarte coerent definită: de a continua consemnarea limbii române de acolo de unde a lăsat-o Academia. Efortul lor este unul necesar: cel de a documenta termenii din nişa argotică. Apariţia lor ne-a făcut şi pe noi să ne întrebăm care ne sunt, de fapt scopurile şi cât de departe suntem dispuşi să mergem pentru a ne îmbogăţi baza de cuvinte definite. O variantă de colaborare, din punctul nostru de vedere, ar fi fost să includem baza lor de date ca pe o „sursă” separată (cot la cot cu DEX, DOOM şi celelalte). Până la urmă, colaborarea nu s-a materializat şi nu am mai urmărit-o de atunci. Noi nu am fost siguri că moderarea lor şi sistemul lor de votare funcţionează bine. Dacă o persoană propune o sintagmă, dar nimeni nu o coroborează printr-un vot pozitiv, DEX online trebuie să accepte acea sintagmă sau nu? În plus, baza de date a 123urban nu este disponibilă sub o licenţă compatibilă cu GPL, ceea îngreunează colaborarea din punct de vedere tehnic şi principial.

Evoluţia generatorului de flexiuni

În prezent, DEX online oferă flexiunile majorităţii cuvintelor limbii române. Dar procesul prin care am ajuns la acest stadiu este un exemplu tipic de colaborare într-un proiect deschis. Încep cu un mini-glosar pentru lămurirea termenilor tehnici:

  • lexem: unitate lexicală; suport minim al semnificaţiei; pentru toate scopurile practice, este cam totuna cu „cuvânt”.
  • formă flexionară: formă modificată a unui cuvânt pentru a exprima un raport gramatical (număr, gen, timp etc.). De exemplu, copilul este o formă flexionară a lexemului copil.
  • paradigmă: totalitatea formelor flexionare ale unui cuvânt.
  • model de flexiune: paradigmă comună tuturor lexemelor care se flexionează la fel (de exemplu, a lucra, a forma şi a cresta au toate acelaşi model de flexiune). Este practic o clasă de echivalenţă.

În 2006 am început să ne gândim serios să adăugăm flexiuni la cuvintele din DEX online. Cel mai complex aspect este reprezentarea diferitelor transformări pe care le suferă un cuvânt. Flexionarea în limba română se face, în general, prin adăugarea unor sufixe, dar aceste sufixe pot fi foarte variate. Ca exemplu, pluralul substantivelor feminine poate fi format cu -e (case), cu -i (inimi), cu -uri (ierburi), cu -ele (acadele), cu -ale (macarale) etc. În plus, Limba română abundă în fenomene morfologice care transformă un sunet într-altul la aplicarea unei flexiuni. Exemple de transformări comune sunt t → ţ (bărbat → bărbaţi) sau o → oa (uşor → uşoară). Unele flexiuni suferă mai multe transformări (sămânţă → seminţe). În plus, dorim să stocăm şi informaţii despre accentul fiecărui lexem şi cum se mută el în timpul flexionării (a împrumutá → eu împrumút), ceea ce duce la o varietate exponenţială de modele de flexiune.

Prima versiune a generatorului de flexiuni, pe care am implementat-o fără să mă consult cu nimeni (şi rău am făcut), indica în forma de bază a cuvântului fenomenele morfologice care apar la flexionare. De exemplu, pentru bărbat stocam forma de bază bărbaT, unde T indică transformarea t →ţ. Pentru băiat stocam forma de bază băiAT pentru a indica transformările a → e şi t → ţ (băieţi). Această informaţie referitoare la fiecare cuvânt trebuia cuplată cu nişte meta-cunoştinţe referitoare la partea de vorbire. De exemplu, transformarea t → ţ nu se aplică decât la pluralul substantivelor (forma de singular articulat este tot bărbatul, nu bărbaţul).

Implementarea acestui sistem a fost relativ uşoară, dar concepţia a fost greşită. Cineva ar fi trebuit să treacă prin toate cuvintele limbii române şi să indice aceste fenomene morfologice. Volumul de muncă ar fi fost mic comparabil cu tastarea unui dicţionar întreg, dar ar fi fost oricum considerabil. Argumentul care a demolat complet această implementare a fost că ea nu putea reprezenta toate modelele de flexiune. În primul rând, numărul de fenomene morfologice depăşeşte cu mult numărul de litere şi simboluri Unicode convenabile pentru notaţie, iar în al doilea rând, flexionarea bazată pe sufixe este inerent ambiguă. De exemplu, roditor şi chior au acelaşi sufix -or, dar se flexionează diferit ( roditoare, respectiv chioară).

De-abia în acest moment am început să caut alte soluţii. Astfel am aflat că lista de forme flexionare exista deja de zeci de ani. Alf Lombard (1902-1996), un lingvist suedez, a prins drag de limba română şi i-a studiat gramatica în amănunt. După care a creat nişte aşa-numite „modele de flexiune”. Adică a împărţit cuvintele limbii române în clase de echivalenţă cu flexionare identică, atâtea câte a putut identifica. Pentru fiecare clasă, a ales un cuvânt-exponent căruia i-a înşirat explicit paradigma. Prin studierea transformărilor exponentului, se poate deduce paradigma altui cuvânt cu acelaşi model de flexiune. De exemplu, ceapă şi damigeană au acelaşi model de flexionare. Ceapă este exponent şi pluralul lui, definit explicit, este cepe. Observăm transformările ea → e şi ă → e. Prin analogie, pluralul lui damigeană este damigene. În final, s-a dovedit că limba română are cam 800 de modele de flexiune (circa 280 pentru verbe, 320 pentru substantive, 120 pentru adjective şi altele). Aceste modele au fost publicate în Dictionnaire morphologique de la langue roumaine, apărut în 1981.

De aici datele au fost preluate de F.R.Sc. Ei aveau nevoie de lista flexiunilor pentru a stabili dacă un cuvânt depus în timpul jocului de scrabble este corect. Au adus deci lista de modele de flexiune la zi, conform cu ultimele norme ortografice, şi au etichetat toate cuvintele nou intrate în limbă cu modelul corespunzător. Această listă exista în format digital, dar era menţinută manual, într-un fişier Word. Pentru concursurile de scrabble, arbitrul dispunea de două cărţulii tipărite: una cu cuvintele acceptate, etichetate cu modelul de flexiune, şi una cu modelele de flexiune desfăşurate explicit.

DEX online a preluat listele de la F.R.Sc., beneficiind aşadar, complet gratuit, de rodul unei munci de zeci de ani. Ulterior, am continuat să etichetăm multe alte lexeme pe care F.R.Sc nu le tratase, deoarece din cele 130,000 de lexeme din DEX online, numai jumătate provin din DEX, restul provenind din alte dicţionare de specific (în special de neologisme şi de arhaisme).

În prezent, lista de flexiuni are foarte multe aplicaţii utile:

  • Pe baza ei am generat un corector ortografic.
  • Ea permite căutarea „full-text”, care altfel nu ar putea funcţiona prea bine. În absenţa listei de flexiuni, am putea căuta „carte” prin tot textul definiţiilor, dar căutarea nu ar înapoia definiţiile care conţin textul „cărţi” sau „cărţilor”.
  • Ea ne permite să răspundem la un click pe orice cuvânt dintr-o definiţie, trimiţând la definiţia acelui cuvânt. Din nou, fără această listă nu am şti ce să facem când utilizatorul ar da click pe cuvântul „cărţi”, pentru că nu am şti care este forma de bază a cuvântului.

Pentru a ne revanşa faţă de F.R.Sc., am decis să creăm un subsistem al DEX online (numit intern Flex online) în care F.R.Sc. să poată gestiona, mai bine decât într-un fişier Word, lista de cuvinte acceptate. De exemplu, dacă se dovedeşte că două lexeme nu se flexionează chiar identic, sistemul permite spargerea unui model de flexiune în două, modificarea clonei şi reasignarea lexemelor într-unul din cele două modele. Când F.R.Sc. emite o versiune nouă a listei de cuvinte (la fiecare câţiva ani), sistemul Flex online le permite să compare cele două versiuni, ceea ce ajută la eliminarea erorilor.

Ce am învăţat din asta

Când cineva vă oferă ajutorul, faceţi-vă luntre şi puntre ca să-i creaţi condiţii de muncă. Colaboratorii nu cresc pe toate drumurile şi trebuie preţuiţi. Dacă cineva vrea să scrie cod pentru proiect, daţi-i acces la repository şi asiguraţi-vă că vă poate trimite patch-uri. Dacă vrea să raporteze bug-uri, asiguraţi-vă că aveţi un sistem gen Bugzilla. Dacă se oferă să vă creeze un skin sau o interfaţă grafică mai bună, asiguraţi-vă că există o separare bună între extragerea datelor şi prezentarea lor (respectiv, folosiţi un template engine). Dacă vă pune la dispoziţie date, luaţi-le. O bună parte din programarea pentru DEX online am petrecut-o scriind scripturi care să importe diverse documente. A fost plicticos, dar a meritat.

Briciul lui Occam este o regulă foarte bună pentru a delimita munca manuală de scripting. Dacă durează X ore să prelucraţi manual nişte date şi Y ore să scrieţi un script care să le proceseze automat, scriptul merită scris doar dacă X > Y. De nenumărate ori am depistat nişte erori sistematice în definiţiile din DEX, dar le-am corectat manual, una câte una.

Programarea este frumoasă, dar reimplementarea a ceva ce există şi funcţionează, doar pentru că nu v-aţi informat şi nu aţi întrebat pe nimeni, este o risipă de talent.

20% din oameni fac 80% din muncă. Fiecare ţine cont cum vrea de acest fapt. La DEX online am încercat să le creez condiţii şi celorlalţi 80% dintre voluntari, dar recunosc că nu am reuşit întotdeauna. De exemplu, mulţi dintre voluntari, deşi au dorit să ne ajute, nu au învăţat niciodată cum să formateze corect definiţiile (avem un mini-set de notaţii pentru bold, italic, exponenţi ş.a.m.d.). Practic trebuia să trecem prin toată definiţia, să-i adăugăm diacritice şi să o formatăm, ceea ce dura cam la fel de mult ca şi rescrierea ei de la zero. De la un punct încolo am renunţat să îi mai trimit la documentaţie -- le respingeam pur şi simplu definiţiile trimise.

În marea lor majoritate, oamenii sunt buni şi vor să ajute; foarte puţini sunt cei care încearcă să facă rău sistemului. Problema este că oamenii răi sunt mai perseverenţi, iar efectele pot fi foarte grave („dacă amesteci o linguriţă de bălegar într-un butoi de vin, obţii un butoi de bălegar”). Trebuie deci să fiţi pregătiţi să vă petreceţi o bună parte din timp scriind cod care nu creează conţinut util, ci previne vandalismul. Este supărător, dar cu timpul vă veţi obişnui. De exemplu, nici un programator nu se supără că trebuie să implementeze autentificarea cu parole, deşi acel cod este destinat numai să-i blocheze pe cei 1% dintre utilizatori care s-ar gândi să se lege în contul altcuiva.

Oricât de intuitiv de folosit este proiectul vostru, marea majoritate a utilizatorilor nu vor şti să-l folosească sau îi vor folosi numai un subset mic de funcţii. De exemplu, puţină lume dă click pe legătura către conjugări / declinări care apare după rezultatele căutării în DEX online. Trebuie să fiţi pregătiţi să răspundeţi la multe, multe întrebări. Este bine să aveţi un sistem semiautomat de gestionare a emailurilor, unde să puteţi crea şabloane, pentru că multe din întrebări vor necesita răspunsuri identice. DEX online foloseşte OTRS, dar există multe alte soluţii.

Faceţi-vă cât mai dispensabili. Cu cât proiectul este mai descentralizat, cu atât va evolua mai uşor. Să nu ajungeţi niciodată la stadiul în care nu vă puteţi lua o vacanţă că se duce totul de râpă. În general, dacă alţi membri ai proiectului au mai multă energie ca voi, aveţi datoria morală să configuraţi sistemul astfel încât să nu-i ţineţi în loc. La DEX online, unica componentă de care mă ocup singur este scrierea codului. Corectarea definiţiilor şi a lexemelor şi răspunsul la emailuri merg foarte bine (sau chiar mai bine) în lipsa mea.

Un proiect util nu este neapărat dificil din punct de vedere tehnic. DEX online este exemplul perfect în acest sens. Sunt puţine locuri în cod unde am avut nevoie să implementez un algoritm „deştept”. Poate un exemplu ar fi diff-ul între două versiuni ale unei definiţii, pe care până la urmă nici nu îl folosim la nimic în practică. Un alt lucru la care ne-am gândit destul de mult înainte de a-l implementa este schema bazei de date care stochează modelele de flexiune. În rest însă, DEX online excelează prin răbdare, prin volumul de date adunate şi prin calitatea voluntarilor implicaţi, dar mai puţin prin algoritmii şi structurile de date folosite.

Concluzia este că sunt oameni care vorbesc şi sunt oameni care fac. DEX online nu a fost creat în cel mai eficient mod posibil (am tastat de mână o mulţime de definiţii); nu excelează la nivel tehnic (baza de date conţine, în esenţă, nişte cuvinte asociate cu nişte definiţii şi cu nişte forme flexionare); a fost adesea luat în râs şi criticat, mai ales în primii 3 ani de existenţă; are şi acum suficiente greşeli de tipar; şi, fiind vorba de un instrument lingvistic, nu va fi niciodată complet. Dar, în ritmul nostru şi cu neajunsurile noastre, o mână de oameni cu multă răbdare am reuşit să producem un document remarcabil.

Era o vreme cand uram drumurile lungi, mai ales primele zboruri de avion Romania/California si inapoi. Stai acolo 16 sau 20 de ore pe scaun amortesti si te uiti la niste filme pe un ecran mic pe care abia se vede. Asta daca ai noroc. Dar ultimele cateva drumuri m-au facut sa imi schimb parerea.

Pe drumul ce l-am facut recent in Seul am citit o carte care am cumparat-o de ceva vreme si tot statea necitita prin casa, Blink de Malcom Gladwell. E destul de tare, v-o recomand. Pe drumul inspre Disney Land, anul trecut am citit Freakonomics. Acum vreo doi ani, cand trebuia sa merg pe tren opt ore la Suceava la pregatirile lotului, mi-au venit idei de vreo cinci sau sase probleme noi pe care le-am propus mai tarziu la diverse concursuri. Cam toate erau pe aceiasi tema (teoria grafurilor, brute force si optimizari pe biti), dar le-am folosit la concursuri diferite :). Cand mergeam in Spania la sfarsitul anului I de facultate, mi-am amintit sapte probleme pe care nu stiam sa le rezolv in liceu. Cand m-am intors acasa le rezolvasem pe toate. Probabil mai pot gasi si alte exemple ...

In weekend sau dupa munca parca ai chestii mai bune sau interesante de facut decat sa citesti o carte sau sa te gandesti la niste probleme. De exemplu sa te mai odihnesti, sa socializezi sau sa citesti cateva articole "bytesized" pe internet. O calatorie parca te forteaza sa te concentrezi fiind imobilizat intr-o anumita masura si neavand distrageri.

Ati avut si voi experiente similare? Eu abia astept cate un drum lung ...

Acum 10 ani am publicat un manual de Programarea calculatoarelor electronice (la Teora, dupa programa de atunci de clasa a X-a). Am scris atunci un epilog la acel manual, pe care editorii nu l-au inclus. Probabil considerau ca e nepotrivit. Le-am inteles decizia.

Editura InfoData din Cluj doreste sa republice acest manual al meu. Cartea se va numi "Tehnici de programare si structuri dinamice de date". Doresc (in numele meu personal, ca si al colaboratorului meu, editorul) sa va cer sfatul in privinta daca ar fi bine sau nu ca acest epilog sa fie inclus in carte.
Multumesc!

Bogdan Patrut

Epilog

Ne punem intrebarea, la finalul acestei carti: este utila o asemenea carte? Si daca da (sau daca nu), ne intrebam si de ce.

Cartea pe care o aveti in maini este un manual de Programarea calculatoarelor. Un manual se adreseaza unui grup oarecum restrans de cititori, prin insasi denumirea sa de manual. Aici, manualul se adreseaza elevilor de liceu (clasa a X-a) si profesorilor sai, care studiaza la clasele de informatica. Astfel de clase exista (si existau) in liceele de informatica, dar exista si in acele licee teoretice sau chiar industriale, economice si au aparut mai ales dupa Revolutie, din dorinta conducerilor liceelor de a atrage elevi buni in clasa a IX-a.

Cat de pregatiti au fost acesti elevi pentru viitorul lor dialog cu calculatorul e greu de stabilit. Cat de bine pregatiti pentru profesia pe care o vor urma la finele liceului, daca ea va fi in domeniul informaticii sau va avea in vreun fel sau altul tangenta cu informatica si calculatorul, vom vedea peste cativa ani.

Din experienta ultimilor ani de invatamant preuniversitar informatic se pot trage mai multe concluzii.

In primul rand, se observa ca foarte multi elevi doresc sa urmeze profilul informatica, chiar daca unii dintre ei nu au vazut sau nu au folosit vreodata un calculator.

Sunt multi altii care au avut posibilitatea de a folosi un calculator personal, fie la ei acasa, fie la serviciul unuia dintre parinti, fie chiar in scoala generala sau pe la vreun cerc de copii. Dar cati dintre acestia au trecut de stadiul de a vedea in calculator o simpla jucarie, poate cea mai scumpa jucarie? Putini. Dintre acestia, si mai putini au incercat sa utilizeze calculatorul, in sensul de a opera cu diferite programe utilitare, cu Windows, cu programe de grafica sau editoare de texte.

Acestia din urma ne bucura, deoarece ei sosesc in clasa a IX-a cu un bagaj de cunostinte si o experienta in folosirea calculatoarelor. Desi au fost acumulate dezorganizat, haotic (ceea ce presupune existenta unor mari lacune in cultura lor informatica), cunostintele pe care le au micii viitori informaticieni din clasele a IX-a le sunt de mare folos. Dar diferenta intre acestia si cei ce nu au folosit pana atunci un calculator devine repede nesemnificativa, chiar pe parcursul primului trimestru de liceu. Evident, a lucra cu un calculator nu e mare filosofie, iar copiii, care nu au atata teama, atata neincredere, ca adultii, ci dimpotriva sunt mult mai inventivi, mai curiosi sau mai increzatori, invata repede sa faca cine stie ce minuni cu un calculator electronic.

Multi copii vin la profilul informatica, crezand ca se vor juca la calculatoare. Pur si simplu! Altii viseaza ca vor explora o lume fascinanta nebanuita, ca in serialele stiintifico-fantastice, iar altii cred ca vor explora Internetul toata ziua.

Si scoala incepe. Vine profesorul de informatica si incepe sa le vorbeasca despre constante, variabile, expresii, tipuri de date sau despre instructiunea de atribuire. Elevii devin seriosi, crezand ca acesta e doar inceputul, ca urmeaza ceva fascinant.

Si, intr-adevar, acela era doar inceputul. Se preda instructiunea if, apoi entuziasmul elevilor incepe sa dispara. Cand se ajunge la while, deja unii nu mai inteleg nimic sau nu mai pot tine pasul.

E clar. Ceva se intampla. In orice caz, elevii isi dau seama ca informatica nu este o joaca. Sau cel putin programarea. E ceva ca la "mate". E ceva greu. Unii se apuca de carte. Altii prefera sa astepte prima ora de laborator, sau macar prima ora de Sisteme de calcul, unde parca e mai simplu. Si mai util. Da, mai util. Iata cuvantul magic.

Simtul practic este o caracteristica a generatiei actuale de elevi. Ei nu inteleg, nu accepta (in marea lor majoritate) sa invete ceva care nu le este de folos. Incercarea profesorului de a explica ca toate aceste lucruri pe care le preda sunt utile, pentru ca ele stau la baza tuturor produselor software realizate de firme americane sau internationale, nu duce la nimic. Elevul o tine tot pe a lui, argumentand cu replici care demonstreaza lipsa sa de motivatie intrinseca a invatarii.

E greu sa demonstrezi unui elev ce poti face cu toate if-urile sau while-urile pe care i le predai. Elevul te poate intreba: Stiti sa faceti un joc, domnule profesor? Dar un Windows sau macar o parte din el (sa zicem programul Notepad)?

E greu sa raspunzi la o asemenea provocare, e greu sa le raspunzi in general. Ajungi la finele clasei a IX-a si constati ca, la Algoritmi si limbaje de programare, nu mai lucrezi decat cu o treime din clasa. Restul se prefac ca inteleg sau ca invata, tu te faci ca ii asculti sau ca ii notezi.

Urmeaza clasa a X-a, unde la Programarea calculatoarelor continui cu materia de anul trecut, iar aici ii inveti si mai mult sa analizeze, sa gandeasca o problema. Pe cine? Pe doar cei o treime din clasa, care stapanesc sintaxa si semantica limbajului Pascal, care stiu sa ordoneze un vector sau sa determine cel mai mic element dintr-o matrice.

Ceilalti incearca sa invete pe de rost problema damelor sau sortarea prin interclasare, iar asta nu pentru ca nu au inteles algoritmul, ci pentru ca nu stiu sa-l transpuna in program. (In treacat fie spus, niciodata nu am inteles de ce considera ei atat de greu formalismul unui limbaj pentru implementarea unui algoritm.).

Din cei cu care ai ramas sa lucrezi, majoritatea incep sa scrie programe de grafica. Nimic rau in asta, unii ajung la performante deosebite, realizeaza jocuri, sunt premiati pe la diferite concursuri nationale sau interjudetene, dar se limiteaza doar la atat.

Mai raman cativa. Acestia, foarte putin la numar, sunt olimpicii. Pentru ei, materia de Programarea calculatoarelor este o pasiune. Insa, ei inteleg repede ce le predai, prin urmare va fi nevoie sa te abonezi la gazeta sau sa cauti carti cu probleme grele. Sau sa inventezi tu. Ei iti aduc satisfactia ca nu predai chiar la pereti.

Acestia sunt elevii care gandesc. Pentru ca ei sa fie stimulati sa-si foloseasca gandirea trebuie ca multumirea si satisfactiile lor sa nu fie doar acelea ale castigarii unui premiu la olimpiada, o excursie sau intrarea fara concurs la o facultate sau alta.

Pragmatismul lor cere altceva: cere o slujba in care sa-si foloseasca cu succes cunostintele si mai ales capul. Deocamdata asa ceva nu exista in Romania. De aceea pleaca. Stiti unde...

Ce fac ceilalti. Ceilalti termina liceul. Multi dintre ei au prins din zbor unele chestii care li se cer la locul de munca, acolo unde "cei de la firma" zic ca "am mai vazut eu dintr-astia de la informatica, care nu stiu nimic". Acolo ti se cere sa stii. Ce? Sa lucrezi cu nu stiu ce varianta de nu stiu ce program, care au aia nevoie acolo. Sau sa faci service, sa desfaci si sa asamblezi calculatoare.

Chiar daca inteleg sau nu programarea, elevii care termina informatica sunt o elita.

Unii au nevoie de cunostinte pentru slujbele lor viitoare. Altii au nevoie de slujbe pentru cunostintele lor.

Sa se auda acolo unde trebuie!

Bogdan Patrut

P.S. Am discutat despre lipsa de motivatie a elevului de a invata programarea. Nu am discutat, insa, despre motivatia profesorului de a o preda. Am fi raspus astfel la intrebarea: de ce pleaca tot mai multi tineri informaticieni din invatamant?

Mihai Scortaru, redactorul sef al Ginfo , a anutat ca revista isi intrerupe aparitia.

Pacat.

Dupa o pauza de un an, concursul Google Code Jam se relanseaza. Inregistrarea este deschisa pe siteul concursului tuturor celor peste 18 ani. De data asta nu va fi folosita platforma Topcoder ci concursul va avea personalitate lui. In loc sa trimiteti surse la un evaluator online automat, va trebui sa rezolvati niste seturi de date si sa trimiteti fisierele de ouput. Formatul acesta e destul de misto pentru ca va permite utilizatorilor sa foloseasca orice limbaj sau tooluri software pentru a rezolva problemele.
Proiectul a fost construit pe platforma Google App Engine ca parte a filozofiei "eat your own dog food". Aceasta are la baza ideea ca pentru a face un produs bun pentru clienti, primul client trebuie sa fii chiar tu. Pentru a gasi probleme interesante pentru Google Code Jam, s-a organizat un concurs intern de propus de probleme la care am participat cu destul entuziasm si sper ca din problemele mele sa se selecteze cateva care vor fi folosite. Au participat la concursul intern o gramada de nume cunoscute dintre topcoderii cunoscuti ce lucreaza la Google. Asa ca nu am nici un dubiu ca problemele din concurs vor fi deosebite si interesante.
Mars si-a folosit parte din timpul lui de 20% de la Google pentru a ajuta la partea de infrastructura a proiectului si la evaluarea calitatii problemelor, daca nu va place ceva el e de vina :), sau daca va intereseaza Google App Engine tot pe el il puteti lua la intrebari. Proiectul e foarte misto ca realizare si din prisma oamenilor care au lucrat la el, nu va pot spune mai multe nume, dar e un fel de "who's who" a concursurilor de programare din ultimii ani.

Sper sa participati si sa va vad in toamna pe cat mai multi dintre voi la finala din Mountain View!

In sfarsit Google lanseaza Chrome , un browser open source.

Lansarea a fost anuntata prin un comic book foarte misto facut, ce sumarizeaza bine feature-urile interesante ale acestui produs.

Chestia ce mi se pare mie cea mai utila este faptul ca fiecare tab este independent de celelalte ruland in un "proces" diferit. Asta inseamna ca daca un tab iti crapa poti sa il inchizi fara sa inchizi restul taburilor.

Browserul este construit peste WebKit un layout engine open source folosit de Safari (browserul Apple). Acest engine este destul de rapid si din cate am inteles e mult mai curat si mai usor de folosit pentru programatori, decat Gecko (layout engine-ul folosit de FireFox).

De asemenea Chrome are integrat un javascript engine numit V8 care se lauda cu o performanta foarte buna.

Eu consider ca acest proiect va fi un pas important in fata pentru lumea browserelor, o data prin cresterea concuretei si apoi prin faptul ca proiectul e open source iar ideile bune vor putea fi copiate si integrate rapid in celelalte broswere.

Nu ai destule permisiuni pentru acest macro.

In cel mai tare tech-talk de pe google video (350.000 de vizionari), Luis Von Ahn ne prezinta o metoda ingenioasa de a folosi oameni pentru a rezolva problemele dificile pentru un calculator. Metoda aleasa e inspirata din o practica a hackerilor. Acestia ii pun pe utilizatorii unui site deochiat sa scrie ce text contine un CAPTCHA inainte de a vedea urmatoarea imagine. Ei reusesc astfel sa treaca de protectia siteurilor de mail, obtinand astfel o gramada de casute din care pot trimite spam. Acum ii respect mai mult pe indivizi chiar daca nu respect motivatia lor.

Google a cumparat cu bani grei idea lui Luis si a implementat-o in Google Image Labeler . Poate de acuma il veti juca in loc de minesweeper :).

Aveti videoul aici. Dureaza o ora, daca nu aveti atata timp uitati-va neaparat la primele 15 minute ca nu trebuie ratat.

Microsoft promoveaza pe trilulilu concursul pentru elevi si studenti Imagine Cup. Concursul are sectiuni diverse precum cea de algoritmi, software design si embedded development. Studentii romani au obtinut rezultate destul de bune anul trecut, cativa calificandu-se in etapa finala a concursului desfasurata la Seul.

Puteti vedea un mic promo al concursului de anul acesta:

Trilulilu macro is deactivated

Aici un interviu cu echipa 921UBB finalista a sectiunii de software design:

Trilulilu macro is deactivated

(fac treaba buna colegii mei de la Babes :) )

Iar aici un interviu cu echipa TechOwls finalista a sectiunii embeded development (Liviu Ciortea, un membru al echipei, e si un utilizator vechi al comunitatii infoarena si a propus cateva probleme):

Trilulilu macro is deactivated

Imi place sa vad ca se promoveaza astfel de concursuri si studentii care obtin rezultate. Incercati si voi sa participati anul asta!

Prin scoala generala si apoi in liceu, credeam ca inteligenta unui om are un nivel maxim pana la care se poate ajunge, care prin oricata munca nu se poate depasi.

La sfarsitul liceului si inceputurile facultatii, prin 2002, m-am mai maturizat si eu si mi-am schimbat parerea. Cred ca in conditii intr-un mediu bun si cu o motivatie puternica poti progresa extrem de mult. Este mai important sa lucrezi bine si sa nu intri in rutina, decat sa lucrezi mult.

Am citit mai multe articole interesante legate de tema asta din care trei mi-au ramas in minte:

How to raise smart kids ne spune cum copiii care cred ca inteligenta poate fi antrenata evolueaza in timp mult mai bine fata de cei cu credinta ca inteligenta e o chestie nativa.

Teach yourself programming in ten years , scris de directorul pe cercetare de la Google, sustine ca performanta intr-un domeniu se atinge dupa multi ani de practica, si ne ofera ca exemple unii oameni considerati genii, cum au fost Mozart, Beatles sau Chaucer, ce au produs rezultate de nivel foarte inalt dupa mai mult de zece ani de activitate in domeniul in care erau experti.

Al treilea articol The Grandmaster Experiment este despre psihologul Polgar care si-a ajutat toate cele trei fiice ale sale sa devina maestre la sah. Polgar nu credea in notiunea de geniu, iar reusita lui demonstreaza intr-o oarecare masura acest lucru. Intr-o perioada in care se considera ca viziunea spatiala era una mai grea pentru inteligenta feminina, performantele celor trei fete au demonstrat contrariul.

Cititi toate trei articolele pentru ca merita.

Voi ce credeti? Este inteligenta o caracteristica mai mult nativa sau educata?

Odata cu angajarea mea la Google am avut ocazia sa cunosc multi fosti olimpici, pe care ii stiam doar dupa nume, vazandu-i in Ginfo sau in listele cu premii la diverse concursuri. Unul dintre acesti olimpici este Catalin Francu , caruia, la o cina in San Francisco, i-am smuls promisiunea ca va raspunde la cateva intrebari pentru ce avea sa fie blogul infoarena. Acum va voi prezenta prima parte a interviului, dupa o scurta prezentare a lui Catalin.
Catalin este cunoscut in lumea celor pasionati de informatica prin cartea "Psihologia concursurilor de programare", o carte plina de probleme frumoase si deschizatoare de drumuri la vremea ei, si prin "lista lu' Francu", o lista de discutii pe email, unde cativa dintre cei ce au ajuns apoi olimpici internationali la informatica ai Romaniei rezolvau si discutau probleme. Iar in lumea lingvistilor este cunoscut prin proiectul dexonline . Acesta este un wiki (inovator pentru 2001, cand Catalin a inceput proiectul) care contine intreg Dictionarul Explicativ al limbii romane si alte dictionare. In timpul liceului, Catalin a luat o medalie de argint la olimpiada internationala de informatica, iar in timpul facultatii s-a clasat pe locul 7 la etapa finala a concursului ACM ICPC cu echipa reprezentanta a MIT. De asemenea a facut parte din comisia stiintifica a Olimpiadei de Informatica a Europei Centrale din 2000 care s-a desfasurat la Cluj. Dupa terminarea facultatii Catalin a lucrat patru ani ca programator la Google inc.

In aceasta prima parte a interviului, Cata ne vorbeste de olimpiade, de cartea "Psihologia concursurilor de programare" si despre "Lista lu' Francu".

Cum ai inceput cu informatica?

Parintii mei au facut parte din primele generatii de la ICI, ceea ce si-a pus amprenta asupra mea si a fratelui meu. Prin clasa a 4-a am vazut prima oara un calculator ZX Spectrum. Mi-au placut mult jocurile, iar cu timpul am inceput sa ma intreb si cum sunt facute si daca as putea face si eu ceva asemanator. in clasa a 8-a, cand s-a pus problema sa-mi aleg un liceu, deja nu mai aveam dubii.

Erau alte discipline de care erai interesat in timpul scolii?

Da... in dictionar, langa definitia pentru "tocilar" este poza mea :) Am invatat multe prostii care acum imi dau seama ca au fost pierdere de vreme, dar unele materii chiar mi-au placut. De felul meu am fost atras de matematica si fizica. Muzica si biologia erau frumoase, dar erau predate foarte prost.

Cum si ce lucrai pentru olimpiade?

Generatia mea (promotia 1996) n-a avut foarte multe resurse la indemana. Circulau colectii de probleme din anii trecuti, dar comunicarea intre olimpici era de baza, pentru ca unul afla de un algoritm interesant si il raspandea. Manualele domnului profesor Sorin Tudor au fost multa vreme "Biblia" mea; de altfel consider ca la vremea lor au fost pur si simplu avangardiste (si nu stiu cati profesori se pricepeau sa predea notiunile pe care le contineau acele manuale).

Ce persoane au avut o influenta in formarea ta?

Parintii si fratele meu Cristi, in primul rand. Mi-amintesc ca eram prin clasa a 2-a, iar Cristi tocmai invata despre scheme logice si se chinuia sa mi le explice si mie. Mie imi placeau romburile cel mai mult, dar altceva n-am inteles. :) La liceu am avut multi profesori buni de informatica, dar in special doamna Rodica Cherciu si domnul Sorin Tudor. Este adevarat ca un profesor poate sa atraga sau sa sperie un elev, dupa cum isi preda materia. Nu in ultimul rand, la loturile de informatica au fost intotdeauna oameni deosebiti (elevi si profesori). in lumea olimpiadelor mi-am cunoscut multi dintre prietenii de astazi.

Mai tii minte probleme frumoase de la olimpiada?

Mi-a placut intotdeauna, pentru simplitatea ei, problema acoperirii tablei cu L-triominouri (Se da o tabla cu dimensiunea de 2^n \ast 2^n din care s-a eliminat un patrat. Se cere ca restul sa se acopere cu L-triominouri). Am pus de multe ori aceasta intrebare la interviuri la Google si putini au stiut sa o rezolve in 10-15 minute. Problema care m-a determinat sa ma apuc serios de studiul algoritmilor este "Se da un arbore neorientat. in fiecare nod se afla un bec. Initial toate becurile sunt stinse. Prin atingerea unui bec, el si toate becurile vecine isi schimba starea. Sa se identifice o ordine de atingere a becurilor astfel incat in final toate becurile sa fie aprinse."

Ce structura de date iti place cel mai mult?

E greu de raspuns la intrebarea asta. E mai important sa stii la ce e buna o structura de date decat sa-ti placa. De exemplu, am cunoscut oameni care nu suporta listele inlantuite si folosesc intotdeauna vectori, chiar si atunci cand au de facut insertii sau concatenari.
Cand folosesti Java si ambele structuri sunt deja implementate, si trebuie numai sa stii de ce tip sa declari variabila, aceasta reticenta este foarte daunatoare.

Pentru simplitatea implementarii, imi plac mult seturile disjuncte cu compresia caii (folosite, de exemplu, in algoritmul lui Kruskal pentru aflarea arborelui partial de cost minim). Analiza teoretica a complexitatii este foarte subtila.

Sunt olimpiadele folositoare?

Este iarba verde? :)

Cum e de partea cealalta a baricadei in concursurile de informatica, cand participi ca organizator?

Avem mai putin timp liber, pentru ca mereu e cate ceva de facut, dar satisfactiile si placerea sunt la fel de mari. Daca vreun student sau un profesor are un ceas liber, prefera sa implementeze o solutie pentru vreuna din probleme. Nu numai pentru ca e bine sa avem mai multe solutii pentru verificare, ci si din acea dorinta, care ne impinge pe toti la concursuri, de a ne masura fortele cu o problema noua.

Cum ti-a venit idea sa scrii "Psihologia Concursurilor de Programare"?

Domnul profesor Sorin Tudor a venit cu ideea sa-mi impartasesc cateva din experientele de la olimpiade. Pentru ca de aici nu aveau cum sa rezulte mai mult de 10-20 de pagini, m-am gandit sa adaug cateva structuri de date pe care le-am folosit destul de frecvent la concursuri si care nu erau discutate in manualele de liceu.

Cum ai ales structura cartii si problemele?

M-am gandit la cateva structuri de date, implementabile in timp de concurs, despre care elevii nu prea aveau de unde citi. Problemele alese fie exemplifica folosirea acestor tipuri de date, fie subliniaza unele alegeri care tin de psihologia fiecarui concurent. De exemplu, am gasit un algoritm greedy care merge pe toate exemplele mele, dar nu il pot demonstra matematic. il implementez sau nu? Sau am gasit un algoritm lent cu care stiu ca nu o sa iau punctaj maxim. il implementez sau caut altul mai bun?

Cat timp ti-a luat sa scrii cartea si cat de usor a fost sa o publici?

Cateva luni, dintr-o vacanta de vara pana prin noiembrie. Publicarea nu a fost o problema, deoarece ideea cartii a venit tocmai de la Sorin Tudor, care avea propria editura. Mai problematica a fost tiparirea, pentru ca la migrarea pe alt calculator si pe alta imprimanta, se dadea peste cap toata paginarea (pe vremea aceea nu auzisem de LaTeX, de PDF, sau in general de altceva in afara de Microsoft Word).

A meritat efortul?

Fara nici un dubiu! A fost una din primele mele slujbe platite, am castigat un ban facand ceea ce imi placea si a rezultat ceva palpabil si -- din cate aud -- folositor.

De ce ai inceput lista lui Francu?

In 1996 am inceput (sau mai degraba am continuat, de unde l-a lasat fratele meu) un mic cerc de informatica. Cu timpul am inceput sa corespondam si prin email. Emailurile au capatat valoare in sine si am creat o lista de discutii dedicata.

Cum a evoluat lista si discutiile de pe lista de-a lungul timpului?

La inceput, trimiteam probleme, asteptam o saptamana si corectam solutiile trimise. Perioada cea mai buna a listei, zic eu, a fost cand am introdus o notiune de "coeficient" (se numea DFCC si se masura in Dexteri). Dincolo de copilaria numelui, m-am straduit sa nascocesc un coeficient care scadea incet cu timpul, pentru a-i incuraja pe abonati sa trimita solutii la fiecare etapa.

De ce a murit?

Plecarea la MIT a fost "inceputul sfarsitului". Aveam mai putin timp liber si o vreme s-a ocupat Cristi Cadar de lista (de altfel, el a propus aproape jumatate din numarul problemelor). Ocazional au mai contribuit si alti "ilustri" ca Rodica Pintea, Valentin Gheorghita, Mihai Badoiu, Irina Dumitrascu, Bogdan Dumitru, Alex Susu...

Un alt motiv a fost ca elevii care au participat initial la cercul de informatica au absolvit liceul, ceea ce mi-a redus mie motivatia de preparator. :) si nu in ultimul rand a fost aparitia altor site-uri, romanesti si internationale, dedicate problemelor de programare, cu evaluatoare automate etc. Ma bucur mult ca infoarena.ro incorporeaza majoritatea problemelor propuse pe lista, pentru ca ne-am gandit mult la ele si ar fi fost pacat sa se piarda.

A doua parte a interviului va fi publicata in curand.

In contextul interviului cu Cata (cum ii zic prietenii), infoarena are doua proiecte unde este nevoie de ajutorul vostru. Unul este transcrierea cartii "Psihologia concursurilor de programare" in format textile. Altul ar fi cel de transformare a problemelor din Lista lu' Francu in formatul infoarena si de adaugarea lor in arhiva (au mai ramas vreo 10 probleme de adaugat). Aveti mai multe detalii aici si aici .

In poza de mai sus apar Cristi Strat , 'maestru' Catalin, eu , iar cenzurati sunt doi ilustrii necunoscuti :), se dau puncte de karma pe forum pentru cine ii identifica pe cei doi.

In aceasta a doua parte a interviului, Catalin ne povesteste despre MIT, dexOnline, Nilatac, Google si alte lucruri foarte interesante. Daca ati ratat prima parte a interviului, citi-o aici .

De ce MIT si nu alte scoli din state sau din Romania?

Pentru ca MIT-ul a fost singura universitate care m-a acceptat (privind in urma, am avut un noroc fenomenal). La Politehnica din Bucuresti am facut trei ani de zile si au fost cursuri dupa care m-am dat in vant (de exemplu, cel de Structuri de Date si Algoritmi sau cel de Limbaje Formale si Translatoare). Totusi, erau mult prea multe alte cursuri care nu aveau ce cauta in programa obligatorie si pur si simplu am zis ca nu mai vreau sa invat lucruri inutile.

Care au fost cursurile tale preferate in facultate? Ne poti face si o descriere pe scurt?

De la MIT, mi-a placut in mod deosebit cursul de Securitatea Calculatoarelor si Retelelor, care a trecut prin subiecte ca one-way functions, chei publice/private, cookie-uri, spyware, virusi, semnaturi digitale, certificate si multe altele.

Ce cursuri ti-au fost folositoare in viata de programator?

Eu sunt de parere ca practica intr-o companie este foarte deosebita de teoria invatata in scoala. Am luat cursuri de criptografie, algoritmi de aproximare, procese stocastice, probabilitati, limbaje formale si niciunul nu mi-a folosit in mod direct. Mi-ar fi folosit daca as fi scris un client de ssh sau un sistem de modelare financiara, dar nu am avut ocazia sa aplic atat de direct lucrurile invatate la un curs. Indirect, insa, toate mi-au fost folositoare pentru ca m-au invatat concepte noi si, cand m-am izbit de o problema noua, a fost mai usor sa o reduc la ceva cunoscut. De exemplu, nu-mi mai amintesc toti algoritmii studiati la cursul de criptografie, dar mi-au ramas notiuni fundamentale de algebra modulara si teoria numerelor, de care m-am tot izbit in practica.

De cati ani esti in USA?

Din 1999.

Te simti ca acasa aici?

Cred ca oriunde traiesti mai mult de o luna - doua devine acasa.

De ce ti se face dor?

In primii ani petrecuti in America, mi-era dor de Romania. Acum, pe langa asta, cand sunt in Romania mi-e dor de locurile si de prietenii de aici. Cu alte cuvinte, din cauza ca am trait si sunt legat de doua locuri, oriunde m-as duce mi-e dor de ceva. :)

Te vei mai intoarce vreodata in Romania?

Categoric! Ne-am straduit foarte mult sa ne intretinem relatiile personale din Romania.

Ce e dexOnline?

Pentru oameni, este un dictionar explicativ roman online. Pentru mine, este cea mai mare realizare profesionala a mea.

Cum ai inceput cu acest proiect?

In vara lui 2001, am adus cu mine din Romania un dictionar explicativ (DEX). Pe de alta parte, foloseam intens Webster, dictionarul explicativ englez online. M-am gandit ca ar fi cazul sa existe si o pagina similara pentru limba romana.

La acea vreme, eu nu aveam practic nici una din cunostintele necesare. Stiam putin HTML si aveam o idee despre ce inseamna o pagina dinamica, dar cam atat. Restul, PHP, Apache HTTP, MySQL, CSS, template-uri Smarty si altele le-am invatat cu timpul.

Cat timp crezi ca ai petrecut scriind cod pentru proiect?

Mi-e greu sa fac o estimare. Lucrez de sase ani si am avut saptamani in care n-am facut nimic, saptamani in care am scris cod 30-40 de ore pe saptamana si saptamani in care m-am ocupat de treburi care tin de DEX online, dar nu de programare (de exemplu, introducerea sau moderarea de definitii). Nici numarul de linii de cod nu este o masura buna, pentru ca am aruncat mai mult decat am folosit (de exemplu, prima versiune a serverului era scrisa in Perl).

Care este cel mai frumos moment legat de dexOnline pe care l-ai trait?

Cred ca a fost in 2004, cand echipa a terminat de introdus DEX-ul. Era doar un inceput (20% din numarul de definitii si mult mai putine functii pentru cautare decat azi), dar am simtit cu totii o satisfactie enorma pentru ca am muncit mult si pentru ca toata lumea ne credea nebuni. Astazi avem mult mai multe definitii, DEX online stie sa flexioneze cuvinte, de curand am adaugat si cautarea full-text si realizarile astea pot umbri putin acel prim pas. Dar fara el n-am fi ajuns unde suntem azi.

Spune-ne alt proiect interesant la care ai lucrat.

Am scris un motor de anti-sah pe care l-am botezat "Nilatac" (nu prea creativ, dar e prea tarziu sa-l mai redenumesc). Anti-sahul este o varianta de sah in care captura este obligatorie, iar scopul este sa iti pierzi toate piesele (inclusiv regele, care nu are un statut special). Voiam sa scriu un program de sah care sa stea conectat la FICS (http://freechess.org) si mi-am ales varianta asta, anti-sah, pentru ca era mai simplu de implementat: nu exista sah, nu exista rocada, iar regele poate fi capturat. Spre surprinderea mea, am descoperit ca varianta nu este lipsita de complexitate si frumusete. Jucatorii de varf spun chiar ca anti-sahul se poate masura cu sahul in complexitate.

Am lucrat la Nilatac din 2001 pana prin 2005 si la inceput singurul algoritm pe care il stiam era alpha-beta. Am scris un program cu acest algoritm, l-am conectat la FICS foarte sigur pe mine si... surpriza: multi jucatori umani il bateau frecvent, iar calculatoarele nici nu discutau cu el. Asa am fost silit sa invat multe alte tehnici, de la carti de deschideri pana la tabele de finaluri si de la o reprezentare mai eficienta a tablei de joc (rotated bitboards) pana la un algoritm complet nou de cautare a arborelui de joc, (Proof Number Search).

O particularitate interesanta este ca arborele de joc pentru anti-sah este mai mic decat cel pentru sah, din cauza ca initiativa este foarte importanta si o greseala poate duce la pierderea fortata a jocului (cel care a gresit o data poate fi obligat sa captureze piesa dupa piesa pana pierde partida). Din aceasta cauza, lumea spera ca jocul poate fi rezolvat complet. Dupa mutarea 1. e3, se pare ca negrul nu are un raspuns care sa echilibreze partida. Mi-am adus si eu o mica contributie, rezolvand cateva linii din deschidere, iar acum codul si cartea de deschideri sunt disponibile pe internet.

Cum ai ajuns la Google?

Am fost acceptat ca intern in 2001, la recomandarea fratelui meu si a advisorului meu de la MIT. in 2002 m-am angajat propriu-zis, dupa ce am absolvit facultatea.

Cum a fost viata de programator la Google? Ce iti placea cel mai mult?

Disciplina programarii era extraordinara. Cu totii stim ca e bine ca, atunci cand dai peste un bug in cod, nu e bine sa-l ignori. Fie il repari, fie il raportezi autorului, fie cel putin introduci un raport in bugzilla. Dar la Google lucrul asta chiar se intampla :) Cand scrii o functie noua, care poate fi folositoare si altor echipe, nu pui codul in modulul echipei tale, pe care celelalte echipe nu il folosesc, ci in modulul comun. Lucrul asta cere mai mult timp, pentru ca trebuie sa compilezi si sa rulezi teste suplimentare, dar este atitudinea corecta si Google o incurajeaza.

In general, mi-a placut filozofia lor de a face lucrurile bine din prima, chiar daca dureaza mai mult. Fiecare linie de cod trebuie vazuta de cel putin inca o persoana in afara de autor. Asta ridica probleme cum ar fi ca, dupa ce termini de scris o bucata de cod si i-o trimiti unui coleg ca sa ti-o revizuiasca, dureaza cateva ore pana primesti raspunsul si trebuie sa-ti gasesti altceva disjunct la care sa lucrezi pana atunci. Dar beneficiile sunt mari, pentru ca multe buguri sunt gasite inca inainte de a fi adaugate la repository.

De ce ai plecat?

Am vrut sa am o perioada mai lunga in care sa ma pot ocupa cu norma intreaga de DEX online si de alte proiecte personale (programare, dar si din alte domenii).

De ce programare si nu cercetare?

Probabil tot Google e raspunsul. :) M-ar fi atras un Ph.D. si o cariera academica, dar mi-a fost imposibil sa dau cu piciorul ocaziei de a lucra la Google.

Cum e organizat mediul in care lucrezi? Ce configuratie de calculator? Ce sistem de operare, ide, etc.?

Ca sistem de operare, am pornit cu RedHat in 1999 si am continuat pe aceeasi linie (azi rulez Fedora). M-am tot gandit sa incerc si alte distributii, dar viata parca e prea scurta ca sa o pierzi instaland sisteme de operare... Un IDE nu folosesc, pentru ca nu exista unul bun pentru dezvoltare de pagini de web. As vrea ceva cu suport pentru PHP, HTML, CSS, MySQL, Javascript si, desi am incercat Eclipse si IntelliJ, niciunul nu pare sa se potriveasca. Asa ca am ramas tot in stadiul de terminal text + emacs si nu pot sa zic ca imi lipseste ceva.

Poate un lucru amuzant e ca n-am avut niciodata un CD sau DVD de instalare pentru Fedora. intotdeauna am creat un CD minim de boot, dupa care instalarea propriu-zisa am facut-o prin retea.

Ce calitati are un programator bun?

Lucrurile astea le-am invatat si eu de-abia dupa ce am iesit din scoala si am inceput sa lucrez la Google. Descoperi ca una este programarea de olimpiada sau o tema de facultate, unde practic lucrezi ca un hamster intr-un acvariu, si cu totul altceva este lucrul intr-o echipa. Bunaoara, un principiu de baza la Google era ca, daca cineva vine si te intreaba ceva, trebuie sa-ti faci timp sa-i raspunzi, chiar daca si tu ai proiectele si termenele tale. Este mai bine sa aveti amandoi un randament de 80-90% decat sa ai tu un randament de 100% si colegul tau sa nu stie ce are de facut.

La fel, este important sa comunici cu restul echipei, sa stii la ce lucreaza ceilalti si ceilalti sa stie la ce lucrezi tu, nu neaparat la nivel de ora sau zi, dar cel putin la nivel de saptamana. Este important ca toata lumea care lucreaza la un proiect sa adopte acelasi stil de formatare a codului. Un programator bun trebuie sa poata citi codul altuia si sa incerce sa-si faca codul cat mai inteligibil de catre altii (graba nu este un motiv sa nu adaugi comentarii acolo unde codul nu este evident).

Desigur, si calitatile individuale sunt importante. Trebuie sa fii ordonat ca sa-ti poti citi propriul cod dupa cativa ani. si asta cere efort, pentru ca peste cativa ani practic vei fi o cu totul alta persoana si de regula una mai inceata la minte. :) Trebuie sa nu-ti fie frica de un limbaj nou, dar nici sa nu extragi doar strictul necesar din el. Bunaoara, multa vreme dupa ce am invatat Java, m-am ferit sa folosesc mecanismul de exceptii. Cu timpul, le-am inteles avantajele si am invatat sa le folosesc pentru a face codul mai frumos si mai robust. De asemenea, trebuie sa ai rabdarea sa te gandesti de doua ori inainte sa implementezi o data.

Care sunt siteurile tale preferate?

Ca tot romanul, citesc stirile din sport in fiecare zi :) Pentru asta, ma duc la http://onlinesport.ro. Citesc stirile pe http://hotnews.ro si pe http://news.google.com. Evident, de cautat caut cu Google, probabil de vreo suta de ori pe zi, dar asta nu punem la socoteala, e ca si cum ai scrie in CV ca stii sa scrii si sa citesti. Daca am nedumeriri despre Fedora si caut pe Google, de cele mai multe ori ajung la http://fedoraforum.org, care are mereu raspunsurile
potrivite. Pentru generalitati, cel mai des folosesc Wikipedia, un site in fata caruia DEX online pur si simplu paleste.

Ce programe iti fac viata mai usoara?

M-am gandit destul de mult la intrebarea asta si am ajuns la concluzia ca nu prea mai sunt programe care sa imi faca viata mai usoara. Exista website-uri fara care m-as simti legat de maini, cum ar fi http://maps.google.com cand vreau sa merg undeva. Dar ca software instalat pe calculator, nu cred ca imi trebuie mai mult decat un sistem standard, de genul Linux + Firefox + OpenOffice.

Ce hobbyuri ai inafara programarii?

Imi place muzica corala (mi-am si petrecut catva timp culegand niste partituri corale cu un software specializat, numit Lilypond). imi place si sahul, desi ma deprima ca joc mai prost decat in liceu, fiindca am mai putin timp liber. si imi plac jocurile pe calculator (desi asta e o afirmatie foarte generala, pentru ca evident sunt jocuri care imi plac si jocuri care nu imi plac).

Ce va urma?

Restul vietii mele :) E o intrebare foarte generala, dar intamplarea face ca vine la un moment bun. Am luat decizia ca 2007 este ultimul an in care mai lucrez la DEX online. De anul viitor vreau sa incep ceva nou, tot legat de programare, si sunt in cautare de idei.

Vrei sa lasi un mesaj cititorilor blogului?

Cred ca noi toti cei pasionati de informatica avem un noroc formidabil. Este una din cele mai palpitante meserii si cine are putina rabdare si disciplina poate produce multe lucruri folositoare si/sau distractive. Asa este si infoarena.ro: este un site cu un continut valoros si cu o comunitate pe masura.

Daca ne gandim la cate lucruri ne ofera internetul si informatica de-a gata, cred ca e bine sa incercam sa si oferim ceva inapoi. Sunt convins ca toti utilizatorii infoarena au mici proiecte personale (in engleza sunt numite atat de distractiv "pet projects") si i-as incuraja pe toti sa le ofere restului lumii ca software liber.
<br>
Multumim pentru interviu!

Nu ai destule permisiuni pentru acest macro.

Va spuneam in un blog post anterior despre interviul pe care l-am dat impreuna cu Mihai Stroe si Cristi Strat pentru Evenimentul Zilei. In articol nu au aparut raspunsurile interviurilor in totalitate. Si cum v-am promis, va redau pentru inceput interviul cu Mihai Stroe.

1. Scurta prezentare

Mihai Stroe a absolvit Facultatea de Calculatoare din Universitatea Politehnica din Bucuresti, unde a terminat si programul de Master. Experienta sa cuprinde participarea la numeroase concursuri nationale si internationale de programare intre 1995 si 2004, initial in calitate de concurent, iar apoi ca organizator. Mihai a inceput ca programator la Google in iunie 2004, dupa terminarea Master-ului. In cadrul companiei, a lucrat la cateva proiecte pentru imbunatatirea infrastructurii Google si a calitatii rezultatelor motorului de cautare.

Dupa aproape trei ani petrecuti la sediul principal din Mountain View, California, Mihai s-a transferat la biroul din Zurich in 2007. In prezent are functia de Technical Lead / Manager.

2. In Romania, un job la Google este insotit aproape intotdeauna de un soi de admiratie ce nu are nevoie de argumente. Cat de greu este de fapt sa ajungi acolo?

Selectia este foarte serioasa, si nu este usor sa obtii un job. Pe de alta parte, cred ca avem mai mult de 100 de angajati romani, iar vara aceasta am avut 20-30 de studenti romani care au facut stagii de trei luni la Google, venind de la universitati din tara sau din strainatate. Aceste cifre demonstreaza valoarea programatorilor romani.

3. Ce te motiveaza sa faci ceea ce faci?

Pentru mine, cea mai importanta motivatie este faptul ca proiectele la care lucrez sunt vizibile in exterior si ajuta milioane de utilizatori in fiecare zi. De exemplu, am adus imbunatatiri la motorul de cautare, si am dezvoltat functionalitate pentru Google Toolbar si pentru Google Chrome, noul nostru browser care a fost lansat sapatamana aceasta.

4. Este Google tinta ultima a oricarui programator? Se poate mai bine de atat?

Pentru mine este locul ideal. Oamenii cu care lucrez sunt foarte bine pregatiti. Proiectele sunt interesante. Daca avem idei care pot avea un impact puternic asupra companiei, suntem incurajati sa le dezvoltam. Bineinteles, recompensele sunt pe masura realizarilor si angajatii cu performante deosebite pot avansa repede in cariera. In plus, Google este una din companiile care influenteaza puternic dezvoltarea Internetului. In momentul de fata sunt convins ca peste 10 ani ma veti gasi tot la Google.

5. Stim chiar de la Google ca mediul de lucru este unul foarte relaxat. Nu cumva flexibilitatea asta inseamna o responsabilizare a angajatului?

Intr-adevar, mediul de lucru este flexibil - dar ritmul de dezvoltare este alert. In general lucram in echipe mici, de 3 pana la 10 angajati; proiectele mari sunt impartite in mai multe echipe. Angajatii sunt motivati si se sustin reciproc.

Accesul la informatie in cadrul companiei este foarte bine pus la punct. Astfel, imi este foarte usor sa aflu ce anume se intampla in oricare alt proiect, ceea ce imi permite sa contribui cu idei si sa identific persoane care m-ar putea ajuta in proiectele proprii.

In plus, creativitatea este incurajata; angajatii pot petrece 20% din timpul de lucru (de exemplu o zi pe saptamana) in cadrul unui alt proiect decat cel principal, la alegere. De asemenea, putem folosi acest timp pentru a dezvolta o idee proprie. In momentul in care este clar ca ideea va avea succes,
se formeaza o echipa care poate sa o realizeze. Aceasta strategie a condus la dezvoltarea unor proiecte importante, cum ar fi Google News.

Personal, am folosit aceasta flexibilitate pentru a incepe, dezvolta si conduce unul din proiectele la care lucrez, bazat pe o idee proprie. In momentul de fata, la acest proiect lucreaza 8 angajati.

Dupa ce ideea respectiva a devenit proiectul meu principal, 20% din timpul meu de lucru a ramas in continuare flexibil. M-am folosit de acest lucru pentru a organiza cursuri de pregatire pentru noii angajati si prezentari ale companiei la doua universitati din Romania.

6. Ce (mai) inseamna Romania pentru Mihai Stroe? Iti doresti sa te intorci?

Vizitez Romania foarte des; anul acesta voi avea probabil 7-8 vizite. Familia si o mare parte din prietenii mei sunt in Bucuresti, iar familia sotiei mele este la Cluj, deci avem legaturi puternice cu Romania. Pe termen lung sunt sanse mari sa ramanem in Elvetia - dar drumul de la Zurich la Bucuresti sau la Cluj nu este chiar atat de greu de parcurs...

7. Daca maine s-ar infiinta un birou Google in Romania, ai veni sa lucrezi aici?

As veni pentru cel putin 6-12 luni, sa ajut la formarea si pregatirea grupului din Romania.

8. Ce sfaturi i-ai da unui tanar roman care vrea sa lucreze la Google?

Depinde de pregatirea din momentul actual. De exemplu, pentru mai multi romani care au participat la concursuri internationale de programare, nu a fost extraordinar de dificil sa ajunga la Google - dar aceasta nu este o conditie necesara.

Cred ca o buna pregatire generala in informatica, mai ales in algoritmi si sisteme distribuite, impreuna cu un nivel foarte avansat de pregatire in unul din domeniile care ne intereseaza, sunt importante pentru succes.

Pentru mai multe detalii, puteti accesa www.google.com/jobs

Testarea pentru selectie este foarte serioasa, si unii candidati valorosi nu reusesc sa obtina o pozitie in cadrul companiei - dar asta nu inseamna ca ar trebui sa fie dezamagiti, exista si alte oportunitati.

9. Sunt convins ca foloseai motorul de cautare inainte sa intri in companie. Obiectiv vorbind, de ce e cel mai bun de pe piata?

Parerea mea este ca rezultatele cautarii pe Google sunt superioare rezultatelor produse de alte motoare de cautare. Motorul de cautare este cel mai important proiect din companie si avem un numar mare de echipe care aduc imbunatatiri.

Ca realizari importante, din ultima perioada, as remarca modul in care sunt combinate mai multe tipuri de informatie. De exemplu, pe www.google.com, rezultatele pentru interogarea "Marea Neagra" pot include pagini web, imagini si continut video.

Ca fapt divers, in 2004, dupa ce am fost acceptat pentru interviuri, am contactat cateva zeci de prieteni si i-am intrebat ce motor de cautare folosesc. Toti cei intrebati, fara exceptie, au raspuns "Google".

10. Cum crezi ca ar fi aratat lumea fara Google?

Google a avut contributii majore la dezvoltarea aplicatiilor Internet si la organizarea informatiei disponibile online. Cand spun aceasta, nu ma refer numai la motorul de cautare; am obtinut rezultate similare in mai multe domenii.

De exemplu, inainte de lansarea serviciului Gmail in 2004, principalele servicii de e-mail ofereau cativa MB de spatiu de stocare, iar cautarea era ineficienta. Gmail a schimbat aceste lucruri, oferind in momentul lansarii 1 GB de stocare (de cateva sute de ori mai mult) si perfectionand cautarea, iar in timp, celelalte servicii s-au adaptat.

Sunt convins ca Google Chrome va duce la progrese similare in domeniul browserelor. In viitor ne putem astepta la multe alte imbunatatiri.

Saptamana viitoare voi publica interviul cu Cristian Strat

Acum zece zile am publicat prima parte a interviului cu Mihai Patrascu . A venit timpul sa publicam si partea a doua. In ea Mihai ne vorbeste de olimpiade, de modul lui de lucru si de interese in afara programarii:

Cum ai recomanda cuiva sa se antreneze pentru concursuri sau sa se pregateasca pentru cercetare?

Cred ca cel mai eficient e sa ajungi sa programezi suficient de bine, si apoi sa te concentrezi pe gandirea teoretica la probleme. De prin clasa a 10a nu programam decat cateva zile inainte de olimpiada sa-mi intru in mana. Restul doar ma gandeam dar nu implementam (economiseste mult timp la pregatire).

Din cauza asta nu am fost niciodata un programator prea rapid... In plus capacitatea mea de debug este aproape nula, asa ca preferam sa scriu foarte incet si fara buguri. N-as avea niciodata sanse la un concurs ca ACM sau top coder :)

Care e secretul reusitei la concursuri sau in cercetare? caracteristicile native, educatia profunda, munca depusa?

Clar ca fara inteligenta nu se poate :), dar toti oamenii care ajung sa faca ceva la olimpiade sunt foarte inteligenti. Cred ca ce face diferenta la un nivel inalt e atitudinea personala. In mod constant erau oameni in lot pe care ii consideram mai destepti decat mine, dar eu eram mai hotarat sa castig, lucram mai mult cand trebuia sa lucrez, ma relaxam mai mult cand trebuia sa ma relaxez etc. Nici ceilalti concurenti, nici comisia nu sunt cu un cap mai sus ca tine -- daca tu ai incredere ca esti tare, atunci chiar esti mai tare.

Cum abordezi o problema, ai o reteta standard (generalizare, simplificare, trecerea prin o lista de tehnici) sau ai cate un "aha" moment?

Nu, simt ca intotdeauna imi vin idei dubioase si fara explicatie. Problemele la care ma prindeam cel mai greu erau chestii clasice ca flux, cuplaj, etc -- pana sa ma gandesc ca de fapt poate se foloseste ceva standard imi lua ceva timp.

Cum se compune o problema de olimpiada?

Foarte greu... Am un dispret pentru problemele bazate pe materie avansata. Ne trebuie probleme noi, cu o rezolvare elementara, nu bazate pe ceva care inveti la facultate. Problemele trebuie sa fie cu adevarat concurs de perspicacitate, si ar trebui sa fie la fel de grele pentru un concurent din liceu si pentru un prof care studiaza algoritmi de 50 de ani... Din pacate, e greu de gasit astfel de probleme, si nu am propus prea multe probleme.

De ce nu ai continuat cu concursurile de programare in timpul facultatii?

Concursurile mi se par prin definitie ceva pentru liceu. La nivelul ala inca inveti, si e bine ca ceva sa te motiveze sa inveti, in timp ce iti ascuti inteligenta in domeniu. La facultate stii mai multe, si pot sa faci alte chestii mai important pentru tine si pentru omenire... Poti sa te angajezi, sa lucrezi in cercetare, etc. Poti sa-ti faci un renume la inceput cu IOI, dar pana la urma succesul in viata depinde de alte chestii.

Asta gandeam inca din liceu, asa ca mi-a fost usor sa renunt. In treacat fie spus, am fost de 2 ori la ACM din inertie, o data cu Craiova, si o data la MIT. Amandoua esecuri lamentabile :) Cu echipa din Craiova problema era ca nimeni nu programa suficient de repede (in frunte cu mine). Cu MIT problema a fost interactiunea mea cu autoritatea :) -- am iesit primul la concursul individual, dar echipa s-a format din locurile 2,3,4 la decizia profilor coordonatori.
Razbunarea mea a fost ca anul ala MIT-ul nu s-a calificat la regionala ;)

La ce alte proiecte software ai lucrat?

Singurul proiect mai mare care l-am facut a fost evaluatorul pentru olimpiade (nu stiu daca se mai foloseste, dar s-a folosit la BOI la Iasi si la cateva nationale). Restul totul au fost programe mici pt olimpiade. Si cand am lucrat pentru companii, am lucrat pe directii de cercetare unde nu trebuie decat programe mici prototip care sa testeze o idee.

Ai vreo metoda dupa care iti imparti timpul sau lucrezi cand si cum ai chef?

Eu profit de libertatea din cercetare pana la punctul unde enervez pe toata lumea :) Daca n-am chef sa fac nimic saptamana asta, nu fac nimic saptamana asta. Ma duc la munte, citesc ceva, nu conteaza. Cand lumea munceste la o lucrare (care implica finalizat tot felul de detalii si scrisul propriu-zis), eu de obicei fac misto de ei :) De obicei nu reusesc nici macar sa scriu pe hartie niste calcule.

Dar daca am o idee de rezolvare in cap si vreau sa scriu o lucrare pentru o conferinta, am o reteta standard. Cu 2-3 zile inainte de deadline, imi iau periuta de dinti, 10-15 sticle de Pepsi Diet, cateva kg de prajituri, si ma duc in birou. Si acolo petrec cele 2-3 zile lucrand (am determinat ca rata optima de somn in birou e cam 2h pe zi). Adrenalina e foarte interesanta.

Citesti bloguri/frecventezi forumuri? Spune-ne cateva exemple.

Chiar am si eu un blog la http://infoweekly.blogspot.com/, in care discut probleme de cercetare in algoritmi. Cred ca unele chestii ar putea fi interesante pentru studentii la olimpiade in ani mai mari, care vor sa se decida ce vor sa faca in viitor. Pot sa vada cateva probleme si sa vada daca ii tenteaza teoria.

De citit, citesc cateva bloguri din teorie, dar nu cu prea multa pasiune (doar ca e util sa te tii la curent). La forumuri nu particip.

Ce interese, hobbyuri, pasiuni care nu sunt legate de programare ai?

A, multe... Desi intotdeauna stau rau cu timpul, asa ca fac mai putine decat as vrea. Imi place foarte mult sa calatoresc, si acum pot sa fac asta cu toate conferintele la care ma duc (am ajuns in 28 de tari pana acum). Imi place sa vorbesc cu lumea, sa descopar culturi noi, si imi place sa citesc mult despre istorie.

Periodic descopar pasiuni pt un nou sport. In liceu mergeam pe munte si jucam badmington, apoi am facut alergari (era o vreme cand alergam 16km pe seara), am jucat rugby (in Divizia 3 din State), mai recent climbing si sailing.

Pe ce te concentrezi acum?

Anul asta voi termina doctoratul... Trebuie sa scriu o teza si sa aplic pentru joburi (in pricipal, o sa aplic pentru joburi de prof la universitati). Asta ia destul de mult timp. In rest, mai lucrez la cercetare, si mai calatoresc.

Cum tii pasul cu cercetarea curenta? Sunt conferintele importante si discutiile cu ceilalti cercetatori (comunitatea din care faci parte), sau e deajuns sa citesti research paperurile ce apar?

Sunt cateva conferinte importante la care ma duc intotdeauna. Problema e ca nu pot sa stau intr-o sala si sa ascult o prezentare (lipsa de concentrare). Asa ca in timpul conferintei ma intalnesc cu prieteni vechi care de asemenea nu vor sa fie prezenti, si mergem la bere sa mai discutam probleme. Ca sa aflu ce se intampla citesc lucrari pe Net.

Cum te vezi in 5-10 ani?

Sper ca cu un job :) Planul este sa lucrez in continuare in domeniu si sa mai rezolv cateva probleme importante. Apoi as vrea sa incerc si sa fondez o companie cu o idee trasnet. Avem multe rezultate valoroase in teorie, care nu se aplica pentru ca lumea nu se gandeste suficient la impactul mai larg si nu gaseste aplicatiile bune. Daca imi vine vreo idee buna la capitolul asta nu voi ezita sa incerc o companie, in paralel cu jobul de prof.

Vrei sa le transmiti ceva celor ce acum incep cu viata competitionala?

E sansa voastra sa aratati lumii ce tari sunteti, si sa deveniti si mai tari pe parcurs. E un drum bun in viata.

Ii multumim lui Mihai pentru un interviu foarte interesant.

Am avut ocazia sa il reintalnesc acum vreo doua luni pe Mihai Patrascu dupa ce ultima data cand il vazusem a fost la Olimpiada Nationala de Informatica din Bacau in 2001. Era venit in Bay Area la un internship la centrul de cercetare IBM Almaden. I-am propus atunci sa facem un interviu pentru viitorul blog de pe infoarena.

Mihai Patrascu are printre cele mai bune rezultate la olimpiadele internationale la informatica dintre romani. A luat premiul I la Olimpiada nationala de informatica din clasa a 4a (concurand la clasa a 5a) pana intr-a 12a. La olimpiada internationala la de informatica a luat doua medalii de aur si una de argint (in 2001 a fost locul doi la internationala). La Concursul Europei Centrale de Informatica a luat un aur si un argint, iar la Balcaniada de informatica un argint. In 2005 a luat premiul Outstanding Male Undergraduate Award pe Statele Unite si Canada. Are chiar si o pagina pe wikipedia

Interviul va fi impartit in doua parti. In aceasta parte Mihai discuta despre MIT, despre cercetare si despre olimpiade:

Cum ai inceput cu informatica?

In clasa a 2a, am decis sa ma duc la Palatul Copiilor si sa studiez electronica. Din pacate, cursul de electronica se umpluse, dar mai erau locuri la cursul de programare...

Ai avut pe cineva care te-a ghidat? Un mentor, o persoana de la care ai invatat?

Nu, practic niciodata. La mai sus-mentionatul curs de programare am invatat sa programez in Basic timp de cateva luni, si am fost captivat. Dar cu asta s-au sfarsit cursurile de programare care le-am luat. Am invatat Pascal dintr-o carte intr-a 4a, C din alta carte (in engleza) intr-a 6a, apoi pentru pregatire mai serioasa la olimpiada am citit GInfo, probleme de pe la concursuri, Knuth si CLR. In liceu am fost la profilul de mate-fizica.

Prin facultate a continuat cam la fel. Dupa 1 an la MIT m-am mutat in departamentul de matematica (ca protest pentru departamentul de CS care nu ma lasa in pace), asa ca n-am luat nici pana azi nici un curs de programare. Am luat multe cursuri de algoritmi, evident. Dar n-au avut niciodata legatura cu cercetarea mea :) Probabil mi-am ales domeniul de lucru dupa aceleasi criterii: un domeniu unde nu se facuse progres de peste 15 ani, si ca atare nu mai existau nici profi nici cursuri predate in mod curent...

De ce MIT si nu alte universitati din state sau din Romania?

Am facut un an la poli in Craiova, dar era o atmosfera trista. Practic lumea nu era acolo decat ca sa ia o diploma, si, partea cu adevarat trista, diploma aia nici nu prea conta...

In State, doar MIT-ul m-a acceptat :) Simplu.

Cum a fost procesul de admitere? Cat de mult conteaza o medalie la olimpiada internationala?

Pana acum cativa ani, la MIT studentii internationali erau practic 100% cu medalii la diverse discipline, si clar asta era criteriul de baza. Multe alte universitati (gen Harvard si restul de Ivy League) cautau oameni cu un profil diferit, care sa ajunga politicieni, manageri etc. In perioada aia era faimoasa bariera culturala intre studentii de la MIT si cei de la Harvard.

In zilele noastre a aparut o oarecare convergenta. Internationalii de la MIT sunt mult mai "normali" si doar putini mai au medalii, in timp ce celelalte universitati au inceput sa aprecieze mai mult oamenii cu medalii.

La MIT au fost multe proteste (spre exemplu, Leiserson s-a plans mult) si speram sa revenim la admisia mai elitista (decanul de admisii a fost concediat recent, pe alte motive, si anul asta vom vedea ce face noul decan).

Cum e viata unui roman la MIT, sunt romanii sau strainii in general priviti ca outsideri?

La MIT e foarte greu sa gasesti americani... Toti "americanii" sunt de fapt la prima generatie, fiind imigrati recent impreuna cu parintii. Asta se datoreaza educatiei la nivel de liceu in State, care orienteaza lumea spre stiinte sociale, avocatura etc. Persoanele care stiu teorema lui Pitagora la liceu sunt "buni la matematica", iar cei care Doamne-fereste iau un curs de trigonometrie sunt "geeks".

La toate capitolele, MIT-ul este mai mult decat deschis... Majoritatea oamenilor sunt foarte inteligenti, si exista o toleranta foarte mare (dupa principiul ca oamenillor destepti li se permite). Cei mai ciudati oameni i-am vazut la MIT.

Cursuri preferate in facultate?

Advanced Data Structures (care l-am si predat un an), Advanced Algorithms, Randomized Algorithms, Geometric Computing, Computer Architecture, Microeconomics, Syntax (in lingvistica, nu programare :p)

De ce cercetare si nu programare?

Cred ca mentalitatea de om de stiinta ma caracterizeaza. Imi doresc foarte mult sa aflu raspunsuri, nu numai sa fac ceva care sa mearga. Ca cercetator pot sa las ceva in urma, ceva cunostiinte noi pentru omenire. Ca programator m-as simti mult mai egoist -- fac ceva ca sa castig eu niste bani.

In plus, programarea mi s-a parut intotdeauna o unealta la ce facem noi, nu un scop in sine. Principalul este sa te gandesti, sa "te prinzi", si apoi poti sa stai cuminte si sa programezi ideea. Dar esenta e ideea. Un programator bun e unul care gandeste bine, nu unul care tasteaza repede.

Te-au influentat in vreun fel olimpiadele din liceu?

Foarte mult. Motivul evident e ca mi-au oferit o deschidere -- am vazut locuri noi, oameni noi, probleme mai grele, si apoi din cauza lor am ajuns la MIT. Motivul mai subtil dar mai important e ca olimpiadele au fost locul ideal pentru dezvoltarea spiritului competitiv. In Romania este foarte usor sa ajungi blazat si mediocru. La olimpiade descoperi ca poti sa castigi si poti sa pierzi, iar agonia si extazul sunt la un pas distanta. Odata ce prinzi gustul luptei, iti vei dori mereu sa faci mai mult in viata, si asta te face un om mai reusit.

Ti-a ramas in minte vreo problema de la concursuri?

Am dat la BOI'03 o problema draguta cu Farey sequence. E exemplul meu favorit despre cum problemele de concursuri pot fi interesante si pentru "oamenii mari". La concurs era suficienta o rezolvare in O(n\ lg^2 n), si s-au prins cativa oameni. Apoi m-am mai gandit la problema, am gasit o rezolvare in O(n\ lg n) si am publicat-o la o conferinta de Algorithmic Number Theory, ca amuzament matematic. Oamenilor le-am placut, si recent un tip din Polonia (care a fost si
el la IOI prin 1995) a gasit in algoritm in O(n^{3/4}), care l-a publicat la European Symposium on Algorithms. Bineinteles ca asta m-a motivat, si i-am imbunatatit algoritmul la O(n^{2/3}) -- deci recordul revine la Romania :)

Nu e o problema fundamentala care chiar sa conteze, dar arata cum tipul de rationament de la olimpiada e acelasi ca pentru cercetare.

Cum te antrenai in timpul liceului? Studiai din carti? Rezolvai probleme de pe siteuri cu evaluatoare automate? Discutai probleme cu colegii?

Pe vremea mea nu prea existau siteuri cu evaluare automata. N-am folosit niciodata unul, desi cred ca sunt utile.

Eu in principal citeam carti, GInfo, etc si ma gandeam la probleme. Discutam destul de mult cu ceilalti concurenti, de la care invatam idei interesante. Asta se intampla la lot, pentru ca in Craiova nu era nimeni cu care sa pot sa discut.

Ai vreun algoritm/structura de date preferata?

Partial sums, care este o structura de date foarte clasica si simpla. Problema: ai un array A[1..n], poti sa faci update (A[i] = valoare noua), si queries: raporteaza suma A[1]+..+A[k], pentru k dat.

Cred ca toata lumea stie ca se face in O(lg\ n) cu binary trees, si ideea e super-utila in multe probleme.

Cand am ajuns la MIT, vroiam sa incep sa lucrez in cercetare si citeam lucrari pe care le gaseam pe Internet sa vad despre ce e vorba. Am citit undeva ca nu s-a putut demonstra ca O(lg\ n) e optim la problema asta (spre exemplu, ganditi-va ca pentru a face un dictionar, in loc de binary trees poti sa folosesti hashing, care merge in timp constant). Mi s-ar parut straniu ca nimeni n-a putut demonstra asta, asa ca am scris un paper in care am demonstrat. Mi s-a spus apoi ca asta era "problema nr 1" in data structures din 1989, am fost invitat sa dau talkuri despre solutie, si am primit si un premiu.

Totul a fost accidental, pur si simplu eu nu stiam nimic si am avut o perspectiva total diferita de toata lumea... Dar acum evident sunt foarte atasat de problema asta :)

A doua parte din interviu va fi publicata in curand.

(in poza de la stanga la dreapta: The Beatles, ah pardon Mars , Vivi , Cristi si Cosmin in septembrie in San Francisco)

Continuam cu a doua parte a interviului interesant cu Octavian Costache. Puteti citi prima parte aici . In aceasta parte el ne spune despre facultate, viata de freelancing, despre blogging, despre Google si alte lucruri interesante. Cititi si cel mai important, comentati interviul.

Ai facut facultatea in Romania, si mai tarziu ai plecat la Google in New York. Nu te-ai gandit la sfarsitul liceului sa pleci din tara la o universitate in strainatate?
Am avut si gandul asta, ba chiar am dat si Toefl-ul. Cred ca am fost insa prea lenes pentru a incerca cu adevarat, probabil nici nu am fost motivat suficient, sa fac facultatea in afara nu era un vis sau un scop al meu. Un alt motiv care m-a facut sa nu aplic a fost neincrederea pe care o aveam in sansele de reusita pentru ca la olimpiade nu am avut rezultate stralucite (doar niste premii la nationala).

De ce ai ales ca facultate sectia Calculatoare, Politehnica Bucuresti?
Era singura facultate despre care stiam ca 'e buna pentru calculatoristi'. Cealalta varianta era sectia de informatica de la Universitate, dar acolo se auzea ca profesorii nu sunt la fel de buni, nu avea la fel de multa traditie si ca se facea multa mate (care mie nu imi place deloc).

Ce cursuri ti-au placut in facultate si de ce, si care nu ti-au placut?
As putea scrie un intreg eseu despre toate cursurile din facultate. :-) Mi-au placut cursurile din anii mai mari, cred ca cele mai multe au fost bine facute. Cele de sisteme de operare (thread-uri, low level stuff), retele, algoritmi. Au fost si cateva cursuri mai exotice care mi-au placut (programare functionala). Din motive pur subiective probabil cel mai mult mi-a placut cursul de sisteme multi agent, a fost un domeniu care m-a atras pentru ca mi se pare cool sa faci roboti si programe autonome. E ca si cum ti-ai construi o jucarie pe care apoi o poti studia cum merge si cum evolueaza de capul ei. Si chiar asta am ajuns sa facem cand am facut niste programe care se jucau pe doizece de capul lor, isi alegeau partenerii, incercau sa faca conversatie, sa fie inteligente. A fost foarte distractiv. Nu vreau sa imi aduc aminte de cele care nu mi-au placut, probabil primii doi ani cu totul.

Ai fost instructor si preparator la mai multe cursuri. Cum e experienta de a fi profesor, care erau partile frumoase si cele dificile?
E mai dificil decat pare sa iti pregatesti un laborator si sa ai incredere ca nu te vei face de ras in fata unui grup de studenti, cel putin prima oara cand faci laboratorul respectiv. E greu sa fii laborant bun, e greu sa admiti cand nu stii si sa fii deschis la tot felul de oameni si tot felul de intrebari. Cel mai mult mi-a placut faptul ca puteam sa trezesc entuziasmul in studenti la materia pe care o faceam. Eu cred ca orice subiect are o parte interesanta care il face fascinant si util si principala satisfactie (si responsabilitate) a unui preparator este sa reuseasca sa arate aceasta parte interesanta studentilor si sa ii faca sa inteleaga de ce ceea ce invata e cool.

Ai recomanda unui student sa faca cursurile Cisco?
Da, primul modul este de basic networking si sunt acolo lucruri generale care te ajuta sa intelegi cum functioneaza retelele si internetul. Cred ca este un modul extrem de util pentru cultura ta generala de dezvoltator software. Celelalte module sunt utile doar pentru cei care vor sa faca din asta o cariera.

Am vazut in CV ca ti-ai facut lucrarea de diploma din Inteligenta Arfiticiala. Cum se imbina algoritmica si inteligenta artificiala cu web designul?
Well, se imbina foarte indirect. Revin la exemplul cu programele noastre care se jucau pe doizece de capul lor. Pentru ca stiam sa dezvoltam site-uri web am facut doizece si a avut succes, pentru ca stiam algoritmica am stiut sa scalam doizece pentru a putea sa reziste in fata succesului pe care l-a avut, si pentru ca stiam inteligenta artificiala am putut sa facem niste agenti care sa ne ajute sa popularizam jocurile mai putin de succes si sa ne ajute sa facem diverse experimente.

Este totusi doar un caz fericit, un exemplu ca se poate. As spune ca mult mai comuna este inrudirea dintre algoritmica si web development (design-ul intr-adevar nu se inrudeste cu asta) pentru ca trebuie sa intelegi web-ul pentru a dezvolta site-uri de succes si cel mai probabil te va ajuta foarte mult algoritmica atunci cand aceste site-uri vor avea succes. Inteligenta artificiala nu prea intra in ecuatie decat in cazuri extreme si rare, in situatii speciale si depinde foarte mult de problemele pe care incerci sa le rezolvi. De exemplu, daca vei vrea sa faci o interfata cool care intelege limbajul natural atunci vei avea nevoie de inteligenta artificiala.

Ai un blog cunoscut. In ze list apare in primele 50 de bloguri din Romania. De ce ti-ai facut blog?
Eu cred ca am o viata interesanta care poate motiva si inspira pe altii. Credeam si inca mai cred ca am multe lucruri de spus, ca exista valoare in a impartasi experientele prin care trec eu si altora. Este probabil parte si din motivul pentru care am fost preparator, imi place sa inspir si sa motivez oameni, sa explic si sa educ, sa arat altora perspective noi asupra lumii la care ei poate nu s-au gandit. Asta a fost principalul motiv pentru care am inceput sa am blog, combinat cu ideea ca facand asta, inspirand, educand, provocand oamenii la a gandi mai mult, vor afla si ca exist, ca gandesc, ca sunt destept.

Ca un efect secundar de care mi-am dat seama ceva mai tarziu, blogul mi-a fost foarte folositor si pentru nevoia de comunicare de la inceputul venirii mele in America. Eram singur, fara prieteni si fara nici un cunoscut, intr-o tara straina. Blogul m-a ajutat, la inceput fara sa imi dau seama, sa am un loc unde sa comunic cu prietenii, sa le spun ce imi trecea prin cap, sa simt ca cineva ma asculta. Psihologic m-a ajutat foarte mult, chiar daca intentia initiala a fost alta.

De ce crezi ca are succes?
As zice ca blogul meu are un succes moderat. Este citit de un public destul de restrans de oameni care ma cunosc sau oameni interesati de industria online. Cred ca succesul lui este dat de o combinatie intre pozitia din care emit pareri (pozitie care confera mai multa autoritate parerilor mele decat parerilor unui anonim), felul in care scriu (cu grija, coerent, clar, interesant) si continutul pe care il scriu (de multe ori analize coerente si argumentate, perspective interesante, sinteze sau opinii la care de obicei oamenii nu se gandesc). Este, evident, o parere foarte subiectiva. :-)

Cum ai convinge pe cineva sa isi faca blog?
Nu as vrea sa conving pe nimeni care nu simte ca are ceva de spus sa isi faca blog. Cred ca un blog este ceva care trebuie sa iti faci doar atunci cand simti ca ai ce sa comunici, ca perspectivele tale aduc valoare asupra unor subiecte, ca ai ceva de comunicat (despre lume, despre ceea ce faci tu, despre ce se intampla in interiorul unei echipe, etc).

Ce tipuri de bloguri citesti?
1. Bloguri despre industria online din Romania. Citesc cam orice blog al persoanelor care au cat de cat legatura cu online-ul de la noi. Ma intereseaza sa aflu tot ceea ce se intampla, sa imi formez o idee despre atitudinea generala a celor are au blog despre diverse evenimente, sa aflu lucruri interesante.
2. Foarte putine bloguri personale, pe care le citesc tot din motive personale.
3. Un blog despre New York in care mai aflu despre concerte interesante, restaurante, teatre sau in general ce se mai intampla cool prin oras.

Ai niste bloguri preferate care se ocupa de programare?
Nu.

Ai fost o bucata buna de vreme freelancer. Ce avantaje si dezavantaje are munca ca freelancer fata de cea a unui programator angajat la o firma?
Ca freelancer ai libertate deplina. Poti sa fii propriul tau stapan, sa faci lucrurile cum vrei tu, cand vrei tu, in ce fel vrei tu. Este ceva romantic in asta din punctul meu de vedere, esti un fel de mercenar in afara sistemului, mereu lucrand dar mereu pe drumuri, gata oricand sa isi faca bagajele si sa se duca in alta parte si sa se apuce de altceva. Exista avantaje destul de clare fata de un job normal: nu trebuie sa te duci la servici, poti sa muncesti cand vrei tu, in general nu ai un sef care sa iti spuna ce sa faci. E drept, ti se spune ce sa faci pe fiecare proiect. Dar esti liber sa iti alegi ce proiecte sa faci, daca sa mai lucrezi cu cineva sau nu.

Ca angajat ai insa o echipa cu care sa lucrezi si care sa te ajute. Ai oameni la care sa te raportezi si sa iti dai seama cat de bun esti. Lucrezi la proiecte mai mari si cu impact mai mare, dispare adrenalina si eterna intrebare "oare luna asta o sa am bani?".

Daca vrei, este diferenta intre a iesi cu tipe asa la intamplare si a avea o relatie serioasa cu o tipa. Exista avantaje si dezavantaje in amandoua. Cand ai o prietena stabila ai free sex la dispozitie, stabilitate, siguranta, daca va iubiti vedeti lumea impreuna, impartasiti bucuriile si tristetile. Cand esti single sex-ul este mai greu de gasit dar este mai divers si mai interesant, nu stii ce iti rezerva viitorul, esti liber sa te duci unde vrei cand vrei si sa faci absolut ce vrei. Amandoua au sens la anumite varste, amandoua situatiile au propriile lor avantaje si dezavantaje.

De ce Google si nu o alta firma sau propriul tau startup?
Dupa ce am fost freelancer mi-am dat seama ca mi-ar fi absolut imposibil sa ma duc la un job normal. Am aplicat la Google intamplator, a fost singura firma la care am aplicat vreodata (nici macar nu aveam un CV redactat). Nu voiam un job, voiam sa vad daca as putea obtine unul, era doar un challenge pentru mine, mai mult in joaca.

Dupa ce am trecut de interviuri mi-am dat seama ca este o ocazie pe care nu pot sa o ratez, sa lucrez la Google in New York, o oferta pe care nu o puteam refuza. De la Google am avut mult de invatat, m-am maturizat enorm ca programator. Din faptul ca traiesc in New York mi-am deschis orizonturile, am cunoscut lumea si am vazut perspective pe care nu le stiam inainte, lucru care se intampla de fiecare data cand iesi din universul care iti este familiar si te duci intr-un loc cu totul nou.

De ce nu o alta firma? Nu voiam sa devin un pion lucrand la un proiect ascuns dintr-o companie imensa, nu e ceva care sa imi doresc sau care sa ma caracterizeze. Google este singura companie pe care o stiu unde intr-adevar poti face o diferenta, poti face lucruri vizibile si poti face ce vrei tu, cat timp ai energia sa vrei.

Ce lucruri importante ai invatat de cand lucrezi la Google?
Probabil cel mai important a fost contactul cu alti oameni destepti. Am invatat sa fiu mai matur si ceva mai analitic. Am invatat cateva principii pe care, desi cred ca le urmaream oarecum inainte mai mult instictual acum stiu si care sunt argumentele din spatele lor (the user comes first, speed matters, release early and often).

Calitatea codului pe care il scriu a crescut. Desi in ultimii cinci ani (la google sunt doar de 2) am crezut cam in fiecare an ca mi-am atins maturitatea ca programator, in fiecare an mi-am dat seama ca am evoluat fata de anul trecut, ca scriu cod mai clar, mai curat, mai argumentat, ca stiu sa evaluez mai bine ce e usor de citit si de inteles, ce e bine sa fie facut si ce nu.

Ce iti place la viata din state?
O sa iti spun ce imi place la viata in New York, pentru ca eu acolo locuiesc si este un loc destul de diferit de restul Americii.

Imi place mult de tot orasul in sine. Imi place ca exista mii de restaurante, baruri, concerte, evenimente. Imi place ca atunci cand vrei poti sa gasesti cam orice dristactie la care te poti gandi. Imi place ca totul este extrem de comod de la cumparaturi si plati de facturi online pana la doing laundry.

Este totusi un raspuns foarte personal si sper ca toti cei care citesc asta sa nu sara la concluzii stereotipice despre America. Trebuie sa iti dai seama ca astfel de raspunsuri variaza mult de la persoana la persoana si depind mult de contextul fiecaruia.

Crezi ca o sa te mai intorci in Romania?
Este o optiune la care ma gandesc uneori ca fiind o optiune posibila.

Ce pasiuni mai ai inafara de blogging si programare?
Imi place sa zbor. Am facut parasutism si mai apoi parapanta si incerc sa zbor atunci cand pot. Mi-ar placea sa traiesc undeva unde sa pot face asta mai mult si mai usor dar pana acum nu a fost cazul.

In ultima vreme filmul. Am inceput sa vad multe filme si nu doar la cinema, sa urmaresc curente cinematografice si sa incerc sa inteleg mai bine regizorii, influentele lor, mesajele pe care vor sa le transmita. Am inceput sa privesc filmul ca pe o arta si sa incep, cred eu, sa o inteleg ceva mai bine din perspectiva asta.

Fotografia uneori. Imi place mult sa incerc sa spun povesti prin fotografie si sa incerc sa devin mai bun la a face asta.

Ce sfaturi ai da cuiva care e la inceput cu programarea?
Stau de cinci minute sa ma gandesc ce sa raspund la intrebarea asta si sunt atat de multe perspective si puncte de vedere in care se pot da sfaturi incat imi este foarte greu sa raspund. Am incercat sa editez un raspuns de cateva ori dar mi-e foarte greu asa ca am renuntat.

Probabil le-as spune sa se tina de programare si sa traga tare, traim intr-o vreme cand a venit randul programatorilor sa schimbe lumea in care traim. Suntem abia la inceputurile unei ere de glorie a tehnologiei si a comunicatiilor, internetul este doar la inceput si inca nu s-a maturizat, sunt vremuri entuziasmante si extrem de interesante pentru oricine care lucreaza in aceasta industrie si urmeaza vremuri si mai interesante. Este mai usor ca niciodata pentru grupuri din ce in ce mai mici de oameni sa inceapa sa schimbe lumea in feluri semnificative.

Daca cineva are intrebari mai concrete, va rog, nu ezitati. :-)

Multumim Vivi.

Daca dai un Google search dupa romani ce lucreaza la Google probabil o sa il gasesti pe Octavian Costache, cunoscut de prieteni si de cei de prin blogosfera romaneasca ca Vivi. Prima data cand am vorbit cu el a fost parca in 2005 dupa un ONI by Net cand eram foarte curios de rezultate, si apoi l-am mai intalnit cand era in vizita la GooglePlex. Apropo de asta e interesant cum atat de multi olimpici internationali au ajuns sa lucreze la google, pe langa lista de angajati full time de aici , cel putin alti 8-9 olimpici au facut internshipuri pe vara. Vivi are un CV variat si cu realizari cum ar fi premii la olimpiadele de informatica, premii la concursul internetics de webdesign, premiant si apoi participant in comisie la concursul infoeducatie, realizarea impreuna cu Irina Dumitrascu a siteului doizece.ro , cel mai mare site de jocuri online din Romania, pe care l-a vandut inainte de a se angaja la google companiei neogen, are un blog ce e intre primele 50 de bloguri din Romania, a fost asistent la cursuri de algoritmica si instructor la cursuri Cisco. Tot Vivi a initiat ONI by Net , partea online a olimpiadei natinale de informatica. Astfel am fost sigur ca un interviu cu el ar fi foarte interesant. Acum postez doar prima parte a interviului.

Cum ai inceput cu informatica?
In clasa a 5-a am vazut primul PC XT la mama la serviciu. Pe vremea aia doar ma jucam, ne-am cumparat un HC90 pe care incarcam jocuri de pe caseta. Probabil primul meu program a fost un program in Basic cu care puteam sa desenez. Am desenat o masina si am salvat-o pe o caseta. :-) In clasa a 7-a am inceput sa fac informatica la scoala si mi-am dat seama ca sunt bun la rezolvat probleme si algoritmi. Intr-a 9-a am dat la clasa de informatica pentru ca era considerata cea mai buna clasa din liceu. Am inceput sa merg la olimpiade si cam de aici a inceput totul.

Scriai in pagina personala ca ai fost si la concursuri la fizica cand erai tanar? De ce nu ai continuat pe calea respectiva?
La fizica era prea multa teorie de studiat iar eu sunt lenes din fire. Concursurile de informatica aveau mai putine teoreme si teorii in spate. In timp ce la fizica provocarea era sa faci conexiuni intre teorii si demonstratii si trebuia sa memorezi multa informatie, la informatica provocarile erau mult mai aproape de rezolvarea pura de probleme unde nu este nevoie de un fond teoretic atat de mare. La informatica puteai rezolva probleme si fara sa le demonstrezi sau fara sa ai fondul teoretic, deci puteam sa fiu mai lenes pe partea de pregatire. :-)

Ce ti-a ramas din viata competitionala?
Algoritmii. Fundatia mult prea solida de structuri de date si algoritmi este, cred eu, lucrul care pana acum mi-a folosit cel mai mult. Inclinatia catre rezolvare de probleme si modalitatea de a le aborda, deprinse dupa ani buni de competitie, au devenit, cred eu, parte din personalitatea mea datorita olimpiadelor si acum imi influenteaza viata (mai ales cea profesionala).

Prietenii pe care mi i-am facut la concursuri sunt un alt lucru care mi-a ramas, atat dintre elevi cat si dintre profesori. Cu multi dintre ei m-am intalnit over and over again, i-am intalnit in facultate, i-am intalnit la Google si probabil ne vom mai intalni pe unde o sa ne mai ducem.

Mai tii minte vreo problema frumoasa?
Probabil cea mai placuta amintire este o problema de la ONI in clasa a 9-a pentru ca am fost singurul care am rezolvat-o corect. :-) Nu mai tin minte problema exacta, era ceva despre oameni catre trebuiau grupati in niste lifturi.

Ai avut pe parcursul vietii oameni de la care ai invatat mult sau consideri ca ai invatat totul singur?
Oamenii de la care am invatat au fost foarte importanti. Nu neaparat pentru ceea ce stiau, ci pentru ca mi-au folosit drept modele, motivandu-ma sa fiu mai bun, sa fac mai mult, sa vreau sa invat si sa vreau sa ma autodepasesc. Cea mai puternica motivatie, pentru mine, este atunci cand admir pe cineva si vreau sa fiu si eu ca respectivul.

Nu au fost foarte multi, poate trei sau patru oameni pe care i-am admirat din anumite puncte de vedere, insa pentru mine au fost foarte importanti.

Cum ai inceput cu crearea de siteuri?
Intr-o tabara la Galaciuc Marius Deak a tinut un curs de HTML unde am facut primul 'site' cu Netscape 2.0, Notpad si Photoshop 3.5. :-) Apoi daca tot stiam HTML, am facut site-ul Divertis. Fratele meu era fan si voia neaparat sa ajunga sa vorbeasca cu cei din grup. M-a convins si pe mine ca a le face un site oficial pe degeaba este o modalitate buna de a ajunge sa ii cunoastem si pentru mine un lucru bun in a imi exersa noul dobandit skill de a face pagini web.

Intamplator a iesit bine, a ajutat foarte mult si renumele Divertis, iar cu nou castigata incredere am descoperit ca pot face niste bani de buzunar din chestia asta asa ca am continuat sa fiu freelancer.

Apoi pentru o vreme, cel putin parte din motivatia de a face noi site-uri era si nevoia de a avea un proiect cu care sa merg la Galaciuc si sa (incerc sa) castig ceva. Ma amuz uneori cand ma gandesc ce motive copilaresti m-au indemnat sa fac lucruri care mai apoi au avut o influenta fundamentala in viata mea.

La infoeducatie ai fost atat participant cat si in comisie, cum se compara cele doua roluri?
Sunt satisfactii in ambele. Ca participant este adrenalina concursului, dorinta de a castiga, dorinta de a dovedi ca tu esti cel mai bun si evident satisfactia atunci cand castigi. :-) Ca si membru al juriului sau al comisiei satisfactiile sunt mai putin intense dar intr-un fel mai... mature. Ai ocazia sa influentezi felul in care se intampla unele lucruri, sa le faci mai bine, sa ai grija ca toate lucruri sa mearga cum trebuie. Ai satisfactia de a insemna ceva pentru participanti, fie ca ei sunt constienti de asta sau nu.

Cred ca fiecare rol isi are varsta lui. Ca adolescenti ne dorim sa dovedim, sa aratam lumii ce putem si ce stim. Dupa ce dovedim (mai ales noua insine) de ce suntem in stare vine momentul in care ne dorim sa ne lasam amprenta asupra lumii, sa influentam vieti si schimbam lumea, nu doar pe noi insine. Nevoia de a dovedi ceva se schimba intr-o nevoie de a face bine umanitatii.

Ce proiecte pe care le-ai vazut la infoeducatie ti-au ramas in minte?
Ironic, multele proiecte facute pentru lectii la Istorie si la fel de multele 'site-uri ale liceului'. Ambele scopuri nobile care aproape niciodata nu au fost facute pentru elevi ci intotdeauna pentru a lua o nota la Istorie sau la Informatica. Fiecare dintre ele ar fi putut probabil fi site-uri excelente care sa castige premii daca ar fi stiut sa fie mai putin stereotipice si daca ar fi fost facute pentru a fi utile, nu pentru note.

Cate au continuat sa existe si sa fie de succes dupa concurs?
Vrei sa laud InfoArena, sau de ce ma intrebi asta? :-) Cred ca au existat cateva: divertis, e-scoala, todom.ro, site-urile liceelor de care vorbeam la intrebarea anterioara. Nu am urmarit istoria recenta a concursului, probabil ar fi o statistica interesanta de realizat.

Cum se compara concursuri ca Infoeducatie cu Olimpiadele de Informatica?
Cred ca au scopuri foarte diferite si cel mai probabil se complementeaza. Olimpiadele ofera o motivatie pentru pregatirea teoretica, structuri de date si algoritmi absolut necesare unui programator bun. Infoeducatia ofera pregatirea practica, motiveaza spiritul antreprenorial din fiecare dintre noi, dorinta de a face si realiza un proiect al nostru. Daca vrei, olimpiada de informatica te moviteaza sa inveti CUM sa faci, in timp ce Infoeducatia te motiveaza sa inveti CE sa faci.

Care sunt caracteristicile unui website reusit?
Considerand ca nu te referi la site-urile de prezentare sau la cele experimentale, as spune ca un website reusit este un site care acopera cel mai bine o anumita nevoie a utilizatorilor sai. Felul in care este facut, culorile, realizarea tehnica, grafica, tehnologia din spate, sunt importante doar ca si mijloace pentru a atinge singurul si cel mai important scop: de a fi cea mai buna unealta in mana utilizatorului caruia i se adreseaza.

Suna un pic abstract, dar tot ce vreau sa spun este: atunci cand faceti un site, judecati-l din punct de vedere pragmatic si utilitar.

Ce l-ai sfatui pe cineva care vrea sa se apuce de creearea de siteuri web ca metoda de abordare generala, tehnologii, tooluri, concepte de design samd?
Vezi intrebarea anterioara. :-) Toate cele pe care le insiri tu conteaza doar in contextul in care servesc cel mai bine utilizatorul. Tehnologia este importanta doar pentru a fi sigur ca site-ul tau scaleaza si functioneaza corect. Tool-urile sunt importante doar in contextul in care te ajuta sa faci lucrurile mai repede. Conceptele de design doar in contextul in care stiu sa transmita mesajul in cel mai usor mod cu putinta. Insa in the end, ele sunt doar mijloacele si nici una din ele nu te va ajuta sa transformi intr-un succes un site care nu este facut pentru utilizatori.

Este ca si cum m-ai intreba ce masina este cea mai potrivita pentru a ajunge undeva. Daca iti este clar unde vrei sa ajungi si cat de repede, poti sa iti alegi masina cea mai potrivita pentru asta. Insa degeaba ai o super masina daca nu ai o destinatie si un scop. O sa poti sa te plimbi cu ea prin cartier sa te dai mare ca stii Ruby on Rails, dar dupa doua ture o sa o bagi in garaj si o sa te intorci de unde ai plecat.

De exemplu, doizece.ro era facut cu php+mysql in partea web a site-ului, flash pentru jocuri si java pentru serverul din spate. Puteam la fel de bine sa fie facut in ruby on rails pentru partea web si in C++ pentru server, insa am ales tehnologiile astea pentru ca eram confortabili cu ele, erau usor de folosit si faceau lucrurile de care noi aveam nevoie. Desi am folosit php in aproape toate site-urile pe care le-am facut in Romania nici pana acum nu stiu php decat la un nivel intermediar pentru ca asta era tot ce aveam nevoie.

Deci, ca sa iti raspund totusi la intrebare, invatati ce va este cel mai usor pentru a putea realiza ceva. Php, mySql, Java sunt exemple excelente. Nu uitati insa ca sunt doar tool-uri si nu le acordati importanta decat in masura in care merita. Razboaiele despre care limbaj este cel mai tare sunt de cele mai multe ori inutile.

Povesteste-ne despre un proiect de-al tau ce ti-a placut in mod deosebit in afara de doizece.ro :).
Didactic.ro este un proiect mai putin 'cool' dar care a schimbat foarte mult viata profesorilor ajutandu-i sa comunice si sa impartaseasca teste, lectii, reviste scolare si mult alt continut generat de utilizatori. Timp de doi ani l-am dezvoltat impreuna cu Emil Onea si s-a impus recent ca unul din cele mai vizitate site-uri dedicate educatiei din Romania (http://www.trafic.ro/top/educatie-invatamant/), in contextul in care celelalte site-uri populare sunt in principal site-uri de referate. Cred ca putini oameni stiu ca eu am fost singurul dezvoltator al site-ului asta inainte sa plec din Romania si ca acum este in mare parte neschimbat.

Povestea cu el este interesanta pentru ca este un site pe care l-am dezvoltat pentru Softwin desi ma plateau pentru asta mai putin decat credeam eu ca merit. Cu toate astea l-am facut pentru ca voiam sa fac ceva interesant, credeam in idee, stiam ca trebuie facut si am zis ca mai bine lucrez la ceva si sunt platit mai putin decat sa stau degeaba (si sa nu castig nimic :-) ).

Povesteste-ne despre OniByNet.
In 2000 am facut, pentru prima data la noi, CEOI by NET. Cred ca am ajuns sa il fac eu pentru ca ma ocupam in general de site-ul editiei respective. Cand mi-am dat seama ca se poate, am inceput sa il bat la cap pe Emil sa convinga comisia ca un astfel de concurs pentru ONI poate fi foarte important pentru cei care raman acasa, pentru pregatirea lor, pentru a nu isi pierde exercitiul.

Am insistat mult si am reusit, la inceput destul de timid. In timp am insistat sa facem ONIbyNET din ce in ce mai important si am reusit ca in cativa ani sa aducem castigatorii la baraj cu drepturi egale cu cei de la olimpiada normala. Pentru mine este un fel de victorie personala, dovada ca am schimbat un sistem si ca datorita mie acum viata catorva sute de elevi pasionati este schimbata, chiar si daca foarte putin, in bine.

Partea a doua a interviului va aparea in curand.

Postez a doua parte a interviului cu Radu Berinde. In aceasta parte el ne povesteste despre concursuri, despre MIT, despre Google si despre cat impinge la piept, de asemenea va aparea si putin context legat de poza cu masina din prima parte a interviului. Enjoy! 

Dupa terminarea liceului ai fost fost in comisii la cateva concursuri, cum e participarea pe cealalta parte a baricadei?

Pe de-o parte, esti mult mai relaxat si distantat de ce se intampla in concurs; pe de alta parte, trebuie sa te gandesti foarte bine la ce faci, pentru ca deciziile tale afecteaza multi oameni. In rest nu prea vad ce comparatie sa fac intre cele doua activitati, sunt foarte diferite..

Cum se compune o problema pentru concurs?

Mi se pare destul de greu (si frustrant) sa scoti o problema buna; e ceva la care trebuie sa te gandesti in timp, si apoi sa te decizi unde/cand sa o propui. Sunt mai multe variante de compunere a unei probleme: una e sa te gandesti (probabil pornind de la o problema pe care o cunosti) la o cerinta noua, apoi sa te gandesti cum s-ar putea rezolva. Astfel e destul de greu sa nimeresti o cerinta buna, insa in gasirea rezolvarii pot sa apara idei noi.

Alta varianta e sa te gandesti la o idee pe care vrei sa se bazeze solutia, si apoi sa te gandesti la ce ar trebui sa ceara o problema care se rezolva in modul respectiv. Astfel e mai usor sa scoti problema, dar idei noi de rezolvare par mai greu (din moment ce solutia e oarecum deja fixata).

Pentru cei ce participa la concursuri pe infoarena, esti cunoscut prin "jmenurile de implementare" pe care le invata din sursele tale. Poti sa ne povestesti de unul dintre aceste "jmenuri"?

Regula de baza cand incerci sa optimizezi un program (in afara de a imbunatati algoritmul) e sa fii atent numai la partile din program care folosesc majoritatea timpului de executie. Mi se intoarce stomacul pe dos cand vad oameni care "optimizeaza" inlocuind in orice loc posibil inmultirile cu operatii pe biti, sau alte chestii asemanatoare (de parca nu le-ar optimiza oricum compilatorul). Codul trebuie sa fie cat mai usor de citit si inteles - asa e cel mai probabil sa iasa corect (si degeaba merge repede daca e gresit). Cand vrei sa optimizezi, te concentrezi pe ceea ce conteaza. De obicei este vorba de cateva linii de cod si e inutil sa optimizezi orice altceva in afara de aceste linii. Era o vorba care suna ceva de genul: in majoritatea cazurilor, 99% din timpul de rulare este petrecut in 1% din liniile de cod.

Ca sa stii sa optimizezi, trebuie sa intelegi cat de cat ce se intampla mai jos de compilator; in majoritatea situatiilor, trebuie sa ai idee de cum functioneaza calculatorul, sa stii cum sa te folosesti de cache-ul de memorie, sau sa stii care operatii sunt mai costisitoare.

Pot sa va povestesc despre o problema la un lot (Petrol din 2003); era despre un graf cu N noduri si M muchii si avea o solutie evidenta care folosea N BF-uri (timp N*M). Solutia care se cerea era in M*log N daca imi amintesc bine, iar solutia in N*M ar fi trebuit sa ia in jur de 30-40 de puncte. Eu am reusit sa iau 90 de puncte cu aceasta solutie. Cum? O singura linie conta - cea care definea bucla de expandare a vecinilor unui nod. Trebuia sa optimizez cat mai mult enumerarea vecinilor unui nod. Ideea a fost sa citesc mai intai intrarea doar pentru a numara vecinii fiecarui nod, sa aloc cate un vector exact de marimea necesara pentru fiecare nod, apoi sa citesc din nou intrarea si sa completez vectorii. Astfel, efortul de a enumera toti vecinii in unui nod in parcurgere este minim; vecinii sunt unul langa altul in memorie si cache-ul este folosit foarte bine. Mai era o singura decizie de luat - cum sa stii cand sa te opresti in enumerarea vecinilor; am testat in timpul concursului tot felu de metode si cea mai rapida a fost sa adaug un numar special (0) la sfarsitul fiecarui vector. Sigur, ar fi fost mai bine sa fiu mai destept si sa ma prind de solutia corecta, dar care ar mai fi fost spectacolul? :)

Stiu ca pentru un an erai inscris la Universitatea Bucuresti si la Universitatea Politehnica, iar apoi ai plecat la MIT. Poti sa ne povestesti mai mult? Ce te-a facut sa alegi MIT?

Eram deja decis sa aplic la MIT inainte sa incep facultatea in Romania. Motivul in principal a fost ca in facultatile din Romania nu prea se invata mare lucru (la informatica). In nici un caz nu cat se invata la una ca MIT. Simteam ca am totusi un talent deosebit si ca trebuie sa il folosesc/extind in continuare (ceea ce clar nu se intampla la facultate in Romania). Nu eram chitit sa plec din tara; faptul ca trebuia sa plec era un dezavantaj. Am aplicat doar la MIT, in ideea ca daca plec din tara, macar sa merite. Plus ca aici aveam si cele mai mari sanse sa fiu acceptat, pentru ca aici conteaza (sau contau..) cel mai mult medaliile.

Care sunt cursurile ce ti-au placut mai mult in facultate (si de ce)?

Mi-au placut materia la multe cursuri. La unele mi-au displacut lucruri legate de cerinte, proiecte finale, etc. insa materia mi-a placut la majoritatea cursurilor de informatica.

Cursul de sisteme de operare a fost foarte interesant; pe de-o parte, am studiat in detaliu un sistem foarte mic de la care a plecat UNIX, pe de alta parte am implementat un sistem bazat pe cu totul alte idei.
La sfarsit am avut si un proiect in care puteam sa facem cam orice in sistemul nostru de operare; a fost foarte interesant - unii au portat stackuri TCP/IP si web-servere, altii sisteme de fisiere distribuite, si multe alte chestii. Eu am portat un compilator, vi, si quake1 :)

Alt curs interesant a fost unul de sisteme distribuite, in care am invatat despre multe sisteme si tehnici care au avut succes, si am si implementat un sistem la sfarsit. Alt curs a fost unul de grafica, la care am implementat multe chestii misto.

Din cele teoretice, mi-au placut teoria complexitatii, geometrie computationala, algoritmi avansati; la toate am invatat lucruri foarte interesante. Am luat si un algoritm mai avansat care mi-a placut foarte mult; se chema "sketching, streaming, and sub-linear space algorithms". A fost despre tehnici si algoritmi cu care sa aproximezi (probabilistic) ceva folosind mult mai putin spatiu decat ar lua "ceva"-ul respectiv (care de obicei era un vector intr-un spatiu de
dimensiune foarte mare).

Cum e viata de stundent la MIT? Cum se imbina munca cu distractia?

De multe ori nu prea frumoasa; sunt cam exagerati in volumul de materie, teme, cerinte si uneori trebuie sa depui eforturi foarte mari sa tii pasul. In unele perioade esti mai relaxat, si poti sa te bucuri de mai mult timp liber. Nu e la fel de distractiv in Romania, unde sunt majoritatea prietenilor mei mai apropiati. Insa sunt locuri, oameni, si lucruri frumoase si acolo; si ai si avantajul de a trai intr-o tara mult mai dezvoltata si mai civilizata.

Cand ai inceput cu concursurile pe topcoder ai ajuns foarte repede intre cei mai buni de pe sait, e usor pentru tine sa participi la concursuri la un nivel inalt dupa ce ai facut o pauza?

Mi se pare ca in timp se clarifica ideile si cunostiintele. Cred ca acum as fi mai bun decat eram in liceu daca m-as duce din nou la olimpiadele din liceu (dupa ce m-as mai antrena un pic).

Cum se compara concursurile pe topcoder cu celelalte la care ai participat?

La Topcoder e foarte important sa scrii codul repede. La olimpiade, niciodata nu ma grabeam sa scriu codul, preferam sa ma concentrez sa fiu sigur ca e corect; ba mai mult, de multe ori scriam si generatoare de teste, si variante mai incete de rezolvare cand se putea, ca sa verific programele. La topcoder nu poti sa faci asta si mai pierzi cateodata din greseli mici; antrenamentul conteaza foarte mult. In rest, problemele nu mi s-au parut cu mult diferite fata de ce eram obisnuit.

De ce nu ai participat la ACM ICPC?

N-am ajuns nicaieri, dar asta nu inseamna ca n-am participat. Am participat o data pentru Politehnica cu Marius Andrei si Mugurel Andreica; am fost primii care nu ne-am calificat. Am avut ghinion la o problema simpla care nu iesea deloc si la alta care avea o greseala in enunt si am pierdut mult timp rezolvand practic alta problema. "Ghinion" poate insemna si ca totusi nu ne antrenasem foarte mult (nu cat ar fi trebuit).

Am participat si o data pentru MIT insa am fost pus exact inainte de concurs intr-o echipa cu doi americani pe care nu-i cunosteam deloc (al treilea membru al echipei lor pleca in finala topcoder si nu putea participa). Evident ca am fost dat la o parte, din moment ce ei nu stiau nimic despre mine. Am participat la faza regionala, unde toate problemele in afara de una erau foarte simple; le-au facut ei doi pe toate foarte repede. La cea grea ma gandisem deja dar nu m-au lasat sa o scriu eu, si tot unul din ei s-a apucat; m-am enervat ca stateam langa el si ii ziceam ca nu face ceva bine si nu ma asculta chiar daca aveam dreptate. Ma enerva ca se si complica, si scria un Dijkstra cu heapuri in STL cand putea sa il faca in N^2 si sa fie mult mai usor si clar. N-a iesit din prima, si a durat pana am rezolvat-o; intre timp, cealalta echipa de la MIT le facuse deja. Celelalte echipe n-au reusit sa faca nici macar toate problemele simple, deci oricum echipele de la MIT au iesit distantat pe primele locuri. Din pacate, chiar daca erau mai multe locuri de calificare, nu se putea califica decat o singura echipa de la fiecare facultate (nu mi-e clar de ce). In echipele de la MIT aproape toti fusesera in primii 10 la un IOI, deci nu e de mirare ca ne-am luptat intre noi.

Dupa aceea n-am mai participat. Motivul principal a fost ca imi manca destul de mult timp - cateva saptamani din semestru, cel putin o zi din weekend o pierdeam cu concursuri/antrenamente pt. ACM. Cum temele si alte chestii iau si ele destul timp mult, era prea mult. In plus, in fiecare an vin tipi proaspat dupa IOI, si cred ca e destul de greu sa tii pasul. Si oricum e foarte greu sa iti gasesti colegi cu care sa mearga bine lucrul in echipa.

Ai fost de doua ori la internship pe vara la Google, cu ce impresii ai ramas?

Nu cred ca mi-ar placea sa lucrez full-time la Google. Cred ca depinde destul de mult de proiect, insa pare ca pana la urma ce faci tu nu conteaza asa de mult. Probabil ca asa e peste tot.. In comparatie cu majoritatea companiilor, probabil ca e foarte bine la Google; imi displace totusi stilul asta american (sau poate nu e doar american?) de a sta toata ziua la servici. Eu prefer sa lucrez in continuu si sa plec cat mai repede acasa, ca am lucruri mai bune/placute de facut.
Majoritatea par ca stau la servici 10-11 ore din care 2-3 freaca menta. Ma rog, probabil ca nu mi-ar placea sa lucrez full-time nicaieri si de-aici vine problema :)

Poti sa ne zici un proiect software misto la care ai lucrat?

Nu am mai lucrat demult la un proiect; pe la inceputul liceului eram pasionat de grafica 3d, si am facut un engine 3d care citea harti de quake1 si apoi quake3 si te puteai plimba prin ele.

Care sunt programele de pe calculator care le folosesti cel mai des, pt programare si in rest?

Lucrez in Windows XP dar am mai tot timpul un Slackware deschis intr-un VMware (si folosesc X-Win32 in loc de X). Documentele/temele le scriu in linux, cu vim si latex (si xdvi). In Windows nu folosesc mult Total Commander (fostul Windows Commander). Programe mici le scriu in linux, folosesc vim si gcc. Mai lucrez in Eclipse si in Visual Studio din cand in cand.

Care sunt siteurile tale preferate?

infoarena :p
howstuffworks
wikipedia
mininova
theonion

Ai ceva carti de programare preferate?

Introduction to Computational Geometry, de Shamos si Preparata.
Theory of Computation, de Sipser.

Dar carti ce nu au legatura cu programarea?

Maximum Boost de Corky Bell :)

Cat timp petreci in fata calculatorului?

Mult prea mult.

Alte pasiuni inafara de programare?

Acum sunt pasionat de mesterit la masini, lucrez la masina cand am timp si cand nu e prea frig afara. Am schimbat sau imbunatatit pana acum tot felu de chestii - componente de suspensie, etriere, discuri de frana, arbore cu came, chestii de la esapament, tot felu de relee si circuite - si inca merge :) Cred ca daca as avea timp si bani, un timp destul de mare as face numai asta.

Cat impingi la piept?

Haha, cel mai mult am impins 120kg la declinat, dar asta s-a intamplat cu (prea) mult timp in urma..

Te mai intorci in Romania sau ramai in State?

In viitorul apropiat probabil ca voi ramane in State. Mai departe e greu de spus, cred ca depinde de prea multe lucruri pe care nu pot sa le prevad. In orice caz, am pastrat contactul cu prietenii din Romania, si il voi pastra in continuare indiferent de ce se va intampla - deci intotdeauna voi avea motive sa ma intorc.

Ce faci dupa ce termini facultatea?

Nu stiu inca. Cred ca voi mai face un an pentru master, apoi probabil voi lucra in State, cel putin pentru un timp.

Multumesc pentru interviu!

Radu Berinde este unul din putinii romani cu doua medalii de aur la olimpiada internationala de informatica. Acum studiaza la MIT, iar vara trecuta a facut un internship la Google pentru a doua oara. Am avut ocazia sa lucrez cu el pe acelasi proiect si m-a impresionat prin o gramada de idei bune si viteza cu care scrie cod elegant si util. In aceasta prima parte a interviului ne povesteste ceva din experienta lui legata de olimpiade.

(Radu cu tiburonul sau).

Cum ai inceput cu informatica? Dar cu concursurile?

Eram prin clasa a patra cand sora mea a adus acasa un 286. Se intamplase ca imi rupsesem picioru (intr-un mic accident de masina) si stateam acasa toata ziua. Dupa ce m-am plictisit de ce jocuri se gaseau, am inceput sa ma uit din ce in ce mai interesat la ce facea sora mea, care isi scriea proiectu pt facultate in Pascal. Am invatat incet incet, pana am rescris de la capat tot proiectul (initial proiectul folosea programarea pe obiecte, eu l-am rescris fara obiecte). Asa a inceput pasiunea pentru programare; am tot continuat sa invat de prin carti si sa fac diverse programe. Prin clasa a 5-a sau a 6-a am inceput sa merg la Palatul Copiilor; acolo au vazut ca stiu deja destul de multe si am intrat direct in grupele unde se pregateau cei care mergeau la concursuri nationale de informatica. Am fost pregatiti foarte bine de Dna. Rodica Pintea. In clasa a 6-a am fost la primul meu concurs de informatica (la Lugoj), unde am luat punctaj maxim. Nu mai e nevoie sa spun ca de-atunci problemele de concurs au ramas pasiunea mea.

Ai participat si la alte olimpiade? Ai avut alte subiecte care ti-au placut in scoala?

Dintre subiectele de la scoala, cel mai mult imi placea matematica (surpriza..); participam la olimpiade si faceam destul de bine la proba de sector, dar la municipiu eram depasit total :) Am fost si la fizica o data sau de doua ori, dar spre sfarsitul gimnaziului nu prea mi-a mai placut. In liceu m-am concentrat destul de mult pe concursurile de informatica; nu pot sa zic ca m-am implicat prea mult in ce se facea la scoala.

Cum te antrenai pentru olimpiade?

In primul rand, lucram foarte multe probleme, de oriunde se putea: olimpiade din romania, internationale, din alte tari, USACO, ACM, orice. Incercam sa gasesc si teste ca sa pot verifica solutia mea. Pana prin clasele 9-10 mai participam si la pregatiri, la Palatul Copiilor, sau la liceu, organizate de Dna. Pintea sau alti profesori si studenti.

Ai avut pe cineva care te-a ajutat in lumea olimpiadelor, sau ai invatat totul singur?

Bineinteles, probabil mai multi decat pot mentiona aici. Cred ca cea mai mare influenta a avut-o Dna. Prof. Rodica Pintea, care a fost profesoara mea de la Palatul Copiilor. Am fost pregatit si de si de Dl. Prof. Atanasiu in anumite perioade. Am invatat mult si de la prieteni olimpici mai mari ca mine: Andrei Marius, Adrian Drumea, Andrei Gheorghe, Angel Proorocu (hmm de ce incep toti cu A?). La diverse pregatiri am mai invatat lucruri si de la alti (atunci) studenti fosti olimpici, ca Bogdan Batog, Mihai Stroe, Dumitru Bogdan.

Sunt cateva probleme ce ti-au ramas in minte de la concursurile la care ai participat?

Mi-a ramas in minte problema XOR de la IOI 2002. Se dadea o matrice cu patratele albe sau negre; se putea face o singura operatie, de a alege un dreptunghi (o submatrice) si a inversa culoarea tututor patratelelor din dreptunghi. Era cu intrare data in prealabil, si se cereau solutii cu numar de operatii cat mai mic. Solutia era un algoritm foarte simplu care obtinea o 2-aproximare - cu acest hint va las sa va prindeti singuri de el :)

Care e structura ta de date preferata?

Dintre cele mai de baza, AVL.. Dintre cele de geometrie, range trees (cu Willard-Lueker refinement/fractional cascading).

Care e algoritmul preferat?

Greu de spus exact, dar voi descrie ceva ce mi-a placut intodeauna foarte mult - algoritmii in timp liniar bazati pe ideea de lista dublu sortata, in care la fiecare pas se insereaza un element nou, stergandu-se mai intain elementele din coada listei care sunt mai "proaste". De exemplu, pentru problema sirului divizat: se da un sir de numere A[1..N], se cere un M maxim astfel incat toate A[1..M-1] sunt mai mici decat A[M] si toate A[M+1..2M] sunt mai mari decat A[M]. Se poate rezolva in timp daca la fiecare pas (pentru fiecare M) putem afla minimul elementelor A[M+1..2M}. Putem rezolva problema in timp liniar daca mentinem o lista dublu sortata pentru a afla la fiecare pas minimul elementelor A[M+1..2M]: lista e sortata crescator dupa valoare si dupa pozitie. Ideea este ca daca in zona curenta de interes avem doua numere A si B, A e la stanga decat B, si A > B, nu ne va mai interesa niciodata A, deci il putem arunca. Cand inseram un numar nou X mai intai stergem repetat ultimul element al listei pana cand acesta e mai mic ca X, apoi inseram pe X la sfarsitul listei. La fiecare pas se sterge si cate un element de la inceputul listei. Minimul va fi intotdeauna ultimul element din lista. Pentru o problema mai avansata care foloseste aceasta metoda, vedeti problema Batch de la IOI 2002.

Cate probleme crezi ca ai rezolvat la viata ta?

As zice ca peste 1000, poate chiar spre 1500-2000.

Ce mai tii minte din viata de olimpic? Care erau concurentii cu care te infruntai? (ai ramas prieten cu unii?)

Multi dintre cei din Bucuresti care participau la olimpiade (si faceau bine) imi erau (si sunt) prieteni buni. Era foarte placut sa ne intalnim la o bere si sa discutam probleme si idei de rezolvare. Formam un grup destul de mare, era foarte distractiv sa mergem impreuna la olimpiade sau loturi.

Stiu ca la IOI cand erai clasa a 12-a ai bushit doua probleme si tot ai luat aur, ne poti povesti mai mult despre acel episod?

Anul acela nu a fost atat de bun pentru mine (am facut destul de prost si la CEOI), n-as putea sa spun exact din ce motive. In prima zi a fost o problema grea la care am gasit o solutie inteligenta, insa era destul de complicata si intr-un program imens am uitat sa pun un if sau doua si am pierdut 100 de puncte (care la final m-ar fi adus pe locul 1). Am mai facut alte greseli si in ziua 2, mai mult din cauza rezultatului prost din ziua 1. Dar sunt convins ca mai toti care au luat aur atunci au facut si ei tot felul de greseli stupide, deci nu cred ca am fost neaparat mai ghinionist. Nu pot spune neaparat ca meritam sa iau mai mult, dar sunt sigur ca as fi putut sa fiu in forma mai buna in care sa nu am probleme. Pot spune totusi ca am fost dezamagit de subiectele de atunci, care nu mi s-au parut deloc la fel de frumoase si inteligente ca cele din 2002. M-a intristat un pic cand am realizat ca pana la urma te pregatesti ani intregi pentru 6 probleme care se poate intampla sa "iti pice prost" in ziua respectiva.

Cum te prinzi de probleme? Ai observat vreo metoda care ajuta?

A fost o evolutie destul de clara. Am lucrat multe probleme, pana cand la un moment dat eram foarte bucuros sa primesc probleme "clasice", insa eram inca speriat de cele "de idee". In timp insa, cunoscand problemele clasice am inceput sa am idei foarte bune. Nu e ceva ce poti sa obtii printr-o metoda anume; daca intelegi foarte multe idei, vei incepe la un moment dat sa le combini in moduri noi.

Cat e complexitatea ca timp a Ciurului lui Erastotene? Motivati raspunsul.

Update: E interesant ca nu stim complexitatea unui algoritm pe care il invatam in clasa a 5-a. Ne gandim mai intai ca algoritmul trebuie sa fie mai rapid decat O(n^2), pentru ca facem n pasi si fiecare pas e mai eficient decat o parcurgere a celor n numere. Daca ne uitam mai atent, numerele sunt parcurse pe sarite si numarul de operatii e n/2 + n/3 + n/4 + ... + n/n = n(1/2 + 1/3 + ... + 1/n). Sirul 1 + 1/2 + ... + 1/n - log\ n este convergent, astfel deducem ca ciurul lui eratostene are complexitatea mai mica decat O(n\ log\ n). Nu am folosit faptul ca in algoritm noi vom marca doar pornind de la valori prime, sarind peste multe valori, astfel numarul de operatii al algoritmului e n (1/2 + 1/3 + 1/5 + ... + 1/pk) unde pk e cel mai mare numar prim mai mic decat n. Sirul 1 + 1/2 + 1/3 + 1/5 + ... + 1/pk - ln\ ln\ n e convergent dupa cum putem citi aici . Astfel complexitatea algoritmului Ciurul lui Erstotene este O(n\ log\ log\ n).

Am o alta intrebare pentru voi: Stiti cat e complexitatea algoritmului lui Euclid?

Toata lumea a auzit de Mark Zuckerberg, studentul care a renuntat la Harvard pentru a se ocupa de site-ul pe care il lansase (si care s-a imbogatit, cu ocazia asta).

Mai interesant pentru elevii pasionati de informatica mi se pare totusi exemplul lui Jake Jarvis, un pusti de 16 ani care a programat o aplicatie care se integreaza cu Facebook si a vandut-o pe o suma consistenta. Majoritatea romanilor au acum la dispozitie resursele pe care le-a avut el. E mult mai usor sa faci lucruri importante decat cu cativa ani in urma, iar cunostintele programare si algoritmi va ofera ocazia de a va face cunoscuti chiar inainte de a atinge varsta majoratului. Va dati seama?

Tiberiu Florea - greco.ro

Evaluatorul infoarena a rulat pana acum mai mult de o suta de mii de joburi. Inaintea inceperii concursului Happy Coding erau vreo 95000 de joburi, iar acum sunt peste o suta cinci.

Spor la munca in continuare!

Anul trecut am jucat cateva jocuri web misto ce aveau o realizare simpla, dar te prindeau. Ideea lor e ca trebuie sa parcurgi niste pagini web ca sa ajungi pana la pagina finala. Pe fiecare pagina este cate un puzzle pe care daca il rezolvi poti sa treci la pagina urmatoare. Cele pe care le-am vazut eu sunt Hacker Puzzle , From A to craZy si unul mai complex care mi-a placut foarte mult Funny Farm . Ultimele doua siteuri sunt facute de Igor Naverniouk, un tip din Canada, si el din lumea concursurilor de programare, cu care mai discut din cand in cand. Pentru ambele jocuri el oferea ceva premii simbolice pentru a atrage vizitatori. Ele au aparut pe prima pagina a digg , lucru care mi se pare a fi o dovada de succes. Puzzleurile sunt foarte bine facute si Igor zicea ca partea de programare a luat mai putin decat partea de creere a intrebarilor. Dupa ce a aparut siteul pe digg a trebuit sa faca si cateva restructurari in cod ca sa poata primi un trafic neasteptat de mare. Funny Farm avea cateva reclame Google si eram curios cati bani a reusit sa scoata din un joc care mie mi se parea foarte popular si interesant. Raspunsul lui a fost unul sub asteptari, a zis ca a facut in jur de doua mii de dolari, care nu e o suma asa mare cand e comparata cu salarul pe luna a unui programator mediu din state sau Canada.

Totusi stiu si de jocuri mai banoase ca funny farm cum ar fi Tower of Defense pe care autorul castiga din reclame opt mii de dolari pe luna.

Moda jocurilor de tipul Hacker Puzzle a aparut si in Romania. Alex Brie face reclama pe blogul sau la Brain Tower , un joc cu potential, dar la care mi se pare ca mai are de lucru. Problemele nu sunt chiar cele mai interesante, si lipseste satisfactia de la final, in celelate jocuri te puteai semna intr-un guestbook sau luai un premiu. Dar din cate mi-a zis Alex, mai vrea sa lucreze putin la el, si pentru inceput arata bine. Multa bafta!

Update Alex a bagat de ceva vreme si un guestbook pe site.

Cati dintre voi aveti siteuri cu reclame? Cum va merg?

Dupa cum ne anuntase Cosmin, sezonul olimpiadelor scolare a inceput si elevii talentati din toata tara se pregatesc de fazele din ce in ce mai avansate ale concursului national de informatica. Locala s-a terminat deja, si fiecare noua proba creste nu doar nivelul problemelor propuse spre rezolvare, ci si intensitatea emotiilor participantilor. Desi unii elevi buni au trait o mica tragedie nereusind sa se califice pe judet (daca va incalzeste cu ceva, am trecut si eu prin asta si am considerat-o pana la urma ca pe o experienta pozitiva - desi de-abia dupa cativa ani am ajuns la aceasta concluzie), majoritatea celor care s-au pregatit serios pe parcursul anului se gandesc acum la etapa judeteana, poate cea mai stresanta dintre toate.

Oricat de neimportant vi se pare acest sfat in comparatie cu modalitatile de asimilare a algoritmilor avansati, nu stiu cum sa va fac sa-l intelegeti cat mai bine: Abordati olimpiada cu o atitudine pozitiva. Nu va ganditi la lucrurile pe care le-ati putea pierde, ci la cele pe care le aveti de castigat.

Nu trebuie neaparat s-o recunoasteti fata de altii, dar noi, fostii "olimpici", o stim prea bine: de multe ori va ganditi mult mai mult la ce s-ar intampla in cazul unui esec decat la urmarile pe care le-ar avea un eventual succes. Priviti atat OJI cat si ONI ca pe acele momente ale anului in care sunt sanse sa-i dezamagiti pe cei din jurul vostru (parinti, profesori, colegi), si sa simtiti ca tot efortul investit s-a dus pe apa sambetei. Si asta va face sa va consumati inutil cu sentimente negative (nu esti afectat doar atunci cand te vezi "sub linie", ci mai ales in orele / zilele / saptamanile in care te intrebi cum ar fi ca dupa atata munca o greseala stupida sau lipsa de inspiratie pe moment sa produca o astfel de nenorocire). O afirm cu maxima convingere, avand in vedere ca eu insumi am trecut prin asta, si nu o data. Ii aud, de asemenea, pe elevii de azi spunand lucruri ca: "am facut prost, dar macar nici X de la mine din liceu nu s-a calificat". Unde credeti ca poate duce acest stil de "competitie"?

Fiti un pic sinceri cu voi insiva: in ce context va ganditi la iminenta judetenei? Daca o puneti alaturi de excursia pe care o veti face la munte cu clasa, sau cu jocul super-tare care se va lansa luna viitoare, e bine. Perspectiva olimpiadei va bucura, deoarece e o activitate pe care o faceti in primul rand din placere, asa cum si trebuie. Dar nu cumva intrati intr-o stare de frenezie, incercand sa invatati un milion de noi metode de rezolvare a problemelor (care nu va vor intra in cap peste noapte, din moment ce ingrasarea porcului in ajun chiar NU functioneaza), facand calcule si pronosticuri despre sansele concurentei si gandindu-va la toate lucrurile care ar putea merge prost? Bineinteles, nu va recomand sa va relaxati total cu convingerea ca nu mai puteti schimba nimic, dar opriti-va un moment pentru a va gandi la ceea ce faceti si la ce impact are starea asta de neliniste sufleteasca asupra voastra.

In urma fazei judetene a olimpiadei, nu puteti pierde nimic. Daca credeti ca puteti pierde participarea la olimpiada nationala, asta arata ca ati comis o greseala provenita din infumurare: cum ati putea pierde un lucru pe care acum nu-l aveti? Va considerati deja calificati? Foarte rau. "Olimpiada" inseamna ca fiecare are sansa lui, si ca nu exista castigatori sau pierzatori stabiliti anterior concursului.

Poate ca observatiile de aici nu sunt pe placul tuturor, dar ele nu au aparut, cu siguranta, din senin. Nu esti un om rau, slab sau prost daca te concentrezi mai mult pe evitarea esecului decat pe obtinerea reusitei. Participantii la concursurile de informatica au foarte multe calitati pe care altii si le-ar dori, dar de multe ori lucrurile pe care ei le realizeaza sunt sub adevaratul lor potential. Lasati altora fatalitatea, superstitiile si gandul rau pus caprei vecinului si priviti cu incredere la oportunitatile pe care fazele superioare ale olimpiadei vi le ofera.

Spor la treaba!

Cum v-am mai zis si in alte posturi, suntem bucurosi ca am adaugat doi oameni noi in echipa. Ei sunt Adrian Airinei si Andrei Grigorean . Ambii au avut rezultate foarte bune la concursuri de programare ca elevi si au un numar impresionant de probleme rezolvate din arhiva infoarena. Recent i-am luat la intrebari. Vedeti aici ce a iesit:

Cum ai ajuns membru al siteului infoarena?
Adrian: Cand m-am calificat prima oara la ONI, in clasa a 10a, nu stiam nimic despre site-uri de pregatire pe net. Cei din lotul judetului Iasi vorbeau atunci despre infoarena cum ca ar fi un site foarte util cu probleme si concursuri. Cand am ajuns acasa, am cautat pe google infoarena, mi-am facut un cont si am rezolvat a+b si cmmdc.

Cum ai folosit acest site?
Adrian: In continuare, am gasit site-ul ca fiindu-mi de mare folos, in primul rand am rezolvat multe probleme. Forumul a fost iarasi foarte important, gaseam constant sfaturi utile acolo iar articolele m-au ajutat si ele.

De ce ai intrat in echipa infoarena? Ce iti propui sa faci ca membru al echipei?
Adrian: In calitate de membru al echipei imi propun sa incerc sa ajut cum pot comunitatea infoarena.

Cum ai ajuns membru al echipei infoarena?
Andrei: Dupa IOI, m-a intrebat Mircea intr-o noapte pe mess daca nu vreau sa ma implic mai mult in infoarena. I-am spus ca mi-ar placea, si m-a facut admin imediat.

Cum ai folosit acest site?
Andrei: De pe infoarena m-am pregatit cel mai mult pentru olimpiade, am rezolvat majoritatea problemelor din prima jumatate a arhivei. Am invatat cateva si de pe forum, citind posturile celor mai mari. Sectiunea de downloads mi-a fost de asemenea utila (am luat concursurile internationale de acolo). Si articolele m-au ajutat. La inceput cand nu ma prea prindeam de probleme, citeam solutiile oficiale de la diverse concursuri, iar apoi implementam. Desi ideal este sa te chinui pana cand iti vine ideea, la inceput e mult mai greu si uneori trebuie sa citesti solutiile. Tot pe infoarena am auzit de tine :)).

De ce ai intrat in echipa infoarena? Ce iti propui sa faci ca membru al echipei?
Andrei: Am intrat pe infoarena pentru a-i ajuta pe cei mai mici sa se pregateasca mai bine. Sper sa propun cateva probleme interesante la concursuri. De asemenea, cred ca pot spune si punctul de vedere al unuia care in urma cu doar cateva luni concura si se pregatea pe site. Atunci cand participi si nu organizezi, vezi lucrurile altfel.

Spor la munca baieti, suntem mandrii sa va avem printre noi!

Radu Berinde, care vara asta face un internship la VMware, va scrie un guest post despre programarea templateurilor in C++. Despre Radu am mai vorbit aici si aici .

Am inceput sa citesc o carte interesanta - "Modern C++ Design", numita si "the crack book" din motive ce devin evidente inca de prin capitolul 2. Intamplator, e scrisa chiar de un roman, Andrei Alexandrescu, care e unul dintre cei mai mari experti pe C++ din lume. Cartea arata cum se pot face lucruri foarte interesante si/sau ciudate cu template-uri. Mi-am amintit de ceva ce am auzit acum mult timp: despre cineva care facuse un program C++ care nu compila, dar mesajele de eroare aratau numerele prime. Mi se parea ceva de-a dreptul bolnav, insa - comparativ cu ce se intampla prin cartea mentionata - acum pare trivial un astfel de program. Si de fapt chiar este destul de simplu, asa ca m-am gandit sa fac un mic "tutorial" in care sa explic cum se face.

Principiul de baza

Poate stiti ca in STL exista o implementare generala pentru vector, insa exista si o implementare speciala numai pentru vector<bool>, care foloseste doar cate un bit pentru fiecare valoare. Idioma C++ care permite asa ceva este "template specialization" si este un mecanism foarte puternic (mult mai puternic decat vom vedea aici). Practic, compilatorul are mai multe definitii din care alege una anume. Folosind acest lucru putem sa "trucam" compilatorul in a face un "if".

De exemplu, sa zicem ca vrem sa facem o asertie la timpul compilarii. Avem o expresie statica (care poate fi calculata la compilare) si vrem sa primim o eroare daca aceasta expresie nu se evalueaza la true. Putem sa folosim aceasta idee de template specialization:

template<bool> struct CompileTimeError {};
template<> struct CompileTimeError<true> { enum { Cool = 1 }; };

Am definit un tip CompileTimeError care in general este gol. Insa daca parametrul bool se intampla sa fie true, compilatorul foloseste definitia specializata a tipului. Daca avem o expresie expr, sa ne gandim la urmatoarea expresie:

CompileTimeError<expr>::Cool

Daca expr = true, s-ar evalua la 1. Insa daca este false, vom avea o eroare de compilare - definitia generala nu include identificatorul Cool. Am reusit sa facem compilatorul sa evalueze doua lucruri diferite in functie de o expresie - un "if" daca vreti.

Recursivitate

Pentru ca tipurile sunt prin definitie imutabile, nu vom putea face compilatorul sa ruleze algoritmi iterativi - nu avem cum sa il facem sa mentina o stare. Va trebui sa convertim orice lucru iterativ in ceva recursiv, cum am face la un limbaj functional (in stil lisp). Cum determinam daca un numar este prim fara sa mentinem stare? Putem sa definim o "functie" HasDivisors cu doi parametri, N si K. HasDivisors returneaza true daca vreun numar intre 2 si K il divide pe N. Astfel, un numar este prim daca HasDivisors este true pentru parametrii N si N-1. Putem implementa aceasta idee cu template-uri:

template <int N, int K>
struct HasDivisors
{
    enum { Result = (N % K == 0) || HasDivisors<N, K-1>::Result };
};

template <int N>
struct HasDivisors<N, 1>
{
    enum { Result = 0 };
};

template <int N>
struct IsPrime
{
    enum { Result = !HasDivisors<N, N-1>::Result };
};

Observam recursivitatea din HasDivisors; conditia de oprire este implementata prin specializarea partiala HasDivisors<$N$, 1>

Putem combina acestea cu definitiile de mai sus pentru a genera erori pentru numerele prime:

template <int N>
struct PrimeErrors
{
    enum { Result = CompileTimeError<!IsPrime<N>::Result>::Cool +
                      PrimeErrors<N-1>::Result };
};

template <>
struct PrimeErrors<1>
{
    enum { Result = 0 };
};

Prima parte a expresiei din PrimeErrors este doar o asertie la timpul compilarii. Operatia de adunare e folosita doar pentru recursivitate. Din nou, specializarea ne da voie sa definim conditia de oprire a recursivitatii. In final nu mai avem nevoie decat de o instructiune care sa faca compilatorul sa evalueze PrimeErrors:

PrimeErrors<100>::Result x;

Daca compilam acest program, vom primi erori ca mai jos (am taiat din liniile repetitive):

templates.cpp: In instantiation of 'PrimeErrors<2>':
templates.cpp:25:   instantiated from 'PrimeErrors<3>'
templates.cpp:25:   instantiated from 'PrimeErrors<4>'
templates.cpp:25:   instantiated from 'PrimeErrors<5>'
...
templates.cpp:34:   instantiated from here
templates.cpp:25: error: 'Cool' is not a member of
'CompileTimeError<false>'
templates.cpp: In instantiation of 'PrimeErrors<3>':
templates.cpp:25:   instantiated from 'PrimeErrors<4>'
templates.cpp:25:   instantiated from 'PrimeErrors<5>'
...
templates.cpp:34:   instantiated from here
templates.cpp:25: error: 'Cool' is not a member of
'CompileTimeError<false>'
templates.cpp: In instantiation of 'PrimeErrors<5>':
templates.cpp:25:   instantiated from 'PrimeErrors<6>'
templates.cpp:25:   instantiated from 'PrimeErrors<7>'
...
templates.cpp:34:   instantiated from here
templates.cpp:25: error: 'Cool' is not a member of
'CompileTimeError<false>'

Daca filtram doar liniile cu In instantiation of ..., vedem frumos rezultatul dorit:

root@slack ~# gcc templates.cpp 2>&1 | grep "In in" 
templates.cpp: In instantiation of 'PrimeErrors<2>':
templates.cpp: In instantiation of 'PrimeErrors<3>':
templates.cpp: In instantiation of 'PrimeErrors<5>':
templates.cpp: In instantiation of 'PrimeErrors<7>':
templates.cpp: In instantiation of 'PrimeErrors<11>':
templates.cpp: In instantiation of 'PrimeErrors<13>':
templates.cpp: In instantiation of 'PrimeErrors<17>':
templates.cpp: In instantiation of 'PrimeErrors<19>':
templates.cpp: In instantiation of 'PrimeErrors<23>':
templates.cpp: In instantiation of 'PrimeErrors<29>':
templates.cpp: In instantiation of 'PrimeErrors<31>':
templates.cpp: In instantiation of 'PrimeErrors<37>':
templates.cpp: In instantiation of 'PrimeErrors<41>':
templates.cpp: In instantiation of 'PrimeErrors<43>':
templates.cpp: In instantiation of 'PrimeErrors<47>':
templates.cpp: In instantiation of 'PrimeErrors<53>':
templates.cpp: In instantiation of 'PrimeErrors<59>':
templates.cpp: In instantiation of 'PrimeErrors<61>':
templates.cpp: In instantiation of 'PrimeErrors<67>':
templates.cpp: In instantiation of 'PrimeErrors<71>':
templates.cpp: In instantiation of 'PrimeErrors<73>':
templates.cpp: In instantiation of 'PrimeErrors<79>':
templates.cpp: In instantiation of 'PrimeErrors<83>':
templates.cpp: In instantiation of 'PrimeErrors<89>':
templates.cpp: In instantiation of 'PrimeErrors<97>':

Dragut, nu?

Am vazut urmatorul puzzle pe un site cu intrebari de interviu Microsoft. Daca nu il stiti deja, incercati sa il rezolvati singuri fara a cauta indicii pe net. E un test interesant de intelegere a operatiilor pe biti.

Ce returneaza functia foo, cand x e un intreg fara semn pe 32 de biti?

unsigned int foo(unsigned int x) {
  x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1);
  x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2);
  x = ((x >> 4) & 0x0F0F0F0F) | ((x & 0x0F0F0F0F) << 4);
  x = ((x >> 8) & 0x00FF00FF) | ((x & 0x00FF00FF) << 8);
  return (x >> 16) | (x << 16);
}

Cateodata imi place sa ascult muzica in timp ce programez. In timpul liceului stiam inceputul melodiilor de la Deep Purple in ordine alfabetica, pentru ca asa erau in winamp, si cand se apropia sfarsitul uneia incepeam sa fredonez urmatoarea. Acum mi s-au schimbat putin gusturile si in timp ce lucrez imi place Daft Punk. Au o muzica interesanta, cu versuri simple fara intreruperi bruste de ton si asta e bine pentru concentrare.

Voi ce muzica ascultati cand programati?

Apropo de Daft Punk, v-am pus un video bestial de pe youtube, la inceput e mai lent dar pe la 2:00 incepe sa fie interesant.

Ideea e destul de misto, dar nu toate melodiile sunt la fel de reusite.

Cativa reprezentanti Google au fost saptamana trecuta la Universitatea Bucuresti si la Politehnica. Au tinut niste seminarii si o serie de interviuri pentru internshipuri sau joburi. Puteti citi mai mult aici

Trei studenti romani au participat saptamana trecuta la finala concursului TopCoder Collegiate Challenge desfasurata la Disney Land. Ei au fost Mircea Pasoi (domino) la concursul de algoritmica, Vlad Dumitriu (vlad_D) la cel de webdesign si Lucian Lazar (Luca) la concursul de software design. Felicitari pentru calificarea "onsite"! Mircea a reusit un rezultat foarte bun pentru Romania, calificandu-se in primii opt pe partea de algoritmi. Ultima data cand un roman reusise aceasta performanta a fost in 2004.

Concursul Campion este o noua editie, iar anul acesta, datorita eforturilor lui Marius Andrei si Liviu Valsan , are un nou sistem de trimitere a solutiilor. Astfel sursele submitate sunt validate, fiind rulate mai intai prin niste teste simple. Acest sistem este similar cu cel da la Olimpiada Internationala si face ca unele greseli frecvente ale concurentilor care uitau detalii mici dupa un concurs intens sa fie corectate. Sa speram ca introducerea sistemului la concursul Campion este doar primul pas si ca el va fi folosit cat mai curand la olimpiedele judetene si nationale.

Infoarena organizeaza a patra editie a concursului Happy Coding. Ideea initiala a concursului era sa fie unul in care se programeaza cu zambetul pe buze, fara presiunea din majoritatea concursurilor. Astfel evaluatorul solutiilor este pornit in timpul concursului, iar durata este mai lunga decat cea standard de cinci ore. Ii multumim lui Mugurel Andreica, care propune si de aceasta data problemele. Puteti citi mai mult despre concurs aici

Zilele astea infoarena a ajuns la peste 7000 de membrii inregistrati!

Din dorinta de a face enuntul problemei cat mai simplu am lasat cateva cerinte ale problemei nespecificate. De aici au aparut si cele trei updateuri la text.

Cei care au rezolvat problema sunt: Teodorescu Andrei-Marius , Adrian Sandor si Radu Cebanu.

V-am promis si o solutie:
Impartim planul in patrate de latura unu. Suprapunem toate patratele unul peste celalalt, si cum aria totala a petelor este strict mai mica ca unu rezulta ca va exista un punct care nu este acoperit de vreo pata. Marcam acest punct in toate patratele. Cand le punem inapoi in plan, punctul marcat se transforma in o grila de puncte. Acum putem selecta ca origine oricare dintre aceste puncte si ca axe dreptele paralele cu abscisa respectiv ordonata din sistemul initial, care trec prin punctul ales ca origine.

Sper ca v-a placut, chiar daca e o problema de mate.

L-am rugat pe Andrei Grigorean sa ne scrie un jurnal despre experienta lui la Olimpiada Interantionala de Informatica. Initial ma gandeam ca ar fi misto sa ne zica aproape live ce s-a intamplat in fiecare zi :), dar asta ar fi adaugat la stresul competitiei. Astfel am fost bucuros cand s-a oferit sa faca un rezumat dupa concurs, apoi am fost si mai bucuros cand l-a terminat. Multumim Andrei! Acum puteti sa il cititi si voi:

IOI 2007

In perioada 15-22 august 2007 am avut ocazia de a participa la cea de a XIX-a editie a Olimpiadei Internationale de Informatica , desfasurata in capitala Croatiei, Zagreb. Ceilalti trei membri ai lotului Romaniei au fost: Cosmin Gheorghe, Bogdan Tataroiu si Adrian Airinei. Am fost insotiti de prof. Emanuela Cerchez (Team Leader) si de Mugurel Ionut Andreica (Deputy Leader).

Acomodarea

In data de 15 august, la ora 4:30 dimineata, ne-am intalnit cu totii la aeroportul international "Henri Coanda" din Otopeni. Am zburat pana in Budapesta, unde am schimbat avionul pentru a ajunge in Zagreb. Am aterizat in Croatia pe la amiaza si am fost una din primele delegatii sosite. Un autocar ne astepta in fata aeroportului si am fost dusi in complexul unde am fost cazati si unde am luat masa timp de o saptamana. Am stat cate doi in camera, eu impreuna cu Cosmin, respectiv Bogdan cu Adrian, si imparteam aceeasi baie. Conditiile nu erau extraordinare, insa nici nu ne puteam plange - erau totusi camine studentesti. In privinta mancarii insa, am doar cuvinte de lauda. Puteam servi oricat doream din mese diverse, foarte gustoase. Am mancat foarte mult la IOI, mai ales eu si Cosmin :P.

Competitia

Inainte cu o zi de a incepe competitia a avut loc sesiunea de pregatire. Scopul acestui eveniment este familiarizarea cu sistemul folosit in concursul real si oarecum o usoara "incalzire" a concurentilor. Am avut posibilitatea de a implementa si submita timp de doua ore cele trei probleme afisate pe site-ul olimpiadei cu trei saptamani inainte. Totul a decurs bine, cu exceptia catorva probleme cu Rhide-ul.

Apoi a venit prima zi de concurs. Eu personal ma asteptam sa fie probleme interesante si asa a si fost. Am primit doua batch-uri si o problema interactiva. Dupa o scurta trecere in revista, am decis sa aboredez mai intai problemele sails si flood. Dupa doua ore si jumatate nu gasisesm nicio rezolvare, moment in care m-am hotarat sa incerc aliens. Dupa aproximativ o jumatate de ora gasisesm rezolvarea si am inceput sa implementez. Pana la sfarsitul concursului nu am mai reusit sa gasesc solutiile optime la sails sau la floodm asa ca am trimis rezolvari brute-force (la flood am terminat de implementat cu 5 minute inainte de final). Rezultatele din prima zi au fost conform asteptarilor: Cosmin - 235 pct (a facut sails de 100), Bogdan - 172 pct, eu - 145 pct si Adrian - 120 pct. Dupa estimarile mele aveam un aur, un argint si doua medalii de bronz cu aceste punctaje. Nu am reusit niciunul sa rezolvam problema flood, desi dupa ce am auzit solutia mi se parea mai simpla decat estimasem initial. Si punctajele obtinute de ceilalti concurenti aratau ca sails fusese cea mai grea din prima zi, nu flood.

A doua zi de concurs a fost putin diferita de prima. Am primit trei batch-uri, de dificultate variata. Miners era clar problema simpla, imediat cum am citit-o am si implementat-o. S-a dovedit ca peste 100 de concurenti au luat maxim la ea. Pairs era de fapt compusa din trei subprobleme independente - am gasit rezolvarea in timp util la toate, insa trebuia sa implementez arbori de intervale 2D, asa ca am decis sa o las la urma si sa incerc sa rezolv training. Aceasta a fost cea mai grea problema din concurs, cu doar 3 punctaje maxime :). Nu am reusit sa gasesc solutia optima, asa ca dupa ce am implementat o sursa care lua 30 de puncte, m-am intors la pairs. Faptul ca nu am implementat pana la urma ultima subproblema, si ca am uitat sa pun un -1, au facut ca punctajul meu in a doua zi sa fie de 172 de puncte. Adrian si Bogdan au luat 200, iar Cosmin 150.

Excursii

Dupa fiecare zi de concurs, organizatorii ne-au dus in doua excursii care mie mi-au placut foarte mult. Prima din ele a fost la un lac unde se pregateau sportivii croati pentru diferite sporturi pe apa (gen canoe). Acolo ne-am petrecut jumate de zi. Eu si Adrian, impreuna cu 3 bulgari, am jucat fotbal cu rusii, care aveau o mare vedeta in echipa - Petr Mitrichev. Daca la informatica nu am fost mai buni, macar la fotbal i-am batut... de doua ori :D. Se mai putea juca badminton, tenis de masa - a fost un fel de picnic cu vreo 400 de persoane.
A doua excursie a durat o zi intreaga. Am vizitat Lacurile Plitvice si casa memoriala Nikola Tesla. Puteti vedea cateva poze aici. Peisajele erau superbe, aratau mai bine in realitate decat in poze. Am fost la cea mai mare cascada din Croatia (din pacate nu apare in album), iar dupa masa am ajuns la casa memoriala a faimosului om de stiinta - pe mine nu m-a impresionat prea tare, nu aveau o modalitate atractiva de a prezenta informatia.

Sfarsit de poveste

Cu punctajele noastre am obtinut pana la urma cu totii medalii de argint, sa speram ca in anii urmatori Cosmin si Bogdan, impreuna cu ceilalti participanti la IOI, vor face mai bine decat am facut noi anul acesta. Ne-am intors acasa pe data de 22 august pe aeroportul "Henri Coanda", unde ne asteptau parinti, profesori, reprezentanti Intel si presa. Si-am incalecat pe-o sa, si v-am spus povestea asa.

Felicitam echipa Romaniei inca o data pentru rezultatul obtinut si mentionam ca dupa olimpiada, cei doi seniori ai echipei (Andrei Grigorean si Adrian Airinei ) s-au alaturat echipei infoarena .

In filmul despre Here comes another bubble ce l-am pus recent pe blog, am vazut o fata cunoscuta de pe topcoder. E vorba de Adam D'Angelo , el este acum Chief Technical Officer al Facebook (reteaua sociala hot a momentului). I-am gasit destul de repede profilul pe linkdedin.com care arata cam asa:

Facebook:
Built the initial ad serving infrastructure, optimized product code and databases for scalability as traffic increased, built the logging infrastructure for feed, and analyzed data. Created an rpc layer that led to increased development speed, easier maintainability, and language independence for most new services we later developed. Set up the engineering hiring process.

Honors and awards:
Finalist, Topcoder Collegiate Challenge, 2005
2nd in North America (team of 3), ACM International Computer Programming Contest, 2004
1st in North America (team of 3), ACM International Computer Programming Contest, 2003
Silver Medal, International Olympiad in Informatics, 2002

Il consider pe Adam un exemplu pentru cei care spun ca algoritmica/olimpiadele nu au importanta in programare. Probabil ca nu au importanta cand faci o aplicatie simpla de baze de date, dar cand apar sisteme mari si nevoia de eficienta, cativa olimpici pot fi foarte utili. (Prin olimpici eu inteleg elevi sau studenti care au avut rezultate la un concurs international, nu unii care au fost la olimpiada pe scoala sau pe judet.)

Mi s-a parut interesant ca pagina lor de joburi contine puzzleuri ce imi aduc aminte de problemele de la concursurile topcoder. Probabil e mana lui Adam acolo :).

Nu ai destule permisiuni pentru acest macro.

Un prieten imi zicea recent ca pun prea multe referinte la Google in posturi, si ar trebui sa adaug referinte la Microsoft ca blogul sa fie mai obiectiv (el lucreaza pentru M$).

Pentru a mai echilibra scorul, am pus videoul de mai jos cu o demonstratie impresionanta a unei aplicatii Microsoft. Demonstratia a avut loc tot la TED talks. Cred ca visul oricarui programator este sa lucreze la un astfel de proiect revolutionar.

Concursul Happy Coding s-a incheiat, si a fost unul de succes, facand ca traficul de pe site sa se dubleze. Mugurel si restul echipei de propunatori au facut treaba buna, propunand un numar impresionant de probleme, iar acum tot Mugurel ne prezinta o analiza la rece a concursului:

A mai trecut un concurs Happy Coding si s-ar putea spune ca incepe sa devina un concurs infoarena traditional. Daca in primul an (2005) toate problemele au fost luate de la concursurile de selectie a echipelor ACM ICPC din Universitatea Politehnica Bucuresti, incet-incet Happy Coding a ajuns sa aiba parte de portia sa proprie de probleme originale si interesante ;) Editia de anul acesta a reprezentat cel mai lung concurs infoarena si a avut cel mai mare numar de probleme (25). Ca si in anii anteriori, evaluatorul a fost pornit pe toata durata concursului, dar, pentru a "contrabalansa" aceasta facilitate, am stabilit ca la fiecare problema sa se poata obtine doar 0 sau 100 de puncte. In felul acesta, Happy Coding a devenit mai asemanator cu concursurile de tip ACM ICPC decat cu olimpiadele scolare - mie personal imi plac mai mult concursurile de tip ACM ICPC, datorita clasamentului "live" si a dinamismului mai ridicat. Apropo de clasament "live", a existat un "curent de opinie" la IOI anul acesta, conform caruia ar trebui sa existe un fel de clasament semi-live si la IOI (sa vedem ce se va intampla in viitor :) ).

Problemele au avut nivele de dificultate variate, rezolvarile lor necesitand observatii, idei si smenuri simple si/sau cunoscute, precum si idei noi, complicate si dificil de gasit. Imi era clar ca, desi durata concursului era de peste 8 zile si jumatate, ar fi fost foarte greu pentru cineva sa rezolve toate problemele. De aceea consider remarcabil rezultatul lui bogdan2412Bogdan-Cristian Tataroiu bogdan2412, care a reusit sa rezolve 24 din cele 25 de probleme (oare cat timp va dura pana va rezolva cineva si problema Optic , chiar si cu solutia publicata ? :) ) si a luat concursul in serios de la bun inceput, situandu-se pe unul din primele 2 locuri inca din prima zi de concurs.

In ceea ce priveste rezultatele celorlalti concurenti, eu le-as incadra in 7 (numar magic) categorii, in functie de numarul de probleme rezolvate:

  • cat.1: 23-25 probleme rezolvate => rezultat excelent
  • cat.2: 21-22 probleme rezolvate => rezultat foarte bun
  • cat.3: 16-20 probleme rezolvate => rezultat bun
  • cat.4: 11-15: probleme rezolvate => rezultat ok
  • cat.5: 7-10 probleme rezolvate => rezultat satisfacator
  • cat.6: 3-6 probleme rezolvate => mai are mult de lucrat si multe de invatat (dar are potential ;) )
  • cat.7: 0-2 probleme rezolvate => in trecere pe la concurs :)

Desi speram ca cei mai multi concurenti (45%-50%) sa se claseze in categoriile 1-5, o scurta privire aruncata asupra clasamentului arata ca lucrurile nu au stat astfel, aproximativ 75% dintre participanti situandu-se in categoriile 6 si 7 :( . Din acest punct de vedere, sunt usor dezamagit si am incercat sa ma gandesc care ar fi motivul pentru care cea mai mare parte a participantilor a rezolvat foarte putine probleme. Mi-au trecut prin minte 3 motive posibile:

  • Au luat mult prea la propriu ideea de "programare cu zambetul pe buze" si au tratat concursul cu o foarte mare lejeritate. Presupun ca aceasta reprezinta o posibilitate, insa atunci sunt curios ce anume i-a facut sa zambeasca in timp ce programau. Pe mine ma face sa zambesc un program bine scris care obtine 100 de puncte :)
  • Au rezolvat mai multe probleme, insa nu in proportie de 100%, iar sistemul de punctare "0 sau 100" nu i-a avantajat in aceasta privinta. Este posibil ca lipsa de experienta in ceea ce priveste concursurile de informatica sa nu permita unui participant sa isi gaseasca bug-urile din surse sau sa inteleaga motivele pentru care algoritmul sau nu functioneaza nici chiar intr-un interval de peste 8 zile si jumatate.
  • Nivelul de dificultate al problemelor a fost prea ridicat (ceea ce este evident pentru o parte dintre probleme) si nu au reusit sa gaseasca o solutie corecta sau care sa respecte constrangerile de timp si de memorie impuse.

Dintre cele 3 motive mentionate, primul se poate "rezolva" tratand concursurile mai serios, iar al doilea se poate "rezolva" programand mai mult si capatand experienta. A treia cauza posibila este cea care ma ingrijoreaza cel mai mult si este si cea mai dificil de "tratat" in mod individual (fara ajutorul cuiva). Pentru a ajunge sa poti rezolva probleme grele, in afara de a te stradui mai mult de unul singur, este important sa poti invata ceva si de la ceilalti. De aceea, am incercat sa scriu un articol cu solutiile problemelor cat mai detaliat, pentru a ajuta astfel pe toata lumea sa invete cateva (sau mai multe :) ) idei noi.

In perspectiva concursurilor viitoare, intrucat nu exista o reteta sigura pentru a ajunge in situatia de a iti veni (cine stie de unde :) ) ideile necesare pentru a rezolva o problema, pot doar sa va sugerez sa luati in considerare urmatoarele posibilitati:

  • ganditi-va singuri (fara a cere ajutor) la fiecare problema, pana cand gasiti solutia sau pana cand trece o anumita perioada de timp dupa care considerati ca nu puteti gasi solutia singuri (aici depinde de fiecare.. ar trebui sa fie cel putin 1-2 saptamani, dar mie mi s-a intamplat sa ma prind cum sa rezolv o problema si dupa 6 ani :) )
  • comunicati cu ceilalti membri ai comunitatii, schimband idei, discutand algoritmi si cerand sfaturi; si tineti minte sa ii ajutati si voi pe altii atunci cand veti avea posibilitatea
  • faceti pregatire cu un profesor care se pricepe; e foarte util pentru voi sa va ofere cineva informatii si cunostinte intr-un mod structurat (sa stiti ca asta nu e o reclama la adresa mea :) va spun doar ce mi se pare mie util si ce am facut si eu cand eram elev)
  • cititi cursuri de Computer Science, Graph Theory, Computational Geometry, Data Structures, String Algorithms, etc. si articole de cercetare de pe Internet; veti gasi multe concepte si idei foarte interesante, care s-ar putea sa va "lumineze" un pic mintea :)
  • participati la cat mai multe concursuri; chiar daca va prindeti cum sa rezolvati o problema, este important sa implementati corect si repede algoritmul de rezolvare

Daca are cineva si alte sugestii (sau nu este de acord cu unele din cele mentionate), il invit sa comenteze in sectiunea de comentarii.

Mult succes la concursurile urmatoare!

Nu am mai scris de ceva vreme si ca sa nu va plictisiti in lipsa de un post mai destept va sugerez niste articole interesante:

PayPal mafia Un articol despre fondatorii si cei ce au lucrat la PayPal. Multi dintre ei au plecat si au creat la randul lor cateva firme software de succes cum ar fi Slide, Yelp, Digg sau YouTube. E interesant ca nu se aud succese asa rasunatoare de la oameni plecati din Google. Deocamdata ar fi doar FriendFeed care e pe un trend ascendent, iar Twitter e facut de cei ce au facut Blogger, dar pe acestia nu ii putem considera de la Google pentru ca Blogger a fost o achizitie.

Google spotlights data center inner workings Jeff Dean, care e un super inginer de la Google, explica modul de functionare a unui data center de la noi. E destul de interesant articolul, mai ales in contextul postului lui Vivi despre scalabilitate 50 de servere vs. 10.000 .

Introduction to Google Search Quality? In acest articol Udi Manber, care e seful pe Search Quality la Google, explica putin din procesul de imbunatatire a algoritmilor de cautare. Poate numele Udi Manber va e cunoscut pentru ca e autorul paperului Suffix Arrays: A new method for on-line string searches

Pe curand!

Sambata a fost ziua centrala a finalei PreONI 2008, deoarece concurentii au avut la dispozitie 5 ore ca sa rezolve problemele si sa-si adjudece premiile puse in joc. Dupa o scurta intarziere, au urmat 5 ore de gandire si implementare, cu emotiile aferente, dar cu mai putine griji decat la o Olimpiada Nationala.

Seturile de probleme au fost:

Autorii sunt Filip Buruiana, Adrian Airinei, Adrian Diaconu, Mircea Pasoi si Andrei Grigorean.

Dupa concurs, participantii si comisia au mers in Plaza Romania pentru a vedea filmul Step Up 2, intr-o pauza de relaxare si socializare.

Ziua de duminica a inceput cu evaluarea LIVE, spectaculoasa de obicei. La ora 11, Cristi a anuntat finalul concursului de anul acesta, constatand ca nu exista contestatii sau alte tipuri de reclamatii din partea concurentilor. In numele infoarena, UPB si Adobe Romania, a transmis tuturor celor de fata ca organizarea evenimentului a fost o placere pentru noi toti, deoarece ne bucura sa dam ocazia elevilor pasionati de informatica sa se distreze si sa faca ceea ce stiu cel mai bine. Toata lumea a primit felicitari pentru prestatia avuta; se stie ca simpla calificare in finala PreONI e o realizare in sine.

Mircea a prezentat membrii infoarena care si-au adus contributia la aceasta finala, si i-a premiat cu prima cana personalizata cu insemnele concursului PreONI. Apoi a trecut la anuntarea si premierea celor mai bine clasati concurenti.

  • gimnaziu
    • premiul I: Cezar Mocan
    • premiul II: Radu Stefan Voroneanu
    • premiul III: Andrei Purice
  • clasa a IX-a
    • premiul I: Ioana Pandele
    • premiul II: Alexandru Tache
    • premiul III: Bogdan Bazu
  • clasa a X-a
    • premiul I: Bogdan Tataroiu (cu singurul scor perfect - 300 de puncte)
    • premiul II: Istvan Hevele
    • premiul III: Bogdan Casu-Pop
  • clasele XI-XII
    • premiul I: Cosmin Gheorghe
    • premiul II: Alexandru Tandrau
    • premiul III: Paul-Dan Baltescu

Toata lumea a primit diplome de participare, iar finala s-a terminat cu o poza de grup si un concert la pian al invitatului special, Maricel Mihalcea. Speram ca v-ati simtit bine la PreONI 2008, si ca ne vom reintalni la anul pentru o noua finala!

Pozele facute de Sergiu Strat
Pozele facute de Valentin Stanciu
Pozele facute de Mircea Pasoi

Tiberiu Florea - greco.ro

Astazi s-a dat startul finalei PreONI 2008 prin festivitatea de deschidere care a avut loc in Sala Senatului din Rectoratul Universitatii Politehnica Bucuresti. Atmosfera a fost una destinsa si toata lumea nerabdatoare in asteptarea unei noi editii a celui mai important concurs al comunitatii noastre.

Cristian Strat a luat primul cuvantul de la microfon, urand bun-venit tuturor la finala PreONI in numele infoarena si al partenerilor sai: UPB si Adobe Romania. Cristi i-a felicitat pe cei 40 de participanti pentru prestatia avuta in rundele concursului desfasurate online.

In continuare a vorbit Nicolae Tapus, pe care cei mai multi dintre noi il cunosc in calitate de presedinte al ACM Romania. Dupa urarile de rigoare, acesta a prezentat pe scurt Universitatea Politehnica. Am aflat ca acolo invata 26.000 de studenti la licenta, masterat si doctorat in cadrul unor domenii ca:

  • Inginerie Electrica
  • Automatica si Calculatoare
  • Mecanica
  • Electronica, Telecomunicatii si Tehnologia Informatiei
  • Inginerie in Limbi Straine

Domnul Tapus le-a expus pe scurt celor prezenti satisfactiile si posibilitatile pe care li le ofera o cariera in domeniul informaticii, asigurandu-i de nivelul ridicat al institutiei in cadrul careia activeaza.

In continuare, s-au adresat audientei reprezentantii companiei Adobe. Alexaxndru Costin a pornit, dupa mai multe incercari lipsite de succes, o afacere care a fost in cele din urma cumparata de actualul sau angajator. Nu a reusit sa ajunga la ONI (a participat la Olimpiadele Judetene in Vaslui), dar i-a asigurat pe elevii care il ascultau ca prin munca si perseverenta in depasirea obstacolelor care apar pe drum poti reusi sa infirmi pronosticurile care nu iti dau multe sanse de reusita. Exemplul sau (care include si mai multe interviuri ratate) confirma acest lucru.

Mihai, unul dintre colegii sai de facultate, impreuna cu care a pus bazele firmei InterAkt, ne-a povestit despre interesul pe care l-a avut in liceu pentru olimpiadele de Matematica, Informatica si Chimie. Cu toate ca s-a descurcat mai mult decat onorabil la facultate, pasiunea sa pentru antreprenoriat a fost mai puternica si nu regreta acest lucru. De aici a pornit o discutie intre domnul Tapus si cei doi angajati ai Adobe, in urma careia a rezultat ca sunt cu totii de acord ca facultatea are un rol fundamental in educatia si viata oamenilor, si ca nimeni nu descurajeaza un traseu mai conventional in perioada studentiei.

La final, Mircea Pasoi a vorbit despre aspectele tehnice ale concursului din urmatoarele doua zile. In sala s-a auzit un usor oftat cand a spus ca probele dureaza 5 ore din cauza dificultatii lor mai mari decat a celor precedente. Concurentii au aflat ca vor primi rezultatele duminica si ca evaluarea va avea loc LIVE in sala in care s-a tinut si festivitatea de deschidere. Discutia s-a mutat in domeniul sistemelor de operare si mediilor de programare, motiv pentru toata lumea sa rada la o gluma despre Borland C++. Recent incheiata Olimpiada Judeteana de Informatica e probabil inca proaspata in memoria elevilor.

Tot Cristi a pus capat "zilei 0" din cadrul PreONI, anuntand o serie de surprize: tricoul InfoArena (o premiera!), cadourile din partea Adobe si o iesire la film sambata seara. Dupa o pauza de socializare s-a mers la cantina pentru a lua cina, urmand ca gasca sa se sparga: concurentii la casele / camerele lor iar comisia inapoi in laboratoare, pentru a se asigura ca totul va decurge perfect maine.

Mult succes si distractie placuta celor care participa la PreONI 2008!

Vezi galeria foto de la deschiderea PreONI 2008!

Tiberiu Florea - greco.ro

Scoala a inceput de ceva vreme si se apropie perioada concursurilor online. Ca in fiecare an, din 2004 incoace, echipa infoarena va pregateste o noua editie a concursului preONI. Primul pas ar fi gasirea unui logo pentru concurs, si aici avem nevoie de ajutorul vostru.

Majoritatea logourilor folosite pe site au fost facute cu ajutorul userilor. Sa vedem cum au aratat siglele de-a lungul timpului.

La inceput infoarena.devnet.ro avea acest logo:

Cand s-a facut trecerea la a doua versiune a siteului pe domeniul infoarena.ro, Dan Burzo ne-a facut o sigla simpatica, in care mascota siteului are ochelari, ca orice geek respectabil, dar poarta un coif pentu ca e gata de lupta in arena.

Logoul pentru preONI 2006 a fost realizat tot de Dan Burzo.

Iar logourile pentru fiecare runda de Cristina Stancu Mara

Urmatoarele doua logouri au fost facute pentru preONI 2007. Al doilea nu a fost folosit.

autor Radu Lupaescu

autor Alexandru Marinescu

Le multumim inca o data celor ce ne-au ajutat si vrem sa va cerem ajutorul in realizarea unui logo pentru preONI 2008. O sugestie ar fi pentru culorile alese sa se integreze bine cu cele ale siteului.

Mihai a fost prin Romania recent si a dat doua prezentari de informatica teoretica la Universitatea Bucuresti. Prezentarile au fost adresate studentilor care sunt interesati de cariera de cercetare in algoritmica si structuri de date. Imi parea rau ca nu pot sa vad si eu cursurile si l-am rugat pe Alex Susu sa incerce sa le filmeze.

Puteti vedea subiectele abordate de Mihai aici.

Alex a pus cursurile online. Cel din prima zi il puteti vedea aici:

http://icwww.epfl.ch/~susu/MVI_9367.AVI
http://icwww.epfl.ch/~susu/MVI_9368.AVI
http://icwww.epfl.ch/~susu/MVI_9369.AVI
http://icwww.epfl.ch/~susu/MVI_9370.AVI
Iar cel din a doua zi aici:
http://icwww.epfl.ch/~susu/MVI_9375.AVI
http://icwww.epfl.ch/~susu/MVI_9376.AVI
http://icwww.epfl.ch/~susu/MVI_9377.AVI
http://icwww.epfl.ch/~susu/MVI_9378.AVI

Multumesc Alex! Calitatea video nu e foarte buna dar cea audio e ok si se intelege cam tot. Dimensiunea videourilor e destul de mare, poate isi face cineva timp sa la puna pe youtube ;). Nu am apucat sa vad toate videourile pentru ca inca le downloadez, dar din ce am vazut pana acum ele sunt interesante si inteligibile si pentru amatori.

Vizionarea acestor prezentari mi-a intarit convingerea ca informatica e un domeniu de cercetare misto, in care, spre deosebire de matematica, poti intra si mai apoi contribui relativ usor pornind de la cunostintele acumulate la olimpiade.

 Salutare, sunt Cosmin Negruseri si sunt bucuros sa va anunt ca infoarena si-a tras blog.

 Vorbeam cu Cristi pe la inceputul verii de nevoia unui blog pe inforena. Am ajuns imediat la concluzia ca trebuie sa fie un blog nativ pe infrastructura infoarena si nu unul pe care doar sa il integram. Pe de o parte nu ar trebui sa reinventam roata, dar pe de alta parte sunt multe feature-uri ale siteului de care vrem sa ne folosim.

 Am discutat si cu Mircea care era interesat de partea de programare, dar a avut timp de ea doar dupa ce si-a terminat internshipul pe vara in Redmond. A terminat prima varianta vinerea asta, dar a pus noul feature pe site doar dupa concursul de duminica. Inca mai e de lucru pe partea tehnica, dar e mai bine sa incepem mai repede decat mai tarziu.

Bine ati venit pe blogul infoarena, speram sa plecati de pe el putin mai destepti de fiecare data.

Cum blogul ar trebui sa fie orientat spre comunitatea infoarena am zis ca voi pune cate un post cu jmenuri de algoritmica din cand in cand. Sper sa va placa.

O problema clasica dar interesanta suna asa: Se dau n alegatori si fiecare voteaza pe unul dintre ei (toti alegatorii sunt in acelasi timp si candidati). Se stie ca unul dintre alegatori a primit cel putin n/2 + 1 voturi si acesta va obtine functia de presedinte. Gasiti un algoritm eficient pentru a determina viitorul presedinte.

Pentru a face putin mai interesanta problema, sa spunem ca sunt de ajuns n/3 + 1 voturi pentru a castiga alegerile si mai impunem restrictia ca exact unul dintre participantii la vot are mai mult de n/3 voturi.

Cum putem rezolva problema asta?

O solutie naiva, dar eficienta ar fi sa luam cateva nume votate aleatoare din sir. Cum castigatorul apare ca optiunea a multi votanti, daca alegem destul de multe valori din sirul optiunilor vom da cu probabilitate mare peste castigator. Cand alegem un nume aleator avem probabilitatea p > 1/3 ca am ales numele viitorului castigator. Deci daca alegem k valori vom avea un timp de executie de ordinul O(kn) pentru a verifica daca una dintre cele k valori e cea buna si probabilitatea de a gasi peresedintele mai mare de 1 - (1/3)k.

Alta idee vine de la faptul ca in sirul sortat, elementele de valori egale vor fi pe pozitii consecutive. Astfel numele presedintelui va aparea pe cel putin n/3 + 1 pozitii consecutive. Deci numele presedintelui va aparea sigur pe cel putin una din pozitiile n/3 sau 2n/3 din sir. Astfel putem folosi un algoritm de selectie pentru a gasi in O(n) elementele de pe pozitiile n/3 si 2n/3 si apoi in O(n) putem verifica care dintre acesti doi candidati au castigat.

Daca n nu depaseste un milion, putem la fiecare pas sa incrementam pentru candidatul votat x numerele a[x / 1000] si b[x % 1000]. Acum pentru a determina candidatul castigator, gasim valoarea p cu a[p] > n/3 + 1 si valoarea q cu b[q] > n/3 + 1, iar castigatorul va fi p * 1000 + q.

O solutie ar fi sa folosim un hash map ce mapeaza numele alegatorilor la numarul de voturi castigate. Solutia aceasta este eficienta dar foloseste O(n) memorie suplimentara pentru structura de date.

Alta solutie este sa facem grupuri de cate trei alegatori cu opinii diferite asupra castigatorului, care se cearta intre ei pana pica jos. Dupa ce am facut toate grupurile de cate trei, ne mai pot ramane maxim doua optiuni de candidati, in caz contrar mai gaseam un grup de trei votanti cu optiuni diferite. E clar ca dupa ce am eliminat grupurile de cate trei, va exista unul dintre alegatori cu optiunea pentru viitorul presedinte intre alegatorii negrupati, pentru ca acesta e votat de mai mult de n/3 ori. Asa ca pentru a gasi presedintele este de ajuns sa verificam cele doua optiuni ai alegatorilor ramasi negrupati. Va prezint codul solutiei:

Merge in O(n) ca timp si O(1) ca spatiu suplimentar.
x <- -1, counter_x <- 0;
y <- -1. counter_y <- 0;
pentru i = 1,n
  daca counter_x = 0 atunci x <- a[i], counter_x <- 1;
  altfel daca counter_y = 0 atunci y <- a[i]; counter_y <- 1;
      altfel daca x = a[i] atunci counter_x++;
      altfel daca y = a[i] atunci counter_y++;
          altfel
           // am gasit un grup de trei alegatori cu optiunile
           // x, y si a[i] pe care il eliminam
           // x != a[i], y != a[i] si x != y
           counter_x--, counter_y--;
verificam daca x sau y este elementul cautat.

Problema poate parea artificiala, dar reformulata in aceea de a gasi in mod eficient queriuri foarte frecvente(ce apar de n/k ori) pentru un motor de cautare devine mai interesanta si practica. Postul a fost inspirat din articolul "Problema majoritatii votului" ce l-am publicat in Ginfo, iar partea cu cearta intre alegatori din R. S. Boyer, J. S. Moore A Fast Majority Vote Algorithm

Dumitru Daniliuc mi-a zis o problema simpatica de pe vremea cand se antrena in liceu pentru olimpiadele de matematica, pe care acum vreau sa v-o zic si voua.

Problema suna asa: Se da o multime S, de puncte in plan. Aria ocupata de puncte e strict mai mica decat unu. Se cere sa se gaseasca un sistem de coordonate astfel ca punctele de coordonate intregi din acest sistem de coordonate sa nu se suprapuna peste nici un punct din multimea S.

Va rog, daca aveti solutii, sa nu le publicati pe forum ci sa mi le trimiteti ca mesaj privat. In doua zile voi publica o solutie si numele celor ce au rezolvat corect problema.

Update: Multimea S poate contine o infinitate de puncte. De exemplu S e formata din cateva pete si o dreapta. Aria dreptei e 0 si suma ariilor petelor e mai mica ca 1.

Update2: Pentru a nu complica problema si definitia a ce inseamna arie, impunem restrictia ca multimea S este formata din un numar finit de pete, fiecare avand o arie. Deci S nu va contine drepte, spirale sau mai stiu eu ce.

Update3: Sistemul de coordonate trebuie sa fie ortonormat si sa pastreze dimensiunile initiale.

Dupa feedbackul pozitiv de la primele doua probleme, m-am decis sa postez cate o problema draguta cam la doua saptamani.

Problema curenta: Un terorist se afla pe o axa infinita la pozitia X0 in momentul T = 0. La fiecare secunda teroristul se muta la dreapta cu Y unitati (Y poate fi si negativ). X0 si Y sunt numere intregi fixate pe care noi nu le stim. La fiecare secunda putem verifica exact o coordonata de pe axa si vom afla daca teroristul e sau nu acolo. Se cere determinarea unei modalitati de a il descoperi pe terorist si de a ii putea prezice pozitiile urmatoare.

Pentru intrebari referitoare la enunt folositi sectiunea de comentarii. Solutiile complete trimiteti-mi-le ca mesaj privat.

Problema a fost rezolvata de Mihai Patrascu, Radu Cebanu, Adrian Vladu, Marius Buzea, Marius Andrei, Adrian Carcu, Giurgea Mihnea, Liviu Ciortea, Adrian Sandor, Razvan Alecsandrescu, Igor Naverniouk si Csaba Patcas.

La prima vedere pare nerezolvabila, dar de fapt are o solutie destul de simpla. Ea se bazeaza pe faptul ca multimea ZxZ e numarabila. Putem verifica in fiecare secunda T cate o coordonata X0 + Y * T, parcurgand perechile (X0, Y) in spirala. Vom ajunge la un T1 pentru care teroristul este la locatia X0 + Y * T1. Inca nu am rezolvat problema, pentru ca pot exista mai multe perechi de numere pentru care teroristul sa fie la locatia X0 + Y * T1 in momentul T1. Prin faptul ca am gasit pozitia teroristului la un moment fixat T1, am redus problema la una noua determinata de parametrii X0', Y' in care in care nu il stim pe Y dar X0' = X0 + Y * T1. Aceasta subproblema se poate rezolva usor.

Alta problema cu teroristi ce mie imi place foarte mult este Lesbulan , ca dovada am si propus-o la concursul Bursele Agora.

Probleme cu tema similara sunt si Soarecele si pisica (medie ca dificultate, de pe Lista lu' Francu), Tom & Jerry (grea, nu a facut-o nimeni din cate stiu eu cand a propus-o Mugurel la lot) si tunnels (foarte grea, nu a facut-o nici o echipa in finala ACM ICPC 2006), smuggler (de pe rec.puzzles.org cu solutie). Daca sunteti curiosi de rezolvari, putem sa le discutam pe forum.

A venit din nou timpul pentru problema saptamanii. Va propun o problema interesanta ce mi-a zis-o colegul meu de clasa Radu Cebanu acum vreo trei ani.

Se dau doua puncte A si B. Exista doua drumuri(curbe infinit de subtiri) intre ele si aceste drumuri au proprietatea ca doua mobile punctiforme legate cu o sfoara de lungime 10 m pleaca din A si ajung in B fara a rupe sfoara. Nu exista vreo restrictie asupra miscarii mobilelor, decat ca ele se deplaseaza fiecare pe unul din drumuri. De exemplu viteza lor poate fi diferita, ele pot sa se miste chiar in sensul opus de la B la A, sau un mobil poate sta pe loc in timp ce al doilea se misca. Avem doi roboti in forma de discuri de raza 5 metri, unul cu centrul in A si celalalt cu centrul in B. Intrebarea este daca acesti roboti pot folosi cele doua drumuri pentru a ajunge din A in B si respectiv din B in A, fara a se ciocni. Robotii se misca fiecare cu centrul discului pe unul din drumuri.

Va reamintesc ca puteti folosi formul pentru clarificari ale enuntului, si mesajele private pentru solutii complete. Have fun!

Problema Pioni a fost rezolvata de Radu Cebanu, Andrei Grigorean si Stefan Istrate . Cinste lor, campionilor :)

Va reamintesc problema:

Se dau patru pioni in plan. Ei sunt varfurile unui patrat. O mutare consta in saltul unui pion peste un alt pion astfel ca dupa mutare pozitia primului pion e simetrica cu pozitia initiala iar al doilea pion e centrul de simetrie. Determinati o modalitate de folosi acest tip de mutari pentru a pune pionii in varfurile unui patrat mai mare decat patratul initial.

Solutia ei este destul de simpla: Presupunem prin absurd ca putem construi un patrat mai mare. Datorita faptului ca mutarile sunt simetrice, construirea unui patrat mai mare e echivalenta cu construirea unui patrat mai mic. Luam o grila laticeala ce are punctele (0,0), (1, 0), (1, 1) si (0, 1) in varfurile patratului nostru. Este evident orice mutare va pune punctele in coordonate intregi pe aceasta grila. De aici rezulta ca nu putem construi un patrat de latura mai mica decat 1. Astfel presupunerea noastra initiala este falsa si nu putem construi un patrat mai mare decat cel initial.

E timpul pentru o noua problema de rezolvat. Trimiteti-mi rezolvarile ca mesaj privat sau pe email la cosminn - at - gmail.com si in o saptamana voi pune o lista cu cei ce au rezolvat-o corect.

Se dau patru pioni in plan. Ei sunt varfurile unui patrat. O mutare consta in saltul unui pion peste un alt pion astfel ca dupa mutare pozitia primului pion e simetrica cu pozitia initiala iar al doilea pion e centrul de simetrie. Determinati o modalitate de folosi acest tip de mutari pentru a pune pionii in varfurile unui patrat mai mare decat patratul initial.

De data asta va dau doua probleme interesante de probabilitati, sunt relativ clasice, deci nu va suparati daca le-ati mai vazut inainte. Va amintesc ca imi puteti trimite solutii la cosminn at gmail.com.

1. Se da o moneda ce nu e ideala, adica nu cade cap sau pajura cu probabilitatea 0.5 ci cu o probabilitate p respectiv 1-p. Nu stim cat e valoarea lui p. Exita o metoda de a genera valori 0 sau 1 cu probabilitati egale?

2. Presupunem ca am gasit o modalitate de a obtine valori 0 sau 1 cu probabilitati egale. Exista acum o modalitate de a alege cu aceiasi probabilitate unul dintre fructele mar, para sau portocala, folosind metoda de generare a numerelor 0 sau 1?

Sa se determine produsul maxim a unor numere reale pozitive a caror suma e 100.

Trimiteti-mi solutiile pe privat sau pe cosminn at gmail.com

Problema curenta a fost rezolvata de urmatorii Alexandru Mosoi, Bogdan Dumitru, Mihai Patrascu, Mihai Stroe, Delia David, Dumitru Ciubatii, Teodorescu Andrei-Marius, Dobrota Valentin Eugen, Ghitulete Razvan, Savin Tiberiu, Nicolae Titus, Adrian Vladu, Catalin Tiseanu. Oare a fost problema simpla sau se apropie vacanta?

Problema suna asa:

Sa se determine produsul maxim a unor numere reale pozitive a caror suma e 100.

Am primit si cateva solutii care presupuneau ca numerele sunt intregi sau in care se considera ca am cerut produsul maxim pentru exact doua numere. Mie textul mi s-a parut destul de clar si se pare ca a fost la fel de clar pentru majoritatea celor ce mi-au trimis solutia buna.

Aveti aici solutia lui Mihai Patrascu:

1. Arati convexitate: daca a+b=S, max(a*b) = S2/4. Deci daca doua numere sunt inegale, le faci egale pastrand suma si marind produsul. Deci ca sa optimizezi pt k numere, optimul e (100/k)^k

2. Ca sa optimizezi dupa k, iei logaritm: k(ln 100 - ln k). Derivata e: ln 100 - ln k - k*(1/k) = ln(100/e) - ln k. Vedem ca functie e creascatoare pana la k=100/e si descrescatoare dupa. Deci optimul e k = floor(100/e) sau k=ceil(100/e).

3. Folosind Google :)
(100 / 36)36 = 9.39961298 * 1015
(100 / 37)37 = 9.47406172 * 1015

Am luat o pauza destul de lunga cu problema saptamanii. La ultima problema am primit doar doua solutii si am uitat de la cine (amintiti-mi si va trec ca rezolvitori). Gasiti textul aici .

Solutia problemei e destul de misto: Ne gandim la spatiul starilor problemei ca un patratul unitate din planul cartezian cu originea in (0, 0) si cu punctul diagonal opus in (1, 1). Abscisa unui punct din patratul acesta reprezinta pozitia normalizata pe intervalul [0, 1] a unui mobil sau un robot pe unul dintre cele doua drumuri de la A la B, iar ordonata punctului va reprezenta pozitia normalizata a celuilalt mobil respectiv robot pe al doilea drum de la A la B. Acum pentru ca ambele mobile pleaca din A si ajung in B, punctele asociate pozitiilor lor ne vor da o curba pornind din punctul (0, 0) si ajungand in punctul (1, 1). Iar punctele ce reprezinta miscarea celor doi roboti, care unul pleaca din A si ajunge in B si celalalt pleaca din B si ajunge in A, ne descriu o curba ce pleaca din punctul (0, 1) in (1, 0). Cele doua curbe trebuie sa se intersecteze si de aici rezulta ca orice doua drumuri am forma intre orasele A si B si orice itinerariu ar avea robotii, daca doua mobile pot ajunge de la A la B fiind legate cu o sfoara de lungime 10 m, atunci robotii nu pot ajunge unul din A in B si celalat din B in A fara sa se atinga.

Va propun o noua problema, trimiteti-mi ca si pana acum solutiile la cosminn at gmail.com, si neclaritatile legate de enunt in sectiunea de comentarii.

Se da o padure infinita in care copacii sunt dispusi in o grila laticeala (puteti sa va imaginati copacii ca punctele din ZxZ). Se cere sa se determine numarul maxim de vanatori care se pot pune in puncte din grila laticeala, astfel ca fiecare vanator sa poata vedea orice alt vanator direct. Inainte sa punem un vanator intr-un punct laticeal, taiem copacul deja existent acolo. Daca segmentul ce uneste punctele asociate a doi vanatori contine un alt punct laticeal, fie acesta ocupat de un copac sau un al treilea vanator, se considera ca acesti doi vanatori nu se pot vedea direct. De asemenea doi vanatori nu pot sta in acelasi punct laticeal.

Problema Vanatori a fost rezolvata corect de Delia David, Ovidiu Gheorghioiu, Bogdan Dumitru, Dobrota Valentin-Eugen si Catalin Tiseanu.

Incercarea unor cazuri pe foaie duce la intuitia ca numarul maxim de vanatori este 4. Sa vedem de ce aceasta intuitie este adevarata. Orice vanator ce e intr-un punct (x, y) ce apartine uneia dintre cele patru clase x - par, y - par; x - par, y - impar; x - impar, y - par si x - impar, y - impar. Orice doua puncte din aceiasi clasa sunt unite de un segment ce are mijlocul intr-un punct de coordonate intregi. Astfel am demonstrat ca putem numarul maxim de vanatori este 4, cate unul corespunzator fiecarei clase.

Ovidiu a venit cu generalizarea la spatiu n dimensional unde numarul maxim de vanatori e 2n. M-a si intrebat daca nu ar fi restrictia ce cerea ca trei vanatori sa nu fie colineari care e numarul maxim de vanatori care pot fi pusi pe grila. Eu naiv i-am zis ca pot fi pusi o infinitate, si Ovi mi-a raspuns ca sunt mai putin de 6 miliarde de oameni cu permis de port arma, deci numarul maxim clar nu e o infinitate ;).

Nu imi plac problemele "de formula"! Acestea sunt problemele de natura matematica din concursurile de programare, care ,de obicei, cer numararea unor configuratii si au ca raspuns o formula. Un motiv este lipsa de originalitate; e foarte probabil ca problema sa fi fost luata dintr-o carte de matematica. Alt motiv este ca nu testeaza partea de programare; de obicei programele ce rezolva astfel de probleme sunt usor de implementat (cateodata mai ai nevoie de numere mari...). Al treilea motiv e ca nu departajeaza elevii dupa valoarea sau ideile lor, ci mai mult "randomizeaza" rezultatele; unele formule sunt foarte greu de gasit pe cale matematica, dar sunt mai usor de ghicit.

Pentru a gasi formula de rezolvare, putem sa ne uitam la cateva rezultate mici si sa incercam sa ghicim cum arata formula ce le genereaza. O metoda banala ar fi sa variem fiecare parametru de intrare si sa vedem cum se modifica numarul cautat.

In problema mea aladdin2, se cere numarul de colorari al celulelor unei table n X m cu alb sau negru astfel ca orice patrat de dimensiune 2×2 sa aiba exact doua patrate colorate alb si doua colorate negru. Formula e banala 2n + 2m - 2 si se observa imediat cu variarea dimensiunilor.

Intr-o alta prolema data la un baraj se cerea afisarea numarului de arbori partiali ai unui graf bipartit complet cu n noduri de o parte si m noduri de cealalta. E mult mai simplu sa ghiciti de formula nn-1 * mm-1 decat sa mergeti pe calea rezolvarii oficiale care deduce formula prin folosirea codului Prufer

Adi Carcu imi zicea ca in '99 au inceput sa se dea probleme la baraj pentru care rezultatul era o combinare. La a doua problema de genul asta, multi dintre concurenti au generat triunghiul lui Pascal si au cautat rezultatele din exemplu in el. Astfel ei au rezolvat o problema de dificultate medie in cateva minute.

Alta problema interesanta e determinarea numarului de permutari fara puncte fixe. Problema are o solutie draguta folosind programare dinamica. Totusi poate fi rezolvata altfel urmand schimbarea rezultatului o data cu variarea lui n, si se observa destul de usor ca poate fi folosita formula [n!/e + 1].

In 2006 s-a dat la lot determinarea numarului de acoperiri cu dominouri a unui diamant aztec. Formula e foarte simpla 2n(n+1)/2 insa demonstratia solutiei e foarte complicata - implica folosirea de permanenti apoi transformarea lor in determinanti folosind numere complexe. Probabil nici baietii din lotul national de matematica nu s-ar descurca cu o problema de genul asta. Surprinzator, mare parte din concurentii de la concursul respectiv au rezolvat-o perfect. Unul dintre cei care nu a rezolvat-o, a fost Adrian Vladu, care, in loc sa incerce sa ghiceasca formula, a incercat sa gaseasca rezolvarea matematica. Eu vazusem problema in faza de documentare pentru articolele mele cu probleme de acoperire. Stiam ca nu poate fi rezolvata decat prin ghicirea rezultatului. De aceea inca imi pare rau ca am fost in comisie si problema a fost folosita in concurs.

Cand participi la un concurs online te poti uita pe Online encyclopedia of integer sequences Am folosit siteul asta pentru cateva probleme de la concursurile topcoder, si pentru o problema la Oni by Net. Sau poti sa cauti rezultatele pe Google :).

Radu Stefan a folosit o metoda destul de misto pentru a rezolva urmatoarea problema:

Se cere sa se numere in cate moduri se pot aseza k regi pe tabla de sah de n x n astfel incat regii sa nu se atace.

Radu s-a gandit ca solutia va fi un polinom in doua variabile P(n, k), iar gradul polinomului nu va fi prea mare (parca el a presupus ca limita e 6). Astfel a generat folosind metoda backtracking solutiile pentru n <= 6 si k <= 6. A considerat coeficientii polinomului ca necunoscute si a rezolvat sistemul de ecuatii liniare date P(n, k) si valorile obtinute prin algoritmul backtracking. Astfel luat punctaj maxim pe problema respectiva.

Problema patrat(lot 2005), cerea determinarea numarului de patrate magice de dimensiune 3×3 unde suma elementelor de pe linii, coloane si diagonale este N. Solutia este un polinomul de gradul 4. Fie el P(X) = aX4 + bX3 + cX2 + dX + e. Numim V1, V2, V3, V4 si V5 numarul de solutii pentru N = 1, ..., 5. Acum sistemul de care vorbeam mai sus va arata asa:

a + b + c + d + e = V1
16a + 8b + 4c + 2d + e = V2
81a + 27b + 9c + 3d + e = V3
256a + 64b + 16c + 4d + e = V4
625a + 125b + 25c + 5d + e = V5

Pentru polinoame intr-o singura variabila mai puteti folosi metoda diferentelor divizate care are o implementare foarte simpla.

Daca formula e ceva mai complicata decat un polinom, putem sa speram ca sirul solutiilor e caracterizat de o recurenta liniara, si astfel putem folosi din nou rezolvarea de sisteme de ecuatii lineare pentru a afla coeficientii recurentei.

Sper ca am aratat ca propunerea unei probleme de formula este o idee foarte proasta! Si chiar daca va confruntati cu una veti putea sa o rezolvati rapid folosind micile trucuri expuse mai sus. Chiar daca si eu am propus o problema de formula, sper ca ele vor disparea din concursurile importante gen ONI, baraje si LOT.

In rest Paste Fericit si Bafta la ONI!

Discutam cu Stefan Ciobaca, pe care il stiu de cand participam amandoi la Bursele Agora, si mi-a venit ideea sa scrie si el un post pe blogul infoarena. Stefan are cateva medalii la olimpiade internationale si un premiu intai la concursul Bursele Agora, a fost in comisii la ONI, Lot si la .campion. El a facut doua internshipuri pe vara la Microsoft si acum este in perioada de practica a masterului la ENS Cachan in Paris. Puteti sa ii cititi blogul aici. Mai departe ii dau cuvantul.

Cosmin m-a rugat sa scriu un guest-post; am decis sa fac o scurta introducere in domeniul cu care ma ocup la LSV (www.lsv.ens-cachan.fr).

Protocoalele de securitate (numite de asemenea protocoale criptografice) sunt mici programe care ruleaza intr-o retea cu ajutorul carora participantii pot comunica in mod "sigur". Desigur, o definitie mai vaga nici ca se putea.

Pentru a intelege despre ce e vorba, voi lua un exemplu clasic de protocol de tip challenge-response. Sa presupunem ca doi agenti A si B (Alice si Bob), au stabilit in prealabil o parola K (de exemplu K ar putea fi "stupidduck" sau "03031984") cunoscuta de amandoi (si de nimeni altcineva) si acum vor sa comunice intre ei. Alice doreste sa fie sigura ca vorbeste cu Bob. In acest sens, ei decid sa execute urmatorul protocol:

A -> B: enc(n, K)
B -> A: enc(n + 1, K)

[enc(x, y) denota criptarea lui x cu parola y.]

Alice este cea care initializeaza convorbirea si vrea sa se asigure ca vorbeste cu Bob. In acest scop, genereaza un numar aleator n si ii trimite lui Bob mesajul obtinut prin criptarea lui n cu parola K (partea de "challenge"). Stiind K, Bob poate decripta mesajul primit, afland in acest fel valoarea lui n. Bob calculeaza apoi n+1, cripteaza noul numar folosind parola K, si ii trimite inapoi lui Alice rezultatul ("response").

Dupa executia acestui protocol, Alice "stie" ca a vorbit cu Bob. Rationamentul ei are urmatoarea forma: "Am generat un numar aleator n, l-am criptat cu parola K (pe care o stiu doar eu si cu Bob). Am primit inapoi n+1 criptat cu parola K. Singura posibilitate de a primi n+1 este ca cineva sa fi aflat valoarea lui n si sa fi adaugat 1, apoi sa recripteze mesajul cu K. Ori acel cineva putea fi doar Bob, deci vorbesc cu el."

Desi este gresit (vom vedea in continuare de ce), acest rationament ne ajuta sa descoperim cateva lucruri despre modelul abstract in care studiem securitatea protocolului (in literatura de specialitate abstractiile folosite aici sunt reunite sub denumirea de modelul simbolic).

In primul rand, presupunem ca un atacator are puteri depline asupra retelei (intr-un anumit sens, presupunem ca atacatorul este reteaua). Atacatorul poate intercepta mesaje, poate crea mesaje noi, poate sterge mesaje, poate trimite mesaje mai vechi, etc. Acest model al atacantului este putin exagerat, dar sanatos.

Alta observatie de bun simt pe care o facem este ca Alice are incredere ca Bob a pastrat secreta parola K. Intr-adevar, daca Bob este corupt, protocol nu mai are sens.

Inca un lucru care merita remarcat: presupunem ca primitivele de criptare sunt perfecte: atacatorul nu poate deduce nici un fel de informatie despre continutul unui mesaj cifrat, decat daca cunoaste parola. Desi aceasta presupunere este incorecta in practica (intamplator si in teorie, dar nu intram aici in detalii), o folosim deoarece multe atacuri se folosesc strict de structura protocolului, tratand primitivele criptografice (criptarea in cazul nostru) ca niste cutii negre.

Voi prezenta in continuare un atac simplu asupra protocolui de mai sus. Atacul presupune ca parola K, stabilita in prealabil de Alice si Bob, are o dimensiune "relativ mica". Aceasta presupunere este naturala, deoarece un om nu poate sa retina un lucru complicat (alege ca parola o combinatie de cuvinte cunoscute, o data de nastere, un cod stil PIN, etc).

Eve (asa ii spunem atacatorului) intercepteaza o conversatie intre Alice si Bob si tine minte enc(n, K) si enc(n+1, K). Deoarece parola este de dimensiune relativ mica, Eve foloseste un dictionar pentru a genera toate parolele posibile (lasa calculatorul sa ruleze peste noapte). Pentru fiecare parola generata, Eve face un test simplu: cand decripteaza primul mesaj, adauga 1 si recripteaza rezultatul, obtine al doilea mesaj? Daca da, a dat (cu o probabilitate mare) peste parola folosita de Alice si Bob.

In atacul prezentat, Eve a fost un atacator pasiv: nu a modificat, creat, sau sters mesaje din retea. Tipul de atac lansat de Eve se numeste offline guessing attack. Guessing attack deoarece atacatorul "ghiceste" valorile posibile ale parolei; offline pentru ca testeaza daca a nimerit o parola corecta fara sa interectioneze cu Alice si cu Bob.

Ca un exercitiu, puteti sa dati exemplu foarte cunoscut de protocol care ar putea fi susceptibil unui online guessing attack si puteti preciza cum e (sau cum poate fi) prevenit un astfel de atac in practica?

Dupa cum vedeti, un protocol simplu poate fi susceptibil la atacuri suficient de subtile incat sa cerem o demonstratie formala a securitatii lui. Din pacate, desi mult mai buna decat o argumentatie informala asupra securitatii, o astfel de demonstratie nu ne asigura decat... o demonstratie... intr-un anumit model. Modelul este o abstractie tractabila a realitatii; spre deosebire de model, realitatea e cruda.

Click pe poza pentru un comic strip de pe xkcd.com

Mai mult, e greu de spus ce inseamna securitate: diverse protocoale pot avea diverse cerinte; printre proprietatile de securitate cele mai studiate sunt: confidentialitate (secrecy) -- atacatorul nu afla un anumit lucru, autenticitate (authenticity) -- stim cine este emitatorul unui mesaj, anonimat -- un utilizator nu doreste ca toata lumea sa afle ce vrea sa faca.

Despre protocoale de securitate se pot spune multe lucruri interesante, dar deocamdata inchei aici. Sper ca am reusit sa va castig atentia si ca subiectul vi se pare interesant. Ca un exercitiu de gandire, va las placerea sa descoperiti cum se poate concepe un protocol de tip challenge-response similar ca scop protocolului descris aici, dar astfel incat sa nu fie susceptil la un atac de dictionar (guessing attack = atac de dictionar, in romana).

Astept comentariile voastre.

Alt titlu la care m-am gandit pentru acest post este "In cate moduri poti sa propui niste probleme busite".
In fiecare an sunt probleme cu problemele de la regionala ACM la care participa studentii romani, iar anul asta s-a vazut mai clar din rezultate si nu din studierea testelor. Va ziceam intr-un post anterior ca un set de probleme bune este unul in care fiecare problema e rezolvata de cel putin o echipa, dar nici o echipa nu rezolva toate problemele. Anul asta sapte echipe au rezolvat toate problemele, una reusind sa le rezolve in doua ore si patru minute, cand timpul total al concursului e de cinci ore.

Putina istorie a problemelor bushite de-a lungul timpului:

In 2002 problema Sly Number implica rezolvarea unui sistem de ecuatii liniare modulare. Un concurent a testat cu backtracking testele comisiei si nici unul nu ii dadea rezultatul asteptat. In timpul concursului, o echipa a rezolvat problema respectiva, facand probabil aceiasi greseala ca si solutia comisiei.

In 2004 la problema City Game, se cerea determinarea dreptunghiului de arie maxima ce contine doar caracterul F pe o matrice ce contine caractere de F si R. Intre teste era unul care specifica o matrice de 100 de randuri si 100 de coloane, dar avea doar 98 de randuri. Daca aveai norocul ca partea de citire din program sa fie implementata ca si cea a comisieri, puteai rezolva problema ... Multe echipe s-au blocat in problema asta clasica, incercand sa isi gaseasca bugul de implementare care era de fapt in testele comisiei. De asemenea in acelasi an s-a propus problema Alibaba despre care am dubii mari ca ar exista vreo solutie de complexitate mai buna decat O(n^2) desi limita de timp din concurs facea ca o asemenea solutie sa obtina mesajul Time Limit Exceeded. Testele la Alibaba sunt foarte misto, cateva teste mici ce merg cu programare dinamica in O(n^2) si doua teste mari la care merge lejer greedy.

In 2005 s-a propus rezolvarea unui puzzle Sudoku, dar toate testele puteau fi rezolvate punand o cifra in locuri fortate, pentru nici un test nu trebuia facut backtracking. Astfel echipele care fac solutia buna au un dezavantaj fata de echipele care nu isi dau seama ca exista cazuri pe care solutia lor nu merge. Problema Adventurous Driving avea ca limita in enunt n <= 100 iar in teste era un n = 1000. Autorul problemei era mandru de ea, pentru ca doar o echipa a rezolvat-o in timpul concursului.

In 2006 problema Shortest Pair of Paths cerea determinarea a doua drumuri minime disjuncte de la sursa la destinatie. Problema este clasica si se rezolva cu flux maxim de cost minim, dar testele au facut ca o solutie ce gaseste de doua ori un drum folosind algoritmul lui Dijkstra sa mearga. Din nou echipele care au stiut ca problema e mai complicata au pierdut timp implementand solutia mai grea. Alta problema bushita a fost Sherloc Holmes care era un knapsack 2d, dar nu prea incapea in memorie pentru ca n si m erau 10000. Dupa concurs s-a vazut ca testele contineau n si m-ul maxim 300.

Acestea nu sunt singurele exemple.

Sa organizezi un concurs cu multe probleme, la un nivel inalt este foarte greu. Putine regionale reusesc asta. Printre ele sunt ECNA, o regionala din Canada, NEERC, una din Rusia, CEPC, regionala Europei Centrale. Acestea au probleme de calitate, de dificultate mare, cu explicatii de solutii scrise, cu o echipa de organizatori care contin studenti care au fost concurenti. Nu e de mirare ca aceste regionale au aproape in fiecare an o echipa in primele cinci din lume.

Si la TopCoder se intampla ca un concurs sa fie bushit, desi ei isi bazeaza afacerea lor pe asta. Dar pentru a evita greselile, care, avand in vedere ca organizeaza mai mult de un concurs pe saptamana, ar fi normal sa se intample, acestia au o metodologie foarte bine pusa la punct. Fiecare problema este rezolvata de inca trei oameni, altii decat autorul, care isi dau cu parerea atat asupra problemei cat si asupra testelor alese. Un al patrulea om are grija ca textul sa nu aiba ambiguitati. Autorul trebuie sa faca enuntul, testele si un validator pentru teste.

Concursul ACM este un eveniment important care se desfasoara o data pe an, si el ar trebui organizat cu grija, astfel incat concurentii sa nu plece cu impresia ca au fost luati in bataie de joc. Ce trebuie facut pentru corectarea problemelor din trecut ar fi intinerirea comisiei stiintifice, scrierea unui validator de teste, si implementarea a mai multor solutii pentru fiecare problema. Nu pare foarte greu, dar se pare ca nu se invata nimic din esecurile anterioare.

Puteti citi si postul lui Florin Manea, antrenor al echipelor universitatii Bucuresti, despre regionala ACM aici

Am observat de multe ori cum pe bloguri, liste de discutii, forumuri sau threaduri de email incepe cate o discutie legata de o oarecare problema si apar replici cu multe idei diferite. Cateodata solutia cea mai buna apare pe la inceput dar este ignorata si se discuta la nesfarsit idei evident mai slabe. In general oamenii ce raspund mai tarziu sunt bine intentionati dar nu isi cunosc nivelul.

Asta nu se intampla si pe forumurile de pe topcoder. Acolo participantii au rating in functie de performanta in concursuri. Astfel comunitatea e structurata ca o meritocratie. Coderii cotati cu rosu sunt respectati. Daca cineva cu rating de peste 2200 a postat o replica probabil are dreptate si poti sa te concentrezi mai bine pe ceea ce a zis. Puteam sa filtrez rapid posturile interesante si educative. Daca nu a raspuns cineva cu rating rosu pe un thread probabil nu e interesant si trec mai departe. Cum informatia abunda pe internet, filtrarea continutului de calitate devine din ce in ce mai importanta.

Simt cateodata lipsa acestor ratinguri, mai ales in domenii care nu le cunosc la fel de bine ca si concursurile de algoritmica. Un exemplu ar fi discutiile despre economie. Acolo sunt multi care isi dau cu parerea, dar nu iti poti da seama usor care sunt surse credibile de informatie si care sunt oameni care vor sa fie si ei in pas cu moda.

Ar fi interesant de vazut in ce alte contexte ar fi utile.

Mihai Oltean, proful ce mi-a coordonat licenta si pe care s-ar putea sa il cunoasteti ca autor al cartilor "Algoritmi, Proiectare si Programare" si "Programarea jocurilor matematice", a avut 15 minute de celebritate saptamana trecuta, aparand pe mai multe canale de televiziune la stiri. El a organizat un concurs intre studentii ce au urmat cursul de "Roboti inteligenti". Studentii trebuiau sa programeze diversi roboti echipati cu senzori sa iasa dintr-un labirint. Inca nu l-am prins pe Mihai online sa il intreb daca nereusita robotului sa iasa afara din labirint insemna picarea examenului, da e o idee interesanta.

Mai multe despre eveniment gasiti aici

Felicitari Mihai pentru organizarea unui eveniment reusit, sper ca acest concurs sa se repete si in anii urmatori!

Circula pe messengere si prin bloguri exemple amuzante ale traducerii din limba romana a expresiilor de genul "Romania e frumoasa" in "Australia is beautiful". Mi se pare ca subiectul merita putin context si il va face mai putin hilar.

Abordarea Google pentru a rezolva problema traducerii de texte este una statistica . Se trece prin o gramda de texte traduse si se obtin modele statistice care dau niste probabilitati ca o bucata de text sa fie tradusa in alta bucata de text. Algoritmul de traducere e din ce in ce mai bun cu cat are mai multe date la dispozitie. Rezultatele evaluarilor arata ca Google Translate este la un nivel "state of the art" si daca o sa il comparati cu o gramada de alte programe de tradus(programe gratuite sau programe ce pot fi obtinute contra cost) veti putea vedea asta.

Algoritmii cei mai buni de traducere sunt inca foarte departe de coerenta unor vorbitori umani, dar ei sunt utili pentru a face internetul mai accesibil celor ce nu vorbesc engleza. Probabil daca stati sa cautati veti gasi o gramada de alte exemple in care traducerea unui text nu va fi cea buna, iar dintre acestea veti gasi cateva exemple in care traducerea are efecte comice. Cu timpul calitatea se va imbunatatii si exemplele respective vor fi din ce in ce mai putine. Pana atunci puteti folosi google translate ca ceea ce este: una dintre cele mai tari scule de traducere automata.

Update: Intre timp problema a fost sesizata intern si corectata. E misto ca se pot rezolva probleme de genul asta repede. Asta imi aminteste de feature-ul care a aparut pe youtube inspirat din un comic.

Nu ai destule permisiuni pentru acest macro.
Nu ai destule permisiuni pentru acest macro.

Continuam seria de interviuri cu romanii ce au participat la finala concursului TopCoder Collegiate Challenge din toamna asta. Puteti citi prima parte aici . In aceasta parte Lucian Codrut Lazar ne va povesti despre concursurile de componente software si in special despre concursul de design software la care el s-a calificat in finala. Lucian are multa experienta cu aceste concursuri, a participat la 49 de competitii, a fost reviewer (membu al comisiei de corectori) la mai mult de 50 de componente, si a fost de doua ori reviewer la faza finala a concursului. In toamna asta a participat ca si concurent.

Lazar Codrut Lucian

Poti sa ne spui cate ceva despre concursul de software design? In ce consta el? Care sunt criteriile de notare, si care e partea dificila la un asemenea concurs?
In fiecare saptamana (de obicei joi) sunt puse mai multe componente (Java sau C#) pentru care trebuie facut design (sau development) intr-o saptamana. La design se da un document cu cerinte si trebuie facuta diagrama de clase, o diagrama de use case si diagrame de secventa pentru metodele mai complexe. Diagrama de clase contine toate clasele de care e nevoie pentru a implementa cerintele, cu toate metodele si campurile folosite. Toti pasii si toate constrangerile trebuie documentate (documentatia e orientata spre developeri). Mai trebuie un document Word, cu diverse discutii: thread-safety, algoritmi, demo, ... Design-urile sunt corectate de 3 review-eri. Sunt sectiuni pentru abordarea folosita (sabloane folosite, componente reutilizate, class scope, easy-to-use) - asta e partea faina dintr-un design; sectiuni pentru documentatie - aici e mai multa munca patriotica; si sectiuni pentru modul de prezentare. Sa gandesti strucura componentei poate fi mai greu la inceput, dar asta e partea faina a concursului. Apoi intervine partea de documentatie, care ia mult timp si devine enervanta, fiindca stii ce vrei sa faca fiecare entitate sau ce sa scrii in documentul Word, doar ca trebuie sa explici complet si asta ia mult timp.
La development sunt implementate design-urile de pe locul 1. Se face unit testing si se scrie documentatie orientata utilizator.

De ce software design si nu oricare dintre celelalte sectiuni (algoritmica, software development, marathon ...)?
Imi erau familiare sabloanele de proiectare si lucram la un framework pentru desenare de diagrame UML, deci stiam destul de bine UML. Sa incep la development mi-ar fi fost mai greu fiindca trebuia sa invat JUnit (sau NUnit) si parca nici nu prea am spor la implementare. La algoritmica am cam renuntat de cand am intrat la facultate, si oricum eram mult in urma ca nivel de cunostinte (plus ca tastez incet).

Cum ai recomanda cuiva sa inceapa sa participe la aceste competitii?
Sa citeasca GoF (cateva sabloane trebuie stiute: Strategy, Template Method, Abstract Factory, Observer, Adapter, Facade, Decorator). Trebuie intelese diagramele UML de care am zis mai sus. Un tutorial cred ca ajunge. Apoi intervine practica. In plus mai sunt forumuri publice, sau private pentru fiecare componenta. E bine sa intrebi orice nu e clar (despre sistem, despre componenta, despre diagrame, ...), fara frica de a parea penibil. In principiu, daca intrebi ceva cat de cat rezonabil, iti raspunde cineva repede si treci peste neclaritati.

Cum se ajunge la nivelul la care te poti califica la o faza finala pentru un asemenea concurs? Citesti carti? Proiecte facute de altii? Care e metoda de invatare?
Inceputul e mai greu - asta poate e valabil la orice tip de competitie. Pe masura ce faci mai multe componente devii mai sigur pe tine, plus ca inveti pe parcurs si din greseli. E bine sa te uiti pe componentele facute de altii. Cel mai bine e sa alegi componente facute de cei cu rating mare, ca sa nu dai peste abordari dubioase, care mai mult te baga in ceata. In cateva luni ajungi aproape de potentialu propriu, si poti incerca oricand sa te califici la turnee. Doar ca trebuie mai multa munca.

Ce programe software se folosesc in software design in general si la topcoder in particular?
Se lucra in Poseidon, dar acum se trece pe TC UML Tool - utilitar UML facut de TopCoder special pentru concursurile lor. Si un editor de documente in format .rtf.

Care a fost proiectul facut la TopCoder care ti-a placut cel mai mult?
TC UML Tool ;-)
Daca e vorba de componente, nu stiu ce sa zic. Mai recent - Graph Framework de la TCCC a fost interesanta, fiindca am avut libertate. Componentele in care sunt constrangeri de interfete sunt urate, fiindca nu prea e loc de o alta abordare si se rezuma doar la munca pentru documentatie.

De cate ore crezi ca ai nevoie pentru a face un design bun pentru o asemenea competitie?
16-20 ore efectiv. Plus mult timp petrecut citind cerintele, intreband pe forumuri si gandindu-te la componenta in timp ce mergi pe strada sau stai la o cafea.

Stiu ca in primavara ai fost in comisia ce evalua proiectele concurentilor la sectiunea software design pentru concursul TopCoder Open in Las Vegas. Cum e sa fi de partea cealalta a baricadei?
E aproape ca si cum ai face munca acasa, doar ca mergi acolo. Proiectele sunt mult mai de calitate (cel putin cele din top) decat ce vezi de obicei. Si iti ia mult mai mult timp sa la corectezi. Plus ca exista presiunea de a nu face vreo pozna sa dai scor prea mare sau prea mic si sa influentezi rezultatele. Asa ca trebuie sa insisti mai mult sa fii sigur ca ce au facut bine e intr-adevar bine si ce greseli ai gasit sunt intr-adevar greseli. Mie mi-a fost mai mult frica sa nu dau scor prea mare, fiindca la appeal-uri nu poti micsora scorul. Pe review-eri ne-au izolat de concurenti, intr-o camera. Ne-a dat cafea si ceva de rontait. Deci a fost bine.

Ce caracteristici crezi ca trebuie sa aiba un designer bun?
Mi-e cam greu sa raspund la intrebarea asta. Sa poata sa transforme cerinte textuale intr-o structura de clase care lucreaza impreuna pentru a atinge un scop. Nu stiu cum se numeste abilitatea asta. Trebuie sa ai o viziune de ansamblu, sa intelegi cum comunica mai multe componente, sa poti depista ce anume introduce limitari intr-o componenta, la fel cum ai depista unde se produce dead-lock intr-o aplicatie multi-threaded, doar ca lucrezi numai cu diagrame si nu cu cod, deci nu poti scrie teste.

Mersi Luci ca ti-ai facut timp sa raspunzi la intrebari. Maine voi pune online interviul cu Mircea Pasoi.

In aceasta serie de interviuri povestim despre concursurile de pe TopCoder cu cei trei romani care au participat la finala concursului TopCoder Collegiate Chalenge din aceasta toamna. Puteti citi celelalte doua interviuri aici si aici . Pe Mircea probabil il stiti deja si nu cred ca mai are nevoie de prezentare. In acest interviu el ne povesteste despre formatul competitiilor de algoritmica. Cred ca va fi interesant sa cititi opinia romanului cu cel mai mare rating la algoritmica despre aceste concursuri.

Mircea Pasoi

Povesteste-ne putin despre formatul concursului de algoritmica.
Formatul general Topcoder este urmatorul: ai 75 de minute sa faci 3 probleme, una usoara de 250 de puncte, una medie de 500 de puncte si una grea de 1000 de puncte. Cand trimti o problema punctajul pe care il primesti depinde de cat de repede ai rezolvat-o. Dupa cele 75 de minute ai inca 15 minute de "challenge", moment in care te uiti in sursele celorlati concurenti si incerci sa gasesti greseli. La sfarsit se evalueaza probleme si primesti puncte pentru o problema doar daca ai trecut toate testele.
Deaorece la o finala problemele sunt mult mai grele decat la un SRM obisnuit, faza de "coding" este de 85 de minute.

E a doua oara cand te califici la faza finala a concursului TopCoder Collegiate Challenge. Se simte vreo diferenta fata de anul trecut?
Cred ca rating-ul si rezultatul de anul asta dovedesc ca fost am mult mai bine pregatit ca anul trecut, si stiam si la ce sa ma astept de data asta. Chiar si asa, mai am mult de lucrat pana cand sa ma pot pune cu cei mai buni.

Cum se compara acest concurs cu celelalte concursuri internationale la care ai participat? Ca timp, stres, tipuri de probleme, strategie in concurs, concurenti sau locatie?

Topcoder este foarte diferit de concursurile de liceu. In primul rand cand treci de la concursuri de 5 ore la concursuri de 75 de minute diferenta e dramatica , si iti ia ceva sa te acomodezi. Un lucru foarte important la Topcoder este sa scrii cod corect, scurt si fara bug-uri. Poate pentru multa lume suna trivial, dar este mult mai greu decat pare! Concursurile de liceu nu te ajuta prea multe la chestiile astea, fiindca daca ai 5 ore iti permiti sa scrii incet, sa faci debug si mult testing. Plus ca uneori nu conteaza daca ai bug-uri ca tot iei puncte. Asa ceva nu merge la Topcoder. Eu unul am fost de mult ori surprins de solutiile altora care erau mult mai scurte si mai clare decat ceea ce faceam eu. Asta m-a ajutat mult sa-mi imbunatatesc implementarile. E surprinzator cate de usor e sa te complici sau sa faci chestii redundate cand scrii o sursa. Cred ca asta e si diferenta dintre cei din varf si restul lumii. Nu sunt mai buni pentru ca stiu sa scrie cod mai repede si mai mult, sunt mai buni pentru ca gandesc mai eficient si stiu sa scrie cod cat mai simplu.
Experienta de asemenea conteaza foarte mult. Cand ai 4-5 ore iti permiti sa incerci sa explorezi mai multe idei de rezolvare, lucru care rareori se intampla la Topcoder. Stai intre 5 si 15 minute sa te gandesti si apoi te apuci sa implementezi. Daca n-ai plecat pe ideea buna, de obicei nu mai sanse sa rectifici greseala. Mai bine treci la alta problema. Citeam pe undeva ca marii maestri la sah sunt mai buni decat restul nu pentru ca pot analiza mai multe posiblitati decat majoritatea lumii, ci pentru ca stiu sa analizeze cele mai bune posibilitati. Ceva de genul asta e valabil si la Topcoder.
O alta chestie destul de diferita sunt problemele, care de obicei sunt ceva mai simple decat cele pe la concursurile de liceu (ma refer in principal la 250 si 500, deoarece 1000le de obicei e comparabil cu problemele grele de liceu). Mindset-ul pe care trebuie sa-l ai cand rezolvi la Topcoder este destul de diferit de cel din liceu unde trebuie sa stai ceva timp sa te prinzi de solutia cea mai eficienta, de obicei trecand prin mai multe solutii din ce in ce mai eficiente. Aici trebuie sa te gandesti din prima care e solutia pe care o pot implementa cel mai repede si care se incadreaza in timp! Eu la inceput mereu aveam tendinta sa ma complic in rezolvari, sa optimizez unde nu era cazul sau sa ma gandesc direct la idei mai complicate decat era nevoie.
Per total, eu consider Topcoder ceva mai distractiv decat concursurile de liceu si o provocare mult mai mare in acelasi timp. Un lucru foarte important este ca oamenii cu care concurezi chiar sunt cei mai buni din lume, nu cei mai buni elevi de liceu (diferenta e ceva de genul ONI vs. IOI).

Cum te-ai pregatit pentru concurs?
Din pacate nu m-am mai pregatit deloc in ultimul an in mod special pentru Topcoder. Prin asta ma refer sa intru in arena si sa fac SRM-uri vechi. In schimb m-am pregatit pe infoarena si pentru ACM si se pare ca a fost destul de folositor pana acum.

Este greu sa te calfici in finala?
Da, este destul de greu. Cum am zis concurezi cu cei mai buni din lume pentru 48 de locuri. Poate parea mult, dar pe masura ce Topcoder devine din ce in ce mai popular e din ce in ce mai greu sa te califici Acum 2-3 ani nu erau mai deloc rusi la finale deoarece nu stiau de Topcoder, iar acum sunt in jur de 15 oameni din Rusia in mod constant. Cu China e aceeasi poveste si mai sunt si alte tari. Din fericire incepand cu TCO 2008 vor fi 72 de locuri. Oricum, oricat de bun ai fi, fara un pic de noroc n-ai cum sa te califici :)

Ce abilitati trebuie sa aiba un concurent puternic la algoritmica?
In mare parte ar fi ce am mentionat si mai sus:

  • sa gandesti repede si sa stii ce idei de rezolvare sa incerci (experienta ajuta mult in cazul asta)
  • sa scrii cod scurt si fara bug-uri intr-un ritm decent (nu trebuie sa-ti zboare degetele pe tastatura)
    O chestie deseori neglijata este cat de bine iti controlezi emotiile. Este foarte important sa fii cat mai relaxat la astfel de concursuri, si mai ales la TC unde stresul este ceva mai mare din cauza timpului putin.

Care a fost problema ta favorita din concurs?
Problema de 1000 din Room 3 pe care am facut-o doar eu si inca o persoana si cu ajutorul careia m-am calificat in cei 8 din finala.

Ce ti-a placut la DisneyLand?
Parcurile Disney :) Ar fi fost si mai tare daca ne lasau 2 zile in loc de 1 sa vedem toate parcurile. Daca cineva vrea sa vada poze pe care le-am facut la Disney si la TCCC poate sa intre aici .

Ce iti place la TopCopder?
Cam tot ce am explicat mai sus :) Trebuia sa te ascult si sa ma fi ocupat inca din liceu serios de Topcoder. :P

Cu acest post am terminat seria de interviuri despre concursurile topcoder. Sper ca acestea v-au motivat sa incercati competitiile care sunt foarte misto si pe toate gusturile. Ca liceean sau ca student este o modalitate foarte buna sa inveti ceva nou, sa cunosti oameni foarte buni, sa faci un ban in timpul liber si sa intrii in contact cu recruiteri pentru companii puternice ca Google, Microsoft, NVidia, Yahoo, AMD, Intel, City Group, UBS si altele. Paul a anuntat deja pe forum , dar vreau sa reamintesc si eu elevilor de liceu ca se apropie turneul TopCoder pentru liceeni. Anul trecut s-au calificat doua echipe din Romania. Una de la Colegiul national "Liviu Rebreanu" - Bistrita (liceul meu :) ) si alta de la ICHB, a doua echipa nu a putut sa participe pentru ca turneul era in conflict cu alt concurs. Sper ca anul asta sa se califice si mai multe echipe din Romania. Bafta!

In fiecare an topcoder organzieaza doua turnee, unul deschis numai studentilor si altul deschis pentru oricine cu varsta mai mare de 18 ani. De anul trecut cei de pe topcoder au initiat si o competitie de programare pentru liceeni. Ei au mai multe tipuri de competitii: algoritmica, maraton, development, design si studio. La concursuri se califica si romani din cand in cand printre care Adrian Carcu a avut rezultate mai deosebite fiind de doua ori campion si o data locul doi la sectiunea de software design. De la el am luat si eu microbul. Tin minte cum participam impreuna la concursuri de algoritmica la Laboratoru de cercetare al UBB pe la 4 noaptea pentru ca acestea erau organziate in special pentru programatorii din state.

In perioada 30 Octombrie - 2 Noiembrie s-a desfasurat finala concursului TopCoder Collegiate Challenge la Disney World, iar in finale s-au calificat trei romani: vlad_d (Vlad Dumitriu ) ce a participat la partea de studio a concursului, luca (Lazar Lucian, doctorand la Babes Bolyai, Cluj) care a participat pe partea de software design si domino (Mircea Pasoi student Universitatea Bucuresti) ce a participat la concursul de algoritmica si a reusit sa se califice in finala mica a acestui concurs clasandu-se in primii 8 programatori din lume. Am vrut sa aflati mai multe despre concursurile topcoder asa ca le-am luat interviuri celor trei. In acest post public interviul cu Vlad depsre concursul de design grafic, dupa care vor urma doua posturi cu intrebari si raspunsuri pentru Luca si Mircea. Vlad e participant mai vechi pe infoarena si ne-a facut logo-ul pentru preOni. Ii multumesc inca o data din partea echipei.

Vlad Dumitriu

Cum e concursul de design grafic?
E fain. La Studio Design trebuie "desenate" diferite chestii. Apar tot felu de proiecte de la logo design pana la webdesign, printing design si tot felul. Iar daca te referi la finala e faina atmosfera, te intalnesti cu oameni de treaba si primesti un proiect care trebuie sa il termini in 8 ore.

De ce ai ales sectiunea de design?
Ah, pai am incercat Algo dar am picat din runda 1 din cauza unei '{' la MM am ajuns in runda 2 si eram in juru lui top 100, si dupaia m-a cuprins lenea. Asa ca am incercat si Studio Design.

Cum ai inceput cu designul?
Am inceput si eu sa ma joc prin Photoshop, sa editez poze si etc.

Ce tooluri sunt folosite?
La studio design ai voie Photoshop CS3, AI CS3, si GIMP. Eu folosesc numa Photoshop si AI.

Care sunt partile dificile in acest concurs?
Probabil Inspiratia iar daca ai ceva practica cam poti sa iti desenezi ideile.

Ce caracteristici trebuie sa aiba un design bun?
Sa fie bun. In primu rand sa indeplineasca conditile din proiect requirements iar dupaia conteaza foarte mult stilu, culorile folosite, fonturile folosite, elemente grafice, sunt multe.

Cum ar trebui sa inceapa cineva interesat de acest tip de concursuri?
Probabil tutoriale de pe net sau daca este la scoala de Grafic Design numa' bine.

Ce ii deosebeste pe designerii buni fata de cei medii?
Probabil practica in caz ca au acelasi talent. Cred ca trebuie si talent si practica.

Cat timp iti ia sa termini un design?
Depinde. De la cateva ore la o zi probabil. Depinde cat de mare e proiectul, iar dupa terminare mai vine si revizuirea. Pe Studio.Topcoder la proiectele mici ai voie sa faci maxim 2 concepte iar la cele mai mari numai unu.

Cum a fost la DisneyLand?
Hmm.. Fain.. de mers cu familia daca ai copii mici. In rest pentru studenti nu prea e DisneyLand-ul, ci GreatAmerica, SixFlags etc.. ceva mai serios.

Mersi pentru interviu Vlad. Revin maine cu unul din celelalte doua interviuri.

Citeam via Manafu un articol interesant din Revista Biz despre salariile in mai multe industrii. Pentru mine e interesanta partea cu salarii in domeniul IT pe care o gasiti in totalitate la pagina 17. Am pus in imaginea alaturata doar partea de dezvoltare soft.

Dupa cum stiu eu salariile in programare din Cluj, pragurile din articol par bune, mai putin ca pe partea de entry level, unde sunt ceva mai mici. Presupun ca sunt variatii mari de la regiune la regiune si de la firma la firma.

Voua cum vi se par estimarile?

Pe 25-28 Octombrie se va desfasura la Universitatea Politehnica din Bucuresti faza pe sud estul Europei a concursului ICPC organizat de ACM. Acest concurs este unul in care echipe de trei studenti, fiecare echipa lucrand pe un singur calculator, se infrunta pe parcursul a cinci ore sa rezolve cat mai repede intre sapte si noua probleme.

Solutia unei probleme se ruleaza pe o suita de teste si este considerata corecta doar daca obtine rezultate corecte pentru toate testele. Daca au rezolvat corect o problema, echipa primeste um balon cu culoarea corespunzatoare problemei, daca nu se primesc niste mesaje ca 'Raspuns Gresit', 'Timp de executie expriat', 'Limita de memorie depasita' etc Astfel este usor de a vedea clasamentul sau cea mai simpla problema pe care echipa ta nu a rezolvat-o inca, daca te uiti prin sala la baloanele celorlaltor echipe. Punctajul este alcatuit din suma timpilor trecuti de la inceputul concursului pana la rezolvarea corecta fiecarei probleme, la care se adauga cate 20 de minute penalizare pentru incercarile esuate de a trece testele. Aceasta modalitate de acordare a punctajelor face ca strategia cea mai buna sa fie rezolvarea problemelor simple la inceput. De obicei problemele sunt calibrate cam o treime simple, o treime medii si o treime mai grele, si se urmareste ca fiecare problema sa fie rezolvata de cel putin o echipa, dar sa nu fie o echipa care sa rezolve toate problemele.

Vor mai urma saptamana aceasta cateva posturi legate de ACM ICPC in curand.

A inceput de ceva vreme anul scolar si ne-am hotartat sa ne organizam si sa punem osul la treaba. Astfel recent cei din echipa infoarena am avut doua sedinte in care am pus tara la cale.

Pentru ca siteul infoarena nu ar fi nimic fara comunitatea utilizatorilor ei, ne-am decis sa va informam despre discutiile si deciziile luate:

Au aparut cateva schimbari in echipa, astfel Andrei Grigorean si Adrian Airinei devin consilieri. Eu am devenit consilier (din consilier emeritus, ce insemna consilier fara activitate). Adrian Vladu a devenit consilier emeritus.

S-a discutat despre concursul preONI 2008 pe care il va coordona Mircea. Formatul va fi acelasi ca si anul trecut cu patru runde si finala "onsite". Va incepe in luna noiembrie. Cristi va cauta sponsori.

S-au definit mai clar rolurile membrilor, astfel eu ma voi ocupa de blog. De forum, calendar si coordonarea concursurilor inafara de preOni se va ocupa Andrei. Silviu va fi responsabil de sectiunea cu articole ajutat de Catalin Tiseanu, si pe langa asta va fi implicat in cautarea de sponsori. Cristi se ocupa de comunitate, de newsletters si de implementarea comentariilor pentru blog. Adrian Diaconu si Daniel vor avea grija de arhiva de probleme. Valentin va munci pe partea proiectelor noi in comunitatea infoarena de la Implica-te . Leo se ocupa de partea de gestiune a banilor si va continua sa se ocupe ca si pana acum de evaluator. Iar Adrian Airinei va lucra pe partea de organizare a concursurilor.

Mircea si Leo au adus in discutie lucrul la infoarena 3.0 care presupune o rescriere a siteului. Deocamdata suntem in faza de discutii, iar Mircea si Leo ne vor arata la urmatoarea sedinta un design doc pentru a putea evalua mai bine ce avantaje si dezavantaje sunt in lucrul la un nou site.

Va reamintesc ca avem proiecte interesante la sectiunea implica-te , unde ajutorul vostru e binevenit.

1) Mergeti cu starea de spirit potrivita!

Am discutat un pic despre asta si aici si am de gand sa mai abordez subiectul in viitor. Ca sa nu ma repet, o sa sintetizez: starea voastra de spirit va avea un impact mai mare asupra rezultatului decat ceea ce mai puteti invata in timpul ramas. :)

2) Nu credeti in legile lui Murphy

Sunt cea mai proasta chestie pentru oricine vrea sa reuseasca orice. Felia de paine unsa pe o parte are 50% sanse sa cada pe partea care nu trebuie. Nu mai multe, nu mai putine, ci 50%. Stiti prea bine de unde ati pornit, unde sunteti, unde vreti sa ajungeti. Norocul si ghinionul n-au nicio treaba cu concursurile de informatica. Sfaturile care incurajeaza pesimismul si resemnarea sunt doar modalitati de a-i face pe cei instabili emotional sa-si piarda si mai mult din echilibru!

3) Faceti cateva liste inainte de concurs

De exemplu lista lucrurilor pe care nu trebuie sa le uitati: ceas (nu telefon), pixuri, apa, buletin. In fiecare dimineata de OJI ma gandeam numai la ce-as fi putut uita acasa. Nu e bine! De asemenea, lista greselilor frecvente pe care le-ati facut in timp ce ati rezolvat probleme in ultima luna. De cate ori ati avut un conflict de nume intre o variabila globala si una locala? De cate ori ati pierdut ore bune ca sa va dati seama ca aveati un vector prea mic? Fiecare dintre noi face greseli, si are un top al celor mai frecvente lucruri care-i cauzeaza probleme la implementare. Si totusi, de fiecare data pierdem la fel de mult timp pentru ca la sfarsit sa exclamam cu furie/tristete: "iar am gresit chestia asta?!?".

In mod cert veti face erori cauzate de neatentie in concurs - toti facem! Problema e sa le identificati cat mai rapid, pentru ca nu aveti cum sa le eliminati din start.

4) Studiati mediul de programare

Sfat care nu poate fi repetat de destule ori pentru cei care lucreaza tot anul in GNU C/C++, eventual in Linux. Stiu ca iti e sila (nu, nu e un cuvant prea puternic) de Borland. Si mie imi e, si cred ca tuturor membrilor echipei Info-Arena le e. E invechit, retardat, si cum mai vreti voi. Dar regulile sunt reguli si veti avea nevoie sa dati doua surse care sa ia multe puncte atunci cand sunt compilate cu produsele Borland. Toata lumea trebuie sa treaca prin asta, si probabil ca ceilalti elevi buni sunt la fel de "nerabdatori" ca si tine sa se confrunte cu acest adevarat obstacol. Nu mai incerca sa amani readaptarea la Borland, e ca atunci cand dezlipesti un plasture. Cu cat mai repede, cu atat mai bine.

5) Nu uitati sa va distrati!

Pentru ca despre asta ar trebui sa fie olimpiada pana la urma. Nimeni nu o sa nege aspectul competitiv, si tuturor ne place sa castigam. :D Dar in viata sunt multe "concursuri", si olimpiada judeteana e unul singur dintre ele, destul de nesemnificativ fata de altele pe care le veti descoperi mai incolo. E OK sa tintiti la primul loc si chiar sa recunoasteti asta fara sa va fie rusine. Totusi, performanta vine atunci cand lucrurile decurg fara un efort constient prea mare din partea ta. Atunci cand esti in febra concursului si treci prin momentele alea in care scopul tau devine nu sa faci mai bine decat celalalt, ci sa rezolvi perfect problema.

Suna ciudat pentru cineva "din afara", dar noi, cei din comunitatea Info-Arena, ne distram rezolvand probleme. :) De ce sa ne ascundem?

Va urma...

Tiberiu Florea - greco.ro

6) Cel putin o zi libera inainte de proba

Altii ar sugera o saptamana. Eu n-am putut niciodata sa iau o pauza atat de mare, si va inteleg perfect daca nu puteti nici voi. Totusi, nu trebuie sa puneti mana pe tastatura in ultima zi. Deconectati-va in orice fel va place voua, dar nu lucrati. E o recomandare care nu se negociaza! Faceti-va programul pe zilele ramase asa cum stiti ca sa-l respectati.

7) Invatati regulamentul

Stiti motto-ul cercetasilor? BE PREPARED! Se poate intampla ca regulile sa nu fie respectate. Nu credeti? Acum cativa ani, regulamentul spunea ca elevul are dreptul sa-si aleaga modelul de memorie printr-un comentariu la inceputul sursei sau verbal in timpul evaluarii semi-automate. Persoana care se ocupa de jumatatea manuala a evaluarii refuza sa inteleaga acest lucru.

Nu te poti baza pe faptul ca totul se va desfasura corect. Poate va fi nevoie sa te certi pentru un lucru sau altul (nu recomand daca nu esti sigur ca ai dreptate), si daca se ajunge in situatia asta nu e nimic mai penibil decat sa te certi fara sa stii ce spun regulile. Cat de mult poate lua o lectura completa a regulamentului? O poti face in perioada de relaxare premergatoare zilei de concurs.

8) Nu uitati ce se testeaza de fapt

Oricat de paradoxal pare, e unul din lucrurile usor de scapat din vedere. Nu se testeaza cine e mai bun, mai destept sau mai rezistent. Se testeaza cine obtine mai multe puncte pe doua probleme, intr-un anumit mediu de programare, in 3 ore de lucru. Desi factorii enumerati mai sus vor conta, nici unul dintre ei nu va fi decisiv.

Pe problemele pe care nu stiti sa le rezolvati, puteti obtine puncte cu greedy-uri nedemonstrate, backtracking-uri si diverse alte abordari neconventionale. Doua probleme rezolvate foarte bine sunt mai bune decat o problema rezolvata perfect. O sursa de 3 randuri care afiseaza '-1' poate face diferenta intre 95 si 105 puncte, si asa mai departe. Sunt lucruri pe care le-ati mai auzit de 100 de ori, si totusi merita repetate.

9) Testati, testati, testati

Iesi de la concurs si colegii te intreaba cate probleme ai facut. Le spui ca una (sau doua, daca esti priceput si ai avut o zi buna). Si totusi, clasamentul aduce mereu surprize neplacute. De ce? Pentru ca o problema nu e rezolvata atunci cand functioneaza pe exemplu. Uneori vedem rezultatul corect si ne grabim sa trecem mai departe pentru ca nu vrem sa dam peste un test care ne demonstreaza ca implementarea e gresita. Totusi, daca refuzi sa vezi un lucru, nu inseamna ca acel lucru nu exista. E mult mai bine sa stii din timpul concursului ce nu merge decat sa iesi increzator in niste surse busite.

Subiectul e prea complex pentru a-l dezvolta acum. Stiti cu totii sa dati teste de mana, si ar trebui sa stiti si sa scrieti un program brute-force si un generator de teste mai mari, nu e nevoie sa cititi intr-o carte despre cum se face asta.

10) Ramaneti lucizi dupa ce se termina

Tocmai au trecut 3 ore extenuante. Ai terminat la limita de implementat ceva, nu esti 100% sigur daca o sa mearga. Intrebi in stanga si in dreapta ce au facut altii si constientizezi ca de-acum nu mai poti schimba nimic. Ce-o fi o fi.

Opreste-te, respira adanc, si revino-ti in fire. Indiferent de ce crezi ca ai facut, nu ai voie sa adopti masuri extreme cum ar fi plecatul acasa atunci cand ti se permite sa asisti la corectare. Crede-ma, nu vrei sa iei decizii importante din cauza impulsurilor pe care le ai in astfel de momente. Partea cea mai grea a trecut, acum mai trebuie sa ai grija doar de cateva detalii.

Multa bafta tuturor! Aveti incredere in voi!

Tiberiu Florea - greco.ro

Mircea a terminat implementarea proiectului IAP5 . Si Adrian Diaconu a selectat 50 de probleme care sa faca parte din proiect. Acum orice vizitator al siteului va putea vedea toate sursele trimise la oricare dintre cele 50 de probleme selectate. Problemele din arhiva cu "surse deschise" au cate o carte desenata in dreptul lor. Pentru a vedea o sursa puteti intra la monitor, de acolo la evaluare completa, iar apoi la vezi sursa.
Problemele au fost alese de Adi pentru diversitatea lor. Sper ca acest pas facut de infoarena sa fie urmat si de alte proiecte legate de olimpiadele de informatica. Tin minte cum in liceu invatam foarte mult citind din sursele elevilor mai mari. Cred ca problemele cu sursele deschise de pe infoarena se vor dovedi un material foarte bun de pregatire.

Mai avem inca o initiativa interesanta, si cred ca impreuna cele doua proiecte vor spori cu mult utilitatea siteului.

Va astept cu comentarii si sugestii!

TED sunt niste conferinte tinute anual cu o serie de discursuri tinute de diversi oameni destepti despre domeniul lor, care sunt deschizatoare de ochi. In 2006 mi-a placut mult talkul despre economie a lui Hans Rosling. El avea o firma cu un produs ce facea niste grafice interactive, animate pe axa timpului. Dupa ce l-a vazut in actiune, Google i-a cumparat firma :). Anul acesta, Hans a mai avut un talk care a fost la fel de interesant, cu un final neasteptat. Fiecare talk are 20 de minute, daca nu faceti ceva important acum, urmariti-le ca merita:

Myths About the Developing World (2006)

Watch the end of poverty (2007)

Apropo, va recomand Meditatii informatica daca vreti sa va apucati de meditatii.

Eu stiam de Jon Bentley pentru ca este autorul cartii Programming Pearls, o carte scrisa foarte bine si care se citeste foarte usor, spre deosebire de Introducere in algoritmi. Ea contine multe trucuri dragute de algoritmica si poate reprezenta o introducere foarte buna pentru cei ce vor sa invete algoritmica. Singura problema e ca nu este tradusa in romana.

Astfel am fost curios cand Jon a avut o prezentare, numita Three Beautiful Quicksorts, la Google acum doua luni. In talk apar chestii interesante cum ar fi optimizarea metodei qsort() din C (si ca paranteza Joshua Bloch mentioneaza ca implementarea din Java a functiei sort() urmareste indeaproape ideile din talk) sau o imagine in care vedem ca variante diferite ale quick sortului nu au graficul similar cu cel al functiei n\ log\ n, ci se vad trei bucati care se comporta diferit, ele corespunzand nivelelor de cache si memoriei. Sperand ca v-am deschis putin apetitul, puteti sa vizionati aici prezentarea:

Trondheim e un oras destul de rece din Norvegia in care e mai mult noapte decat zi, dar din cand in cand ai sansa sa vezi aurora boreala. El are 165 000 de locuitori. Orasul asta nu pare a avea nimic special, dar surprinzator Google, Yahoo si Microsoft au toate cate un sediu acolo. In Romania nu ne putem lauda cu asa ceva, desi mitul ca "romanu e destept" este bine bagat in constiinta colectiva.
Ca exemple pozitive in Romania stiu doar de Adobe care au sucursala in Bucuresti unde se lauda ca fac chestii destul de misto. Nu aveam nici o parere despre Adobe, dar dupa ce am inceput sa le citesc blogul mi s-a parut o firma din ce in ce mai misto. Mai sunt si Oracle in Bucuresti, Nokia in Cluj si Amazon la Iasi, dar sunt inodore/incolore pentru mine. Probabil ar trebui sa urmeze exemplul Adobe si sa isi faca blog.
Am intrebat colegii din Trondheim cum a reusit sa fie asa de atractiv pentru cei trei giganti IT. Ei mi-au povestit ca orasul este unul studentesc, avand 25000 de studenti, si un centru intelectual in Norvegia. Se face multa cercetare, iar in facultatea de informatica se studiaza mult Information Retrieval. Astfel sunt multi profi si studenti care lucreaza la cel mai inalt nivel exact pe domeniul pe care se bat Google, Yahoo si Microsoft. Unul dintre acesti profesori a pornit o mica companie care avea un motor de cautare. Aceasta companie a fost cumparata de Yahoo si au aparut si centrele Google si Microsoft care au luat oameni cu experienta de la prima companie, profesori de la universitate si studenti pregatiti pe information retreival.

Astfel se pare ca investitiile bine plasate pot fi destul de profitabile intr-un interval de timp mediu. Din pacate in Romania nu se fac investitii in educatie sau cercetare, si de aceea suntem condamnati urmatorii cativa ani sa ramanem indienii europei si sa facem outsourcing.

Proiectul pe care am inceput eu la Google acum aproape doi ani, a lansat relativ recent un widget pentru detinatorii de siteuri, care face paginile de erori 404 ceva mai utile. Deocamdata widgetul e in faza experimentala. El incearca sa vada daca ati facut o greseala la tastare si sa o corecteze oferindu-va un URL corect cat mai apropiat de cel tastat. De asemenea widgetul mai are un link spre sitemap, unul spre directorul superior si o casuta de cautare ce contine sugestii pentru cautare.

Proiectul a fost pornit de Mihai Stroe ca un proiect de 20% . Acest proiect e unul de suflet pentru mine, prin el am cunoscut mult din infrastructura Google, am lucrat cu cativa oameni foartebuni , si am vazut cum se duce la Google un proiect de la faza de prototip pana la cateva lansari oficiale.

La multe succese in continuare Mihai si echipei!

Update Acum ca ati folosit putin Chrome poate ati remarcat pagina de erori DNS sau 404. Aceasta pagina e si ea o aplicatie a proiectului de care va ziceam.

Imi place mult threadless.com . E un site unde concureaza diverse designuri de tricouri (poza din stanga luata de pe threadless.com e un exemplu al unui astfel de design). Daca un design primeste un scor bun atunci autorul ia 2000$ si cei de la threadless incep sa vanda tricouri cu designul respectiv. In 2006, creatorii siteului au castigat in jur de 6 milioane de dolari, deci pe langa ca e o idee misto are si sens pe partea financiara. O parte importanta a succesului vine din implicarea afectiva a vizitatorilor. Designurile ce ies castigatoare au fiecare ceva deosebit si nu se produc in masa iar asta ataseaza cumparatorul de tricoul cumparat. Lumea se implica, comenteaza pe forumuri, voteaza, blogheaza si isi fac poze cu tricourile respective.

Alt site de succes ce se bazeaza pe concursuri este topcoder.com. Dar nu ma refer la concursurile de algoritmica, care au fost gandite ca o metoda de a aduce oameni buni pe site si apoi sa fie recrutati pentru joburi. M-am gandit la concursurile de componente, unde diversi programatori concureaza pentru realiza o componenta software. Succesul siteului e datorat pe de o parte faptului ca programatorii ce concureaza sunt din tari unde salariile de programatori sunt mici. Dincolo de acest aspect, procesul folosit de topcoder pentru crearea unei componente este foarte bine pus la punct si elementul de competitie intre programatori face ca rezultatul final sa fie destul de bun. Probabil este mai bun decat ceva scos de o firma care face outsourcing, dar nu pot sa imi dau cu pararea pentru ca nu am lucrat in Romania la niciuna.

Concursul organizat de Netflix e alt exemplu. Netflix e un serviciu care trimite DVD-uri cu filme in posta. Ei au lucrat la un sistem de recomandari personalizate de filme, pe baza filmelor vazute de clienti. Au transformat problema interna de imbunatatire a algoritmul cu 10% in una deschisa publicului larg cu un premiu de un milion de dolari. La prima vedere premiul de un milion de dolari pare unul foarte mare, dar el reprezinta doar salarul a 10 programatori in state timp de un an. Alta problema este ca nu se stia daca pragul de 10% este usor sau nu de trecut. Ideea de a organiza un concurs pentru a rezolva problema a fost foarte buna, pentru ca multi cercetatori au muncit intens la ea si cei de la Netflix platesc premiul doar daca cineva obtine rezultatul cerut. Deocamdata nimeni nu a reusit sa atinga pragul fixat.

Faptul ca concurenta aduce dupa ea calitate este clar, dar mi s-au parut interesante abordarile acestiu principiu pe cateva siteuri ce imi plac.

Mai multe despre cei de la threadless puteti vedea in prezentarea lor presarata de glume si idei misto de aici

Se apropie olimpiada judeteana si ma gandeam de ceva vreme sa scriu un articol despre diverse metode de antrenament. Am exagerat putin cu lungimea articolului, probabil am avut in minte postul Size matters a lui Steve Yegge, dar va incurajez cu caldura sa il cititi in totalitate. Sper sa va placa sa il cititi in aceiasi masura in care mi-a placut mie sa il scriu.

Tin minte senzatiile de la olimpiadele de mate din gimnaziu, cand ajungeam la concursuri regionale sau nationale si nu prea intelegeam despre ce vorbeau unii elevi de exemplu "principiul cutiei" sau "media patratica". Un elev era foarte nervos ca nu facuse "problema cu musca" la clasa. Stiind trucul respectiv ar fi rezolvat toate patru problemele la olimpiada nationala, fara acel truc a ramas doar cu trei probleme rezolvate perfect. Eu eram foarte fericit ca anul ala rezolvasem o problema si un subpunct de la alta si mergeam cu capul sus acasa cu un premiu.

Alta amintire este ca in clasa a 8-a rezolvasem o problema de distanta in spatiu de care eram foarte multumit si la o tabara de pregatire un elev din Arad, si el pe clasa a 8-a, mi-a zis ca a rezolvat problema respectiva in 5 metode, una dintre ele folosind integrale. La aceiasi tabara nu imi iesise o problema de geometrie in plan care cerea minimizarea unor distante si acelasi elev din Arad mi-a aratat o cartulie ce trata acel gen de probleme si mi-a zis ca daca studiam cartea inainte ma prindeam de problema. Eu abia daca rezolvam o culegere de probleme intr-un an de zile ...

Era o problema de standarde diferite, cum inca nu eram copt, credeam ca ideile apar din aer si e de ajuns sa stii la nivel de clasa matematica si apoi sa te "scremi" tare ca sa reusesti sa rezolvi problemele.

In liceu am trecut pe info, unde mi se parea mai usor. Erau doar vreo doua culegeri de probleme nu mii ca la matematica prin care sa filtrezi pana sa gasesti una ca lumea. L-am cunoscut pe Adi Carcu cu care si acum sunt foarte bun prieten. Mergeam la el acasa destul de des si povesteam probleme pana se facea tarziu ... cred ca parintii lui se intrebau cand o sa plec :).

Pana in clasa a 11-a aveam idei pe la probleme dar nu imi iesea implementarea la nici una. Atunci a inceput concursul Bursele Agora la care am participat serios facand la fiecare problema solutii diferite, evaluator, generatoare de teste aleatoare si soltuii brute force. Abia dupa ce am facut 15 probleme de la Bursele Agora ca lumea am inceput sa am incredere in abilitatile mele de implementare. Atunci am dat si peste Cormen, si eram tare entuziast pentru ca inainte nu aveam de unde invata si deodata aveam o carte in care erau explicate toate chestiile despre care auzisem.

Cred ca atunci a fost momentul cand am devenit pasionat de informatica. Citeam in fiecare zi cate ceva mai si implementam si ma gandeam la probleme, si asa mi-am dat seama ce inseamna sa fii olimpic. Cand esti pasionat faci un lucru din placere in fiecare zi. Nu tragi tare cu o saptamana sau doua inainte de judeteana sa acoperi ceva material din programa. Pentru un elev pasionat nu exista programa ci doar placerea de a rezolva probleme si de a invata ceva nou.

Mi-am dat seama cum la matematica eram un pigmeu fata de cei care se pregateau serios. Nu se poate compara munca de un an cu cea de cateva saptamani sau doua luni.

In facultate am meditat de cateva ori un elev care obtinea rezultate destul de bune, dar cand a venit la pregatire am vazut rapid ca nu avea baze teoretice aproape deloc, facea totul dupa intuitie si se descurca bine. A venit cu vreo doua luni inainte de olimpiada si apoi a doua data cu 2 saptamani, si i-am zis ca are o gramada de gauri in cunostinte. El mi-a replicat ca in astea doua saptamani trage tare. Mi-a venit sa rad si i-am zis ca nu are rost sa se chinuie sa acumuleze multa informatie ci sa foloseasca aceiasi metoda care i-a mers si pana atunci. Problema e ca dupa ce faci un salt in cunostinte, la inceput nu rezolvi probleme mai usor, ci iti dai seama ca abordarile tale sunt gresite. Astfel in loc sa mai incerci o abordare gresita cu care ai putea castiga 60-70 de puncte vei astepta ideea care rezolva perfect problema. Dar ideea respectiva s-ar putea sa nu vina si tu sa ramai cu 0 puncte. Invatarea si evolutia e un maraton nu un sprint (am furat expresia asta de la Emanuel, colegul de apartament ;)).

Radu Berinde imi povestea cum intr-o vacanta de vara facea probleme pe acm.timus.ru toata ziua, in vremea aia era al 4-lea in clasamentul rezolvitorilor de pe site. Programul lui zilnic era: antrenamente la sala, iesire seara la bere, si probleme pe timus in restul zilei. Mi se pare o vacanta destul de misto :)

Adi Carcu nu se antrena mai deloc pentru concursuri, inainte de judeteana facea una sau doua probleme ca sa fie sigur ca nu si-a iesit din mana si cam atat. Dar el intrase in lot din clasa a 9-a si acolo facuse antrenamente serioase unde luptai pentru locul la un concurs international. Mihai Patrascu zicea ca o tabara de antrenament ar fi durat o luna in vremea cand participa Adrian.

Pe langa asta, Adi avea tot timpul proiecte personale de programare la care lucra (printre care un chat listener pentru reteaua din camin :)), si cred ca ele ajuta chiar daca nu sunt de algoritmica. Adi dupa fiecare lot trecea prin problemele ce s-au dat si incerca sa le rezolve astfel incat codul sursa sa fie eficient, foarte inteligibil si foarte scurt. Tot timpul programele lui mi se pareau foarte simple si lizibile in comparatie cu cele ale altor concurenti. Simplitatea, lizibilitatea si faptul ca codul sursa e scurt ajuta mult la viteza de depanarea a bugurilor.

In clasa a 11-a, in seara dinaintea probei citisem intr-o gazeta de info cum se gasesc componentele biconexe intr-un graf neorientat. A doua zi la concurs am primit o problema care cerea determinarea componentelor biconexe intr-un graf neorientat. Nu mai imi aminteam toate detaliile dar, naiv, m-am apucat de lucru. Dupa trei ore nu am reusit sa fac nimic si nu am implementat nici macar solutia evidenta.

Este important sa va antrenati implementarea cum facea Adi pentru a va da seama cum puteti transforma solutiile in cod cat mai simplu, de asemenea orice algoritm netrivial care credeti ca il veti folosi intr-un concurs gen componente biconexe, flux, infasuratoare convexa, subsir crescator de lungime maxima in O(n log n), arbori echilibrati, trebuie sa il implementati de doua sau trei ori pentru a fi sigur ca il faceti corect si rapid cand aveti nevoie de el. Problemele cele mai dificile sunt cand trebuie sa combinati mai multi algoritmi sau structuri de date, iar in concurs se adauga stresul, limitele de timp si nu ar trebui sa mai aveti si probleme de implementare a algoritmilor ce i-ati studiat deja. E bine sa implementati algoritmii pe care ii considerati clasici de mai multe ori si pentru a putea estima mai bine timpul necesar pentru a rezolva o problema. Partea de "time management" e si ea una importanta in concursuri.

Daca vreti sa va antrenati implementarea la problemutze simple puteti incerca cu incredere practice rooms de la topcoder, acolo sunt de la probleme simple la mai grele si aveti acces la codul sursa al unor concurenti care au incercat si ei problemele respective. Puteti vedea o gramada de variante de rezolvare a aceleiasi probleme si va puteti decide care e cea mai buna varianta pentru stilul vostru. La probleme mai grele puteti incerca cu incredere infoarena. Sper ca proiectul in care sharuim sursele si proiectul cu arhiva de invatare va fi folositor in acest sens.

Cu Mircea Pasoi si Silviu Ganceanu vorbeam cand erau ei pe a 10-a respectiv a 12-a aproape in fiecare zi probleme pe messenger si ei lucrau arhiva problemelor de pe acm.sgu.ru , Silviu se si mutase la ICHB si il avea pe Mihai Stroe profesor. Mie mi se pare ca i-a ajutat foarte mult pe amandoi faptul ca discutau si lucrau in paralel.

Silviu imi zicea de trei elevi din clasa a 10-a care lucrasera inainte de ONI toata arhiva de pregatire de la USACO si iesisera pe primele trei locuri la clasa a 10-a la ONI, cred ca primul a fost Valentin Stanciu, daca tin bine minte. Lui Silviu ii placea cum cei trei elevi ai lui se ambitionasera unul de la altul si au evoluat mult.

Nu stiu daca ati urmarit anul trecut evolutia clasamentului arhivei de probleme, dar eu vedeam cum wefgef, gcosmin si btataroiu se luptau intre ei si in fiecare zi isi mareau numarul de probleme rezolvate din arhiva.

Este foarte bine sa ai un prieten sau un grup de prieteni pasionati si ei de concursuri. Concurenta te ambitioneaza iar comunicarea cu alti pasionati de algoritmica te ajuta sa aflii tot felul de trucuri mai repede. In general profesorul de la clasa e depasit de nivelul problemelor de olimpiada, daca nu l-ai depasit inca ar trebui sa iti faci probleme. Rolul profesorului este doar sa zgandare pasiunea in tine la inceput, dupa aia esti pe cont propriu si de aceea comunicarea cu un grup de pasionati e vitala. Pe forumul infoarena sau pe cel de la topcoder va puteti face prieteni pe care ii veti pastra si mai tarziu in viata.

Ar ajuta daca gasiti pe un fost olimpic de la care sa luati meditatii, in Bucuresti cel mai simplu e sa mergi la ICHB, in Iasi sau Suceava gasiti relativ usor fosti olimpici puternici, in Ardeal in schimb mai rar, probabil ati putea vorbi cu Patcas Csaba (coleg cu mine de an) care pregateste echipa Babesului pentru ACM si pe cativa baieti din Cluj pentru ONI. Cineva cu experienta in concursuri va poate ghida inspre anumite tipuri de probleme, spre siteuri sau carti utile.

Pregatirea psihica si controlarea stresului in timpul concursului sunt si ele importante. Mircea a preluat o idee de la echipa de ACM a universitatii Waterloo, si inainte de un concurs important face o pauza de programare de o saptamana ca sa se linisteasca. Abordarea asta s-ar putea sa nu fie buna pentru cei ce "ingrasa porcu in ajun". Puteti sa incercati sa aflati din timp care sunt conditiile in care trebuie sa participati in concurs si sa va antrenati in acele conditii pentru a avea un mediu familiar cand ajungeti la fata locului.

Alta modalitate de pregatire e participarea la cat mai multe concursuri pe internet. Pentru mine Bursele Agora a insemnat destul de mult si cred ca nu numai pentru mine, poate ne zice si Mugurel ceva aici. De asemenea cand organizam concursul "Algoritmus" impreuna cu Ciprian Cana, am vazut un nume nou prin clasamente, Radu Marin. Facea destul de bine pe problemele care eu cu Cipri ne chinuisem sa fie destul de grele. I-am zis lui Mircea la misto ca va avea un concurent puternic anul ala. Predictia s-a transformat in realitate si Radu a luat medalie de bronz anul respectiv la IOI.

Sumarizez putin elementele importante ce ajuta la obtinerea unor rezultate bune la olimpiade :

  • munca individuala ghidata de pasiune
  • antrenarea modalitatii de codare a algoritmilor
  • gasirea unui grup de prieteni pasionati
  • gasirea unui mentor cu experienta
  • participarea la cat mai multe concursuri online

Cu proiectul infoarena incercam sa va ajutam sa atingeti performanta in informatica cat mai usor. Avem o arhiva cu un numar impresionant de probleme frumoase, o sectiune de articole interesante, o lista de trucuri care ar trebui stiuta pentru concursuri si doua proiecte pe care le gasiti aici si aici care vor mari si mai mult utilitatea siteului.

Va astept cu comentarii! Sunt curios si de stilul vostru de antrenament!

Daca mai vreti si alte sfaturi puteti citi ghidul pentru concursuri al lui Mircea, sau articolul lui Mugurel.

Saptamana trecuta s-a desfasurat la Las Vegas etapa finala a concursului TopCoder Open. Am trecut si eu pe acolo ca sa ma intalnesc cu romanii ce au ajuns la aceasta etapa a concursului.

Ii vedeti in poza alaturata de la stanga la dreapta pe Adrian Carcu care, fiind veteran al acestor concursuri, a fost reviewer la competitia de design, dand note participantilor, pe mine ca musafir neinvitat :), Lazar Lucian , finalist la concursul de design software, Liviu Ciortea , finalist la concursul de algoritmi, romanul cu cel mai mare rating pe topcoder la algoritmica, ratonul_bolnav , concurent la concursul maraton si Vlad Dumitriu , finalist al concursului de design grafic.

Despre Lucian ati mai putut citi in acest post in care ne spunea detalii legate de participarea lui la TopCoder Collegiate Challenge. La acest concurs Luci s-a descurcat "ceva mai bine", obtinand locul doi si un premiu de 10.000$. Felicitari! Sunt mandru de Lucian in mod special pentru ca el a fost colegul de facultate cu care am baut o bere in prima zi de scoala in Cluj.

Vlad participa a doua oara la finala concursului de design grafic si ati mai putut citi despre el in acest post de pe blogul infoarena.

Liviu e la prima participare la un turneu final, dar l-am mai laudat aici ca fiind finalist al concursului ImagineCup organizat de Microsoft.

Ce am mai retinut de la concurs e ca finala de algoritmica a fost foarte disputata si Tomek a castigat-o dupa o pauza de 4 ani. Puteti citi mai multe pe blogul concursului

Si daca tot am avut un titlu ademenitor sa va spun si cateva impresii legate de Orasul Pacatelor. Las Vegasul e impresionant, au reusit americanii astia sa construiasca o metropola in mijlocul unui desert. Totul mi s-a parut putin fals si menit sa iti scoata cat mai multi bani din buzunar. Pe strada sunt o gramada de oameni care incearca sa iti paseze numere de stripteoze, dar pentru ca legea nu ii lasa sa te abordeze direct, ei pocnesc din degete si incearca sa iti dea fluturase cu numere de fete. In interiorul cazinourilor sunt drumuri lungi printre mese de ruleta si automate cu jocuri, pentru a creste cat mai mult sansele de a fi prins in mrejele lor. De asemenea lumina e artificiala si nu sunt geamuri spre exterior, iar ceasuri nu se prea gasesc. Totul pentru a face ca jucatorii sa piarda notiunea timpului. Singurul ceas ce l-am vazut in cazino era in magazinul de ceasuri Swatch :). Anul trecut am fost in vizita si apoi le ziceam la prieteni ca e un oras ce merita sa il vizitezi doar o data, dar se pare ca am trecut peste impresia putin negativa si l-am vizitat si a doua oara.

Puteti vedea cateva poze aici sau aici

Felicitari inca o data finalistilor si poate ne vedem si la anul!

Cu ocazia aniversarii a 10 ani de la existenta Google, ziarul Evenimentul Zilei a scris un articol mai amplu cu acest subiect. Am fost contactat de unul dintre redactorii lor pentru a da un scurt interviu. La fel s-a intamplat si cu Cristi Strat si Mihai Stroe. Chiar daca redactorul nu a reprodus complet intrebarile si raspunsurile, ci doar a luat partile care i s-au parut lui mai interesante, articolul este unul foarte reusit. Asa cum vorbeam cu Radu Grigore, este unul dintre putinele articole de genul asta la care nu imi pun mainile in cap.

De multe ori cei ce scriu in ziare despre IT nu au legatura prea mare cu domeniul si fac confuzii mari.
Un exemplu: in articolul din Adevarul despre siteul infoarena, pe la sfarsitul articolului aparea un paragraf in care se spunea de cativa programatori din Galati care au salarii de 500 de euro. Informatia respectiva nu avea treaba cu tot restul articolului, si nici macar nu era interesanta pentru ca in Bucuresti programatorii decenti se asteapta la salarii in jur de 1000 de euro.

Eu cred ca intrebarile si raspunsurile din interviurile pentru Evenimentul Zilei sunt destul de interesante, mai ales pentru tipul de public pe care il are blogul infoarena. Mihai si Cristi au fost si ei de acord, asa ca le voi publica aici in urmatoarele zile.

Pana atunci puteti citi articolul din Evenimentul Zilei AICI