前書き
変数に関する多項式(多変量の場合もある)の偏微分を計算するプログラムを記述します。
チャレンジ
デリバティブは、物理学、化学、生物学、経済学、心理学など、あらゆる種類の問題を処理するために広く適用されている非常に重要な数学的ツールです。複数の変数を持つ式も非常に一般的です。
この課題の範囲では、多項式文字列(「polystr」)は次のBNF(バッカスナウア形式)によって定義されます。
<polystr> ::= <term> | <term><plusminus><polystr>
<plusminus> ::= "+" | "-"
<term> ::= <coeff> | <coeff><baseterm> | <baseterm>
<baseterm> ::= <variable> | <variable><exponent> | <baseterm><baseterm>
<coeff> ::= positive_integer
<exponent> ::= positive_integer
<variable> ::= lowercase_ASCII_letters
どこにpositive_integer
、lowercase_ASCII_letters
非常に自明です。
たとえば、文字列3x2y-x3y-x2y+5
はを意味し3*(x^2)*y-(x^3)*y-(x^2)*y+5
ます。入力で指定された用語は任意の順序で表示され、各用語の変数も任意の順序で表示されます。したがって、たとえば、これ5-yx2-x3y+y3x2
も有効な入力であり、実際には前の例と同じです。
偏微分を取るためのルールは、期間ごとに行うことです。変数が出現し、用語に出現しない場合、導関数はゼロです。それ以外の場合は、項の係数にその変数の指数が乗算され、変数の指数が1つ減少します。他の変数の指数は変化しません。これはちょうど数学の定義に従っています。さらに、結果の指数がゼロの場合は、項から変数を削除します。
たとえば5z-z2y2-5w3y
、に関するの偏微分を取得する場合y
。次のプロセスが実行されます(上記で定義されたBNFに従って、「係数」はすべて正の数であると見なされます。つまり、符号は個別に考慮されます)。
5z - z2y2 - 5w3y
Coeff 1->1*2=2 5->5*1=5
Expon 2->2-1=1 1->1-1=0
Term - 2yz2 - 5w3
(y is not here (expon 0->y removed)
so the term is 0)
結果は-2yz2-5w3y
です。
一方、上記の式をに関して偏微分したa
場合、結果はの項にない0
ためa
です。
あなたの仕事は、この導関数を計算するための関数または完全なプログラムを書くことです。これは、多項式文字列と単一の文字(微分に関して取る変数)を取り、微分を最も単純な形式で返す必要があります。
「最も単純な形式」とは、3つのことを意味します。
0
(数字ではなく)番号は、出力自体がでない限り、出力に表示されません0
。したがって、0+10y
もも3-y0z
有効な出力ではなく、それぞれ10y
と3-z
に変換する必要があります。数値
1
は、指数や係数として表示されるべきではありませんが、単独の項として表示されます。変数と指数のセットがまったく同じ用語はマージ
3a2b5-4b5a2
する必要があり-a2b5
ます。つまり、これは有効な出力ではなく、代わりにマージする必要があります。入力と出力の詳細については、「仕様」セクションをご覧ください。
テストケース
Input
Output
2xy+4ax-5+7mx4-4-7x4m, x
2y+4a
4upv+5u2v3w4-4w4u2v3+qr-v,v
4up+3u2v2w4-1
12ux-7x2m3+ab5,q
0
-a+10ca11y-1nv3rt3d-poly, a
-1+110ca10y
1y+1x3y, y
1+x3
スペック
- 入力は、標準フォームを介して取得できます。つまり、文字列、文字のリスト、係数のネストされた配列、変数(ASCII値から「a」を引いたものなどで示される場合があります)、および指数などの入力を取ることができます。また、自由に変更することもできます。の
2*x^3y^2
代わりに、またはに似た文字列2x3y2
。
ただし、の入力[2,0,0,0,1,0,0,3,0,0,...0]
(27要素の配列)2dg
や、このような26文字を列挙するその他の詳細形式は使用しないでください。あなたの入力フォーマットはまた、治療することができなければならないab
とba
(27素子アレイフォーマットは、この制限に起因も無効になるように)異なる入力として。
各変数(文字)は、入力の各項に1回だけ表示されます。つまり、
xx
表示されx2
ず、常にとして表示されることもありませんa3b4a2
。繰り返しになりますが、入力内の用語は任意の順序で現れることがあります。
また、上記の冗長形式を避ければ、出力形式を自由に選択できます。ただし、出力は常に上記で定義した最も単純な形式である必要があります。入力と同様に、出力の項は任意の順序で表示でき、各項の変数も任意の順序で表示でき、用語間で一貫している必要はありません。つまり
pu+2up2
、有効な出力です。先行用語の符号は正または負のいずれかで-y+3x
あり3x-y
、両方とも有効です+3x-y
。そうです。入力は常に、出力のすべての係数と指数が2 32 -1か、言語が処理できる最大の整数のいずれか小さい方になるように指定されます。言語が処理できる最大の整数は不当に小さく、挑戦を簡単にすることはデフォルトの抜け穴の範疇に入ります。
これはcode-golfであり、最小のバイト数が優先されます。
いつものように、デフォルトの抜け穴がここに適用されます。
編集:これまでの答えのほとんどは、全体の挑戦を行う内部であることが判明しているため、組み込みが存在することを知っていても、そのような内部を最初から禁止するつもりはありませんし、現在もそうではありません。受賞基準は言語ごとに基づいたものにします。つまり、各言語でバイト数が最も少ない送信がその言語で勝ちます。十分な提出がある場合は、カタログの標準スニペットを追加します。あなたの言語の力を紹介するためにビルトインを提出することを遠慮なく行ってください。しかし、それがはるかに長く、あなたの言語にビルトインがない場合でも、あなたの非組み込みの回答を提出することを躊躇しないでください。あなたの好きな言語でハッピーコードゴルフ!
-9
出力に表示されるのですか?
take derivative
とmerge
no exponent 1
あなたはこれを述べていないように見えますが、私は最も単純な形もを意味すると思います