Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Code Golf: Evaluare de expresie aritmetica  (Citit de 3080 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
Cosmin
Echipa infoarena
Nu mai tace
*****

Karma: 351
Deconectat Deconectat

Mesaje: 1.799



Vezi Profilul
« : Mai 31, 2012, 05:46:23 »

http://infoarena.ro/blog/evaluare
Memorat
freak93
Echipa infoarena
Nu mai tace
*****

Karma: 342
Deconectat Deconectat

Mesaje: 819



Vezi Profilul
« Răspunde #1 : Mai 31, 2012, 08:36:19 »

Very very ugly:
Cod:
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
Echipa infoarena
Nu mai tace
*****

Karma: 351
Deconectat Deconectat

Mesaje: 1.799



Vezi Profilul
« Răspunde #2 : Mai 31, 2012, 08:56:09 »

Ar fi util sa scrii si varianta de la care ai pornit.
Memorat
freak93
Echipa infoarena
Nu mai tace
*****

Karma: 342
Deconectat Deconectat

Mesaje: 819



Vezi Profilul
« 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 Smile
Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« 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.
Cod:
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
Vorbaret
****

Karma: 54
Deconectat Deconectat

Mesaje: 192



Vezi Profilul
« Răspunde #5 : Mai 31, 2012, 19:21:53 »

Cod:
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
Echipa infoarena
Nu mai tace
*****

Karma: 351
Deconectat Deconectat

Mesaje: 1.799



Vezi Profilul
« 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
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #7 : Iunie 01, 2012, 05:54:00 »

Javascript:

Cod:
function a(b){return eval(b);};
Memorat
pauldb
Nu mai tace
*****

Karma: 821
Deconectat Deconectat

Mesaje: 1.901



Vezi Profilul
« Răspunde #8 : Iunie 01, 2012, 06:16:38 »

Like a sir!
Memorat

Am zis Mr. Green
Cosmin
Echipa infoarena
Nu mai tace
*****

Karma: 351
Deconectat Deconectat

Mesaje: 1.799



Vezi Profilul
« Răspunde #9 : Iunie 01, 2012, 06:49:59 »

Python are si el eval.

Va dau o varianta pe care vreau sa o scurtez:
Cod:
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
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines