Subapreciatul loc doi

Posted in Premiul n00bel, Regula 0 on May 12th, 2011 by Mihnea

Desi francezii s-au straduit in repetate rinduri (Agincourt, Maginot etc.) sa ne invete ca important e sa participi, nu sa cistigi, lumea sluta in care traim tine minte doar invingatorii si-i trece in uitare pe ocupantii locului doi. N-as vrea ca site-ul nostru sa fie partas la acest trend dezonorant. In Campionatul National de Tirnacop Viteza a existat si o medalie de argint si e de datoria noastra sa recunoastem si sa laudam efortul celorlalti participanti.

Sa fie clar: nimeni nu poate concura cu Silviu Ardelean. Finetea cu care roteste el tirnacopul din poignet nu are egal. Singurul om ce-l pune uneori in dificultate este viorel2005, dar doar in probele libere, caci stilul dadaistico-involuntar nu este apreciat de jurii in probele impuse, ca cele de azi. Totusi, in umbra (si in urma) marelui miner trudesc alti citiva codexperti si este nedrept sa le ignoram zbuciumul.

Dupa cum spunea colegu’ in articolul anterior, Silviu a ratat startul in cursa de 100 de metri Google. A recuperat pe parcurs, dar Marius Bancila a avut o prestatie buna, ce i-a asigurat medalia de argint:

Vad ca azi e ziua intrebarilor de interviu. Din ce am citit, se pare ca cea mai buna metoda e Hammering weight (sau popcount).

Link-ul dat de seful clasei duce la articolul din wikipedia despre Hamming weight. Hamming, hammer, tirnacop… in viltoarea competitiei e usor sa faci confuzii. E la fel de usor de inteles ca atunci cind te grabesti sa bagi in somaj butonul “I’m feeling lucky”, n-ai timp sa si citesti ce scrie in link-urile pe care le repeti. La Marius, Hamming weight, adica numarul de biti setati dintr-un sir binar, este cea mai buna metoda de a numara bitii setati dintr-un sir binar. Acest rationament este confirmat peste tot in lumea inconjuratoare. De exemplu, adunarea este cea mai buna metoda de a aduna numere.

Felicitari Marius!

Tags: , , , , , , , , , , , , , , , ,

Campionatul national de tirnacop viteza

Posted in Codare cu premeditare, Premiul n00bel on May 11th, 2011 by jos8cal

Azi in Codexpertia a avut loc Campionatul National de Tirnacop Viteza. Bineinteles nu a lipsit de la eveniment multiplul medaliat la sol, Silviu Ardelean HD nominalizat acum la sectiunea “Eu propun”.

Cum nu de mult timp a devenit somer in JAVA, el a tinut sa explice motivele pentru care tirnacopul l-a ales pe el si nu invers. Medaliat la sectiunea Un Certain Retard pentru inovatia adusa metodei aflarii numarului de bytes dintr-un fisier, premiat la sectiunea Facepalm D’or cu simularea functiei atoi() in timp patrat, Silviu a deschis prelegerea cu problema numararii bitilor 1 dintr-un numar.

Cu Silviu in mina, tirnacopul s-a pus pe treaba. Dupa o lovitura bine aplicata lui Google s-a si intrezarit raspunsul la problema minerului in link-ul 2 (ca primul link l-a luat Marius Bancila care a si apucat sa ia cuvintul inaintea lui la dezbatere, futu-i). Asa ca a copiat repede codul prin metoda clasica a schimbarii numelor de variabile si si-a deschis prelegerea cu clasicul “Eu plagiezEu propun

Eu propun o varianta mai clasica.

int counter(int nr)
{
   int i = 0;  

   while (0 != nr)
   {
    i += (nr & 1);
    nr >>= 1;
   }  

  return i;
}

Desi este o metoda clasica, ea nu e functionala si tinem sa precizam ca operatorul >> a fost inventat intr-o perioada neo-nazista, de unde probabil si tenta mai nationalista de a opera cu numere pozitive.

Ceva amuzant s-a intimplat in pauza prelegerii. Cineva a pus o intrebare care l-a facut pe Silviu sa priveasca in jur, pentru a gasi pe cineva pe care sa-l aprobe. Intrebarea a fost asta:

Intrebarea este cum apelez functia sum fara sa modific clasa A.

class A
{
   private:
      A(){};
      ~A(){};

   public:
      int sum(int a, int b){return a + b;}
};

Primul care s-a aventurat a propus un:

#define private public

moment in care Silviu a simtit cum se scutura de certitudinile vietii. Nedorind sa creada ca aceste doua cuvinte, public si privat, nu sint de fapt magico-atomice asa cum a invatat el la Hidrocentrala pe vremea cind era pasionat de apa si peste, el a pus compilatorul capra si i-a virit acest #define pe git, sa vada daca si inghite, nu doar provoaca.

Ca dupa orice finalizare, oboseala incepe sa-si spuna cuvintul si uitind ca a lasat in cod acel #define, el ne propune rezolvarea:

O varianta mai curata dar nu imaculata:

class B : public A
{
public:
   B() {}
   ~B() {}

   int sumX(int a1, int b1) {
      return sum(a1,b1);
      }
};

int main()
{
   B z;
   z.sumX(2,3);
}

Deci daca vrei sa apelezi o metoda dintr-o clasa care nu poate fi instantiata, poti “propune” compilatorului sa-i dai o clasa derivata care sa apeleze metoda clasei de baza. Poate cineva de acolo din cartile pe care le citeste Silviu ne poate ajuta cu un

#pragma eupropun

in fata manevrelor de acest gen.

Mai mult decit atit, Silviu a declarat oficial ca a fost pacalit cind a propus rezolvarea sa, deoarece Zlatomir s-a grabit sa raspunda primul si a introdus subversiv in discutie acel #define private public obligindu-l efectiv sa-l aduca cu copy/paste in codul sau. Daca nu exista acest Butterfly Effect, codul lui Silviu era bun. De fapt stai, nu codul initial linie cu linie, ci codul pe care Silviu nu l-a scris dar l-a Gindit si din pacate un mirsav i-a ghicit gindul si i-a sugerat la noi pe site EXACT la ce s-a gindit el initial, dar nu a scris. Intelegeti voi.

PS. Multumim corespondentului Felics aflat in Codexpertia pe durata CNTV.

Tags: , , , , , , , , , , , ,