JavaScript(EcmaScript 6)698(748-50ボーナス)725780 1951
ゴルフすること。しかし、私はそれが機能することを誇りに思っています。
(編集:バグ修正、角括弧とマイナスの問題)
(編集2:さらにゴルフ、出力のバグを修正)
(編集3:もう一度ゴルフ、最後に約束したとき)
コメント
基本的に、関数Xはリテラル多項式を操作する中置計算機です。
各多項式はjsオブジェクトとして保存され、キーは項(x ^ 3y ^ 2)で、値は数値係数です。関数A、M、およびEは、加算、乗算、および指数です。
ゴルフコード
(おそらくもっとゴルフすることはできません...)注:(ehm ...)読みやすさのために追加された改行は数えません
K=x=>Object.keys(x).sort(),
A=(p,q,s,t,c)=>[(c=(s+1)*q[t]+~~p[t])?p[t]=c:delete(p[t])for(t in q)],
M=(p,q,t,c,o,u,f,r,v={})=>([A(v,(r={},[(c=p[f]*q[t])&&(r[o={},(u=f+t)&&(u.match(/[a-z]\^?\d*/ig).map(x=>o[x[0]]=~~o[x[0]]+(~~x.slice(2)||1)),K(o,u=k).map(i=>u+=o[i]>1?i+'^'+o[i]:i)),u]=c)for(f in p)],r),k)for(t in q)],v),
E=(p,n)=>--n?M(p,E(p,n)):p,
O=n=>{for(l=0;h(o=s.pop())>=h(n);)a=w.pop(b=w.pop()),o=='*'?a=M(a,b):o>d?a=E(a,b[k]):A(a,b,o),w.push(a);s.push(o,n)},
X=e=>(l=k='',w=[],s=[d='@'],h=o=>'@)+-*^('.indexOf(o),
(e+')').match(/\D|\d+/g).map(t=>(u=h(t))>5?(l&&O('*'),s.push(d)):u>1?O(t):~u?s.pop(s.pop(O(t)),l=1):(l&&O('*'),l=1,w.push(v={}),t<d?v[k]=t|0:v[t]=1)),
K(p=w.pop()).map(i=>(k+=(c=p[i])>1?s+c+i:c<-1?c+i:(c-1?'-':s)+(i||1),s='+')),k||0)
FireFoxコンソールでテストする
['2+2','(5+x)+6','(x+2)^2','(a+b)(a-b)','(a+b)*(a-b)','(a-b)(a-b)', '(x-5)*(3+7*x)','5*x+9*x','(2*x^2)*x^3','(2*x+3)^(2+3)*2^3']
.map(x => x + ' => ' + X(x)).join('\n')
出力
2+2 => 4
(5+x)+6 => 11+x
(x+2)^2 => 4+4x+x^2
(a+b)(a-b) => a^2-b^2
(a+b)*(a-b) => a^2-b^2
(a-b)(a-b) => a^2-2ab+b^2
(x-5)*(3+7*x) => -15-32x+7x^2
5*x+9*x => 14x
(2*x^2)*x^3 => 2x^5
(2*x+3)^(2+3)*2^3 => 1944+6480x+8640x^2+5760x^3+1920x^4+256x^5
ボーナス
25: 2*x+3)^(2+3)*2^3 => 1944+6480x+8640x^2+5760x^3+1920x^4+256x^5
15: 4x+5x => 9x
5: 007x+05x^(06+2) => 7x+5x^8
5: (a+b)(a-b) => a^2-b^2
Ungolfedコード
Show=(p)=>(
Object.keys(p).sort().map(i=>(c=p[i])-1?c+1?c+i:'-'+i:i).join('+').replace(/\+-/g,'-')
)
AddMonoTo=(poly, term, coeff, c)=>(
(c = coeff + ~~poly[term]) ? poly[term]= c : delete(poly[term])
)
AddPolyTo=(p1, p2, s, t)=>(
[ AddMonoTo(p1, t, (s+1)*p2[t]) for (t in p2)]
)
MulTerm=(t1, t2, o={})=>(
(t1+=t2)&&
(t1.match(/[a-z](\^\d+)?/g).every(x=>o[x[0]]=(~~x.slice(2)||1)+(~~o[x[0]])),
Object.keys(o,t1='').sort().every(i=>t1+=o[i]>1?i+'^'+o[i]:i)),
t1
)
MulMono=(poly, term, coeff, c, r={}, t)=>(
[(c = poly[p]*coeff) && (r[MulTerm(p,term)] = c) for (p in poly) ],r
)
MulPoly=(p1, p2, r={}, p)=>(
[AddPolyTo(r,MulMono(p2, p, p1[p]),'') for (p in p1)],r
)
ExpPoly=(p,n,r=p)=>{
for(;--n;)r=MulPoly(r,p);
return r
}
Expand=ex=>
{
var tokens = ex.match(/\D|\d+/g).push(')')
var t,a,b,v,LastV=0
var vstack=[]
var ostack=['_']
var op={ '+': 3, '-':3, '*':4, '^':6, '(':8, _: 1, ')':2}
var OPush=o=>ostack.push(o)
var OPop=_=>ostack.pop()
var VPush=v=>vstack.push(v)
var VPop=v=>vstack.pop()
var Scan=i=>
{
LastV=0 ;
for (; (t=tokens[i++]) && (t != ')'); )
{
if (t == '(')
{
if (LastV) CalcOp('*')
OPush('_'), i=Scan(i)
}
else if (op[t])
LastV=0, CalcOp(t)
else
{
if (LastV) CalcOp('*')
LastV = 1
VPush(v={})
t < 'a' ? v[''] = t|0 : v[t] = 1
}
}
CalcOp(t);
OPop();
OPop();
LastV=1;
return i;
}
var CalcOp=nop=>
{
for (; op[po = OPop()] >= op[nop];)
b=VPop(), a=VPop(), CalcV(a,b,po);
OPush(po), OPush(nop);
}
var CalcV=(a,b,o)=>
{
if (op[o] < 4)
AddPolyTo(a,b,o)
else if (o == '*')
a=MulPoly(a,b)
else // ^
a=ExpPoly(a,b['']) // only use constant term for exp
VPush(a)
}
Scan(0)
return Show(vstack.pop())
}