Re: [mens sana] Re: functie in C

1 view
Skip to first unread message

Cosmin Marian

unread,
May 9, 2007, 2:27:52 AM5/9/07
to mens...@googlegroups.com
Doar ca mic comentariu,

functia isequal() nu face ceea ce sugereaza, adica nu e echivalenta cu ==


----- Original Message ----
From: Radu Cornea <em...@radu.net>
To: mens...@googlegroups.com
Sent: Tuesday, May 8, 2007 11:48:37 PM
Subject: [mens sana] Re: functie in C


On 5/8/07, Cosmin Marian <cosm...@yahoo.com> wrote:
>
> O solutie care are la baza o functie de tipul:
>
> f(n)= p daca n == 0 si q daca n > 0
>
>
> typedef unsigned int uint;
> typedef void (*continuare)(uint);
>
> void zero(uint);
> void nonzero(uint);
> void fun(uint);
>
> continuare continuari[] = {
> 0, // ;)
> nonzero,
> zero
> };
>
> void zero(uint n) {
> }
>
> void nonzero(uint n) {
> fun(n-1);
> }
>
> void fun(uint n) {
> continuari[(n+2)/(n+1)](n);
> printf("%d ", n);
> }
>

Foarte bine! La asa ceva ma refeream. Astea erau solutiile mele:

1) Cu operatori booleeni:

#include <stdio.h>
#include <stdlib.h>

void doreturn(int n);
void doprint(int n);

int iszero(int n) {
return !n;
}

void (*funcp[2])(int n) = {doprint, doreturn};

void doreturn(int n) {
return;
}

void doprint(int n) {
funcp[iszero(n)](n-1);
printf("%d ", n);
}

int main (int argc, char **argv) {
doprint(atoi(argv[1]));
printf("\n");
}


2) Fara operatori booleeni:

#include <stdio.h>
#include <stdlib.h>

void doreturn(int i, int n);
void doprint(int i, int n);

int isequal(int i, int n) {
return (i + 1) / (n + 1);
}

void (*funcp[2])(int i, int n) = {doprint, doreturn};

void doreturn(int i, int n) {
return;
}

void doprint(int i, int n) {
printf("%d ", i);
funcp[isequal(i, n)](i + 1, n);
}

int main (int argc, char **argv) {
doprint(0, atoi(argv[1]));
printf("\n");
}

Le-am testat pe amandoua cu gcc sub Linux.

--
Radu


__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com

Radu Cornea

unread,
May 9, 2007, 2:44:35 AM5/9/07
to mens...@googlegroups.com
Adevarat, functioneaza doar pentru 0 < i < n, ceea ce aveam nevoie. Nu
a fost o alegere prea fericita a numelui... :-)

--
Radu

Cosmin Marian

unread,
May 9, 2007, 2:52:30 AM5/9/07
to mens...@googlegroups.com

Operatorul ?: nu poate fi implementat intr-o functie din motive evidente (nu se poate nici macar in C++)

Dar pentru un joc cu operatori se poate face:

int tern(int x, int y, int z) {
static int v[] = {~0, 0};
return (v[!x] & y) | (v[!!x] & z);
}

----- Original Message ----
From: Radu Cornea <em...@radu.net>
To: mens...@googlegroups.com
Sent: Wednesday, May 9, 2007 1:44:01 AM
Subject: [mens sana] Re: functie in C

[...]
Inca o problema asemanatoare:

Implementati operatorul x ? y : z intr-o functie int cond(int x, int
y, int z); folosind doar ~, !, ^, &, +, |, <<, >> fara if , bucle sau
altceva, folosind doar operatorii de mai sus. Functia returneaza fie y
fie z, depinzand de valoarea lui x.

Extra puncte pentru o solutie pe o singura linie, fara a folosi
variabile suplimentare.


--
Radu


____________________________________________________________________________________
We won't tell. Get more on shows you hate to love
(and love to hate): Yahoo! TV's Guilty Pleasures list.
http://tv.yahoo.com/collections/265

Radu Cornea

unread,
May 9, 2007, 3:02:23 AM5/9/07
to mens...@googlegroups.com
On 5/8/07, Cosmin Marian <cosm...@yahoo.com> wrote:
>
>
> Operatorul ?: nu poate fi implementat intr-o functie din motive evidente (nu se poate nici macar in C++)
>
> Dar pentru un joc cu operatori se poate face:
>
> int tern(int x, int y, int z) {
> static int v[] = {~0, 0};
> return (v[!x] & y) | (v[!!x] & z);
> }
>

Functia nu e importanta, poti sa-l implementezi intr-o singura linie.
Ai inceput bine, poti face ceva sa scapi de variabila statica? :-)

--
Radu

Cosmin Marian

unread,
May 9, 2007, 3:07:28 AM5/9/07
to mens...@googlegroups.com
Functia nu e importanta, e important cine si cand se evalueaza ;)

Cosmin

----- Original Message ----
From: Radu Cornea <em...@radu.net>

[...]Functia nu e importanta, poti sa-l implementezi intr-o singura linie.
Ai inceput bine, poti face ceva sa scapi de variabila statica? :-)

--
Radu


____________________________________________________________________________________
Finding fabulous fares is fun.
Let Yahoo! FareChase search your favorite travel sites to find flight and hotel bargains.
http://farechase.yahoo.com/promo-generic-14795097

Radu Cornea

unread,
May 9, 2007, 3:20:37 AM5/9/07
to mens...@googlegroups.com
Sa presupunem ca evaluarile lui x, y si z nu au efecte secundare.

--
Radu

Cosmin Marian

unread,
May 9, 2007, 3:57:40 AM5/9/07
to mens...@googlegroups.com
Dar se termina ?? Sau presupunem ca se termina? Deja cam multe presupuneri pentru a mai fi interesant. Parerea mea

----- Original Message ----
From: Radu Cornea <em...@radu.net>

To: mens...@googlegroups.com
Sent: Wednesday, May 9, 2007 10:20:37 AM
Subject: [mens sana] Re: functie in C

--
Radu


____________________________________________________________________________________
Don't pick lemons.
See all the new 2007 cars at Yahoo! Autos.
http://autos.yahoo.com/new_cars.html

Radu Cornea

unread,
May 9, 2007, 4:20:01 AM5/9/07
to mens...@googlegroups.com
Da, x, y si z sunt variabile normale, nu functii. Nu e o intrebare
capcana, problema e doar cum se simuleaza ?: doar cu operatorii dati.


--
Radu

Rares Vernica

unread,
May 11, 2007, 1:17:16 AM5/11/07
to mens...@googlegroups.com
int tern(int x, int y, int z) {
return ((!x + ~0) & y) | ((!!x + ~0) & z);
}

:D

Radu Cornea

unread,
May 11, 2007, 1:26:52 AM5/11/07
to mens...@googlegroups.com
Buna solutia. Se poate si cu ^ in loc de |, dar cred ca nu are vreo
importanta ca si performanta..

--
Radu


--
Radu

Rares Vernica

unread,
May 11, 2007, 1:35:49 PM5/11/07
to mens...@googlegroups.com
Era cam evident a trebuie sa folosesti "+" pentru ca "-" lipsea din lista. :D

Rares

Reply all
Reply to author
Forward
0 new messages