基本的な代数展開


8

問題

私は、計算における数学についての考え方を変え、代数関数の文字列を取り入れ、それらを使って驚くべきことをする素晴らしい新しいプログラムを手に入れました!唯一の問題は、特定の代数しか解析できないことです。それ以外の場合、宇宙はそれ自体に折りたたまれます。これは悪いことです。幸い、この驚くべき新しいプログラムの入力では、いくつかの基本的な操作だけが必要ですが、それでも拡張する必要があります。

ルール

  • 答えは次の表現を単純化できなければならない

    • 2+2 に減らす必要があります 4
    • (5+x)+6 に減らす必要があります x+11
    • (x+2)^2 に減らす必要があります x^2+4*x+4
    • (x-5)*(3+7*x) に減らす必要があります 7*x^2-32*x-15
    • 5*x+9*x に減らす必要があります 14*x
    • (2*x^2)*x^3 に減らす必要があります 2*x^5
  • 回答は、括弧を完全に削除できる必要があります。これは、すべての配布が行われる必要があることを意味します。

  • Answersは、次のすべての演算子と標準トークンを処理できる必要があります。

    • + (加算機能)
    • - (減算機能)
    • * (乗算機能)
    • ( (グループを示すために使用される左括弧)
    • ) (最後に開始されたグループの終わりを示すために使用される右括弧)
    • x (標準変数)
    • [0-9]+ (リテラル非負数)
  • (expr)自体が式であるため、(expr)^ 2を再帰的に含む表記expr ^ 2を使用して、回答は少なくとも2乗できる必要があります。

  • 解決策は標準的な中置記法でなければならず、RPNはナンセンスではありません!

  • Mathematicaのようなライブラリ関数Simplifyはあなたのためにこれを行いません。

  • ソリューションは、単一の引数を取り、展開されたバージョンを返す関数である必要があります

これはコードゴルフなので、OPから1週間で(キー)ストロークが最も少ない回答が勝利します。

ノート

もちろん、この数学の世界にはスペースはありません!括弧のみ。

因数分解から節約するために除算は必要ありません

操作の標準的な順序が適用されます。

私が尋ねていることのいくつかは2+2=4、他の部分が実際には反対である単純化(たとえば、)であることに気付いてい(x+1)^2ますx^2+2x+1。これは意図的なものです。:)

-25ストロークで、(expr)^ 2の代わりに(expr)^ nを実行できるソリューション

4x+5x== 9xや4(x+1)= など、並置された乗算を評価できる解の場合は-15ストローク4x+4

複数の変数を処理できるソリューションの場合は-5ストローク(変数は1つの小文字のアルファベット文字です)

先頭の0を削除することができソリューション(-5ストローク007だけに7[未今日、債券!] [私はLispのを書いてるよううわあ、今私が感じます])


(x-5)*(3 + 7 * x)は(1 * x + -5)*(7 * x + 3)は7 * x ^ 2 +(3-35)* x +- 15または7 * x ^ 2-32 * x-15
— Jeff Grigg、2014

入力はどのように提供する必要がありますか?コマンドライン引数?標準入力?おそらく指定する必要があります。
— Frxstrem 14

@JeffGriggこれが私がプログラムを必要とする理由です;)Hehe私は実際に7 * xを追加してより複雑さを表示し、ソリューションを更新するのを忘れました。ありがとう!そして、私はそれらが関数への引数として取られるべきであることを含めることを私は誓ったかもしれません
— クリストファー・ワート14

1
私はこれについてJでほぼ解決策を持っています。負の数を正しく解析する必要があるだけです。それはおそらく私が書いた中で最も醜くてハッキリしたものでしょうが、ありがたいことにそれはほぼ終わりです。
— algorithmhark 14

1
@ssdecontrol除算なしで、多項式について話します。部門を追加すると、それは非常に異なります
— edc65

回答:


2

J-350文字-25 = 325ポイント

許してください、ロジャー・ホイ、私は罪を犯しました。

x=:0 1
f=:(('+_';'-';'_';'-')rplc~' '-.~'+'}.@,@|.@,.s(}.@]`(,&":)@.t'*x'"_`('*x^',":)`(''"_)@.t=.*@<:@[)/"1@#~0~:0{|:@s=.,.i.@#)@p=:(0{::'()'+/@,:&,e'+'@((+/@,:&,-)~e'-')@(*/a e'*')@('^'(*/(a=.+//.@)/@#,:e=:2 :'(<@; ::({:u/&.>{.)/.~i.@#-i.@#(>+>:)(<,v){.@i.~])^:_'))@:(([^:(''-:])". ::])&.>)@([-.~;@]<@(p^:(1<#));.1~1,0=2*/\[:+/\(*0,}:@)1 _1 0{~i.)&;:])

上記の怪物は、いくつかの変数を定義します。変数fは、上記の質問の制約を満たす関数です。「expr ^ n」ボーナスを25ポイント請求します。

これがJ REPLでのゴルフの様子です。

   x=:0 1
   f=:(('+_';'-';'_';'-')rplc~' '-.~'+'}.@,@|.@,.s(}.@]`(,&":)@.t'*x'"_`('*x^',":)`(''"_)@.t=.*@<:@[)/"1@#~0~:0{|:@s=.,.i.@#)@p=:(0{::'()'+/@,:&,e'+'@((+/@,:&,-)~e'-')@(*/a e'*')@('^'(*/(a=.+//.@)/@#,:e=:2 :'(<@; ::({:u/&.>{.)/.~i.@#-i.@#(>+>:)(<,v){.@i.~])^:_'))@:(([^:(''-:])". ::])&.>)@([-.~;@]<@(p^:(1<#));.1~1,0=2*/\[:+/\(*0,}:@)1 _1 0{~i.)&;:])

   f '2+2'
4
   f '(5+x)+6'
x+11
   f '(x+2)^2'
x^2+4*x+4
   f '(x-5)*(3+7*x)'
7*x^2-32*x-15
   f '5*x+9*x'
14*x
   f '(2*x^2)*x^3'
2*x^5
   f '(2*x+3)^(2+3)*2^3'   NB. bonus
256*x^8+1920*x^7+5760*x^6+8640*x^5+6480*x^4+1944*x^3

ここで何が起こっているの要点です。

  • '()'...@([-.~;@]<@(p^:(1<#));.1~1,0=2*/\[:+/\(*0,}:@)1 _1 0{~i.)&;:-括弧で囲まれた部分式に基づいて再帰的に式を分解し、...準備ができたらそれらを評価します(以下で説明するビット)。;:トークン化を実行します。
  • (([^:(''-:])". ::])&.>)-原子を評価します。アトムが数値の場合、それはスカラー数に変換されます。アトムが演算子の場合は、そのままになります。アトムが変数の場合はx、ベクトルに変換され0 1ます。(それがx=:0 1、最初に定義する理由です。)通常、多項式a*x^n + b*x^(n-1) + ... + c*x + dはn+1-itemリストとして保存しますd c ... b a。
  • e=:2 :'(<@; ::({:u/&.>{.)/.~i.@#([->+>:){.@i.&(<,v))^:_'-この奇妙な接続詞は、左側に動詞、右側に登場人物をとります。トークン化された括弧なしの入力でその文字の最初のインスタンスを見つけ、その周りの引数を使用して評価し、そのような文字がなくなるまで繰り返します。したがって、式を反復的に単純化し、操作の順序はの適用順序によって制御されますe。
  • そして、前にあるものはすべて、かなり印刷された出力です。rplc部分文字列置換用の標準ライブラリ関数です。を削除することで、最高次数ではなく最低次数の項を最初に配置できる場合は、さらに3文字節約できます@|.。

このゴルフからこれ以上キャラクターを絞れるかどうか、正直不確かです。同じ量のオーバーエンジニアリングを必要としない他のアプローチは考えられませんが、それが存在しないという意味ではありません。いずれにせよ、私はこのバージョンからすべての明らかなキャラクターを絞り込んだと確信しています。


ブラボー!また、-トークンは減算関数としてのみ記述されるため、負の数の修正を取り除くことができます。:)
— クリストファー・ワート2014

@ChristopherWirt聞き取れませんでした。どちらにしても、完了です。
— algorithmhark

(2*x+3)^(2+3)*2^3与える必要があります256x^5+1920x^4+5760x^3+8640x^2+6480x+1944か、それとも何か不足していますか?
— edc65 2014

2

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())
}

一部の場所でのみセミコロンを使用しますか?あなたがそれらを必要とするのはフレームの欠如のためですか?EcmaScriptは私のJSに準拠していません;)
— Christopher Wirt

カンマは式を区切り、セミコロンはステートメントを区切ります。でより明確になりfor(i1,i2,i3; c1,c2; s1,s2,s3)ます。fored(関数O)内のステートメントを閉じるために、ゴルフコールドにセミコロンがあります。なぜカンマ?2つのおしべは{}でグループ化する必要がありますが、2つ以上の式を簡単にリストできます。
— edc65 14

1

Mathematica:56-25-15-5-5 = 6

もちろん、Expandまたはとして機能するライブラリはなくDistribute、単なるパターン置換です。Mathematicaは私たち(hax!)のためにほとんどすべてをします、残っているのは分配と電力拡張のためのルールです。したがって、重要な例は(x-5)*(3+7*x)とだけ(x+2)^2です。

f=#//.{x_ y_Plus:>(x #&/@y),x_Plus^n_:>(x #&/@x)^(n-1)}&

例

(x-5)*(3+7*x) // f
-15 - 32 x + 7 x^2

(x + 2)^2 // f
4 + 4 x + x^2

どちらの例にも、非常に奇妙な特徴があります。片付けてもらえますか?
— edc65 2014

@ edc65 M10はコピー/ペーストで奇妙に振る舞うと思います。
— 2014

私はおそらく、mathematicaをすべて一緒に禁止するべきだったでしょう;)けれども良い仕事です
— クリストファー・ウィート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.