•Cosmin
|
 |
« : Mai 31, 2012, 05:46:23 » |
|
|
|
|
Memorat
|
|
|
|
•freak93
|
 |
« Răspunde #1 : Mai 31, 2012, 08:36:19 » |
|
Very very ugly: int e(char * &s,int l=0,int v=0){if(l==2){if(*s=='('){++s;int r=e(s);++s;return r;}else if(*s>='0'&&*s<='9'){int r=v*10+(*s)-'0';return e(++s,2,r);}else return v;}else if(l==1){int r=e(s,2);while(1){if(*s=='*')r*=e(++s,2);else if(*s=='/')r/=e(++s,2);else return r;}}else{int v=e(s,1);while(1){if(*s=='+')v+=e(++s,1);else if(*s=='-')v-=e(++s,1);else return v;}}}
|
|
|
Memorat
|
|
|
|
•Cosmin
|
 |
« Răspunde #2 : Mai 31, 2012, 08:56:09 » |
|
Ar fi util sa scrii si varianta de la care ai pornit.
|
|
|
Memorat
|
|
|
|
•freak93
|
 |
« Răspunde #3 : Mai 31, 2012, 11:32:16 » |
|
Am scris-o direct. Dar am avut in cap varianta de la arhiva educationala cu recursivitate directa(se poate gasi usor). Se pot folosi si alte functii? Asta e varianta cu o singura functie 
|
|
|
Memorat
|
|
|
|
•SpiderMan
|
 |
« Răspunde #4 : Mai 31, 2012, 16:03:36 » |
|
Am facut eu una mai scurta, a mea are 300 vs 361 a lui Adi, ideea e cam la fel, e tot din arhiva educationala. int f(int L,char*&p){int x,c,d;if(L==2)if(*p=='(')++p,x=f(0,p),++p;else for(x=0;isdigit(*p);)x=x*10+*p++-'0';else for(x=f(L+1,p);;){char X=*p;if(L)d=X=='*'?1:X=='/'?2:0,c=3;else c=X=='+'?1:X=='-'?2:0,d=3;if(!c||!d)break;int a=f(L+1,++p);if(c==1)x+=a;if(c==2)x-=a;if(d==1)x*=a;if(d==2)x/=a;}return x;}
|
|
« Ultima modificare: Mai 31, 2012, 16:12:55 de către Simoiu Robert »
|
Memorat
|
|
|
|
•danalex97
|
 |
« Răspunde #5 : Mai 31, 2012, 19:21:53 » |
|
int e();int f(){int n,R,S,o,T;o=T=R=S=1;while(T){S=1;n=0;if(s[x]=='-')S=-S,++x;else if(s[x]=='+')++x;if(s[x]=='(')x++,n=e();else for(;'0'<=s[x]&&s[x]<='9';n=n*10+s[x++]-48);if(o)R*=S*n;else if(n)R/=n;else R=0;if(s[x]=='/')o=0,x++;else if(s[x]=='*')o=1,x++;else T=0;}return R;}int e(){int S=0;while(s[x]!=')')S+=f();++x;return S;} Solutia mea e fara pointeri , insa are 329 de caractere. Totusi eu pornesc de la o recursivitete cu 2 functii. ( http://infoarena.ro/job_detail/754129?action=view-source ) Lungimea nu e redusa la maxim , am 2 while-uri si cu o astfel de solutie cred ca se poate ajunge la 315-320 de caractere.
|
|
« Ultima modificare: Mai 31, 2012, 19:29:12 de către Dan Alexandru »
|
Memorat
|
|
|
|
•Cosmin
|
 |
« Răspunde #6 : Mai 31, 2012, 21:36:36 » |
|
E ok sa scrieti si pe mai multe linii. Putem ignora spatii si \n cand comparam solutii.
|
|
|
Memorat
|
|
|
|
•toni2007
|
 |
« Răspunde #7 : Iunie 01, 2012, 05:54:00 » |
|
Javascript: function a(b){return eval(b);};
|
|
|
Memorat
|
|
|
|
•pauldb
|
 |
« Răspunde #8 : Iunie 01, 2012, 06:16:38 » |
|
Like a sir!
|
|
|
Memorat
|
Am zis 
|
|
|
•Cosmin
|
 |
« Răspunde #9 : Iunie 01, 2012, 06:49:59 » |
|
Python are si el eval. Va dau o varianta pe care vreau sa o scurtez: def find_zero_level_op(expr, ops): level = 0 for i in reversed(xrange(0, len(expr))): if expr[i] == '(': level += 1 if expr[i] == ')': level -= 1 if level == 0 and expr[i] in ops: return i def eval(expr): if len(expr) >= 2 and expr[0] == '(' and expr[-1] == ')': return eval(expr[1:-1]) index = find_zero_level_op(expr, ['+', '-']) if index < 0: index = find_zero_level_op(expr, ['*', '/']) if index >= 0: e1 = eval(expr[0:index]) e2 = eval(expr[index + 1:]) if expr[index] == '+': return e1 + e2 elif expr[index] == '-': return e1 - e2 elif expr[index] == '*': return e1 * e2 else: return e1 / e2 return int(expr)
|
|
|
Memorat
|
|
|
|
|