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.




