多項式上の点での変化率を見つける


15

多項式とx座標の方程式が与えられると、曲線上のそのx座標でのポイントの変化率を求めます。

多項式の形式は次のとおりです:ax n + ax n-1 + ... + ax 1 + a、ここでa ϵ Qおよびn ϵW。このチャレンジの場合、n xがない特別なケース(定数)に対処する。

そのx座標での変化率を見つけるには、多項式の導関数を取得し、x座標にプラグインします。

入力

多項式は任意の合理的な形式で使用できますが、その形式が明示的に何であるかを述べる必要があります。たとえば、フォームの配列[..[coefficient, exponent]..]は受け入れ可能です。

出力

指定されたx座標でのポイントの変化率。

これはなので、バイト単位の最短コードが優先されます。

[[4, 3], [-2, 4], [5, 10]]   19    ->   16134384838410
                  [[0, 4]]  400    ->   0
           [[4, 0], [5,1]]  -13    ->   5
      [[4.14, 4], [48, 2]]   -3    ->   -735.12
         [[1, 3], [-5, 0]]    5.4  ->   87.48

8
適切な数学の背景を持っていない人のためのアルゴリズム:A x ^ B + C x ^ D + ... の導関数は(A B)* x ^(B-1)+(C D)* x ^( D-1)+ ...
スパー

私は集合Wに慣れていません。それは自然数の和集合0ですか?
アレックスA.

@AlexA。はい、そうです。
ダニエル


2
@PeterTaylor彼らは同じような考えを共有していると思いますが、そこからの答えが非常に重要な修正なしにここに投稿されることはないと思います。
アレックスA.

回答:


23

Mathematica、6バイト

#'@#2&

(ビートTHATMATLおよび05AB1E)

最初の引数は#、変数として、そして&最後にある多項式でなければなりません(つまり、純粋関数多項式;など3 #^2 + # - 7 &)。2番目の引数は、関心のあるポイントのx座標です。

説明

#'

最初の引数の導関数を使用します(1暗黙的です)。

... @#2&

2番目の引数を差し込みます。

使用法

#'@#2&[4 #^3 - 2 #^4 + 5 #^10 &, 19] (* The first test case *)

16134384838410


3
あなたは今0バイトで勝ちます:-P
ルイスメンドー

@LuisMendoスライスコンテストでシェフのナイフを持った男がマンドリンと結びつけることができる場合、ナイフを使用している男にポイントを渡します。;)
J ...

8

MATL8 6バイト

yq^**s

入力は、指数の配列、数、係数の配列です。

オンラインでお試しください!またはすべてのテストケースを検証:12 345

説明

例えば、入力を考えてみましょう[3 4 10]19[4 -2 5]

y    % Take first two inputs implicitly and duplicate the first
     %   STACK: [3 4 10], 19, [3 4 10]
q    % Subtract 1, element-wise
     %   STACK: [3 4 10], 19, [2 3 9]
^    % Power, element-wise
     %   STACK: [3 4 10], [361 6859 322687697779]
*    % Multiply, element-wise
     %   STACK: [1083 27436 3226876977790]
*    % Take third input implicitly and multiply element-wise
     %   STACK: [4332 -54872 16134384888950]
s    % Sum of array
     %   STACK: 16134384838410

7

ジュリア、45 42 40 37バイト

f(p,x)=sum(i->prod(i)x^abs(i[2]-1),p)

これは、タプルのベクトルと数値を受け入れて数値を返す関数です。絶対値は、指数が負でないことを保証することです。これはDomainError、整数を負の指数に上げるときにJuliaが迷惑をかけるので必要です。

オンラインでお試しください!(すべてのテストケースを含む)

いくつかの修正とバイトをしてくれたGlen Oに感謝します。


3
@AlexAが怖かった。とジュリアは解散しましたが、ここで再び一緒に、調和<3
flawr

i[2]>0&&定数のケースを処理する代わりabs(i[2]-1)に、の指数で使用する場合、余分な3バイトを節約できますx。そして、さらに3バイトを節約するためのわずかにクリーンなトリックは、p%x代わりに使用することですf(p,x)- %(p,x)関数形式で使用するかのように呼び出すことができることに注意してください...残念ながら、TIOでは動作しないようです(明らかにJulia 0.4.6)を実行していますが、私のJulia 0.5.0で動作します。
グレンO

@GlenOナイス、提案ありがとう。私は一緒に行きましたabs...一部が、中置演算子を再定義することは物理的に私に痛み
アレックス・A.

5

05AB1E12 11バイト

Adnanのおかげで1バイト節約されました。

vy¤<²smsP*O

v          For each [coefficient, power] in the input array
 y         Push [coefficient, power]
  ¤<       Compute (power-1)
   ²       Push x value (second input entry)
    sms    Push pow(x, power-1)
       P   Push coefficient * power ( = coefficient of derivative)
        *  Push coefficient * power * pow(x, power-1)
         O Sum everything and implicitly display the result

オンラインでお試しください!

浮動小数点の精度はPythonのものです。現在、スタック値を2回スワップしていますが、それを回避してバイトを節約する方法があるかもしれません。


1
}:) は省略できると思います。
アドナン

DIs<m**O@Luis Mendoが提供したMATLの回答に続く8バイトです。
魔法のタコUr

さらに良いのは、s¹<m**O7バイトです。(05ab1e.tryitonline.net/...
マジックタコ壺

元の形式を保持しながら、入力形式を大幅に変更します。しかし、入力形式を操作することで回答が短くなることに同意します。
2016年

@Osable trueですが、他の人がその抜け穴を使用しています;)
マジックタコ

4

Python 3、41バイト

@AndrasDeakのおかげで6バイトが削除されました!実際、この答えは私のものよりも彼のものです...

@ 1Darco1にも2つの修正をありがとう!

lambda A,x:sum(a*b*x**(b-1) for a,b in A)

係数と指数(チャレンジで説明したのと同じ形式)と数値を含むリストのリストを受け入れる匿名関数。

ここで試してみてください


なぜあなたはa*x**(b-1)代わりに合計することができますa*b*x**(b-1)か?さらに、$ x = 0 $の場合はどうなりますか?
1Darco1

@ 1Darco1あなたは両方とも正しい。間もなく変更します
ルイスメンドー

3

R、31バイト

function(a,n,x)sum(a*n*x^(n-1))

係数aのベクトル、指数のベクトルn、およびx値を取る匿名関数。


1
いいね!同じバイト数の別の回答を追加しました。ただし、まったく異なるアプローチを使用します。Rは驚くべきことではありませんか?
ビリーウォブ

1
編集:もはや同じバイト数ではありません:)
ビリーウォブ

2

Matlab、27バイト

これは、係数のリストの形式で値xと多項式を受け入れる匿名関数です。pたとえば、x^2 + 2として表すことができます[1,0,2]

@(x,p)polyval(polyder(p),x)

2

JavaScript(ES7)、40バイト

(a,n)=>a.reduce((t,c,i)=>t+i*c*n**--i,0)

aゼロで指数昇順の係数の配列が、例えば含まれるX ³-5はで表されることになります[-5, 0, 0, 1]


2

Symbolic Math Toolboxを使用したMATLAB、26バイト

@(p,x)subs(diff(sym(p)),x)

これは、匿名関数を定義します。入力は次のとおりです。

  • p多項式を定義する文字列、形式'4*x^3-2*x^4+5*x^10'
  • x

使用例:

>> f = @(p,x)subs(diff(sym(p)),x)
f = 
    @(p,x)subs(diff(sym(p)),x)

>> f('4*x^3-2*x^4+5*x^10', 19)
ans =
16134384838410

@(x,p)polyval(polyder(p),x)バイトを得るために使用できます。
flawr

まあ@flawr、彼は今、あなただけの答えとしてあることを掲示してはならないので、P
アレックスA.

@flawrありがとう、でもそれはあまりにも違うので、投稿してください!
ルイスメンドー

1
とにかく、あなたはそれをやっていなかったと思う、「あなたはバイトを獲得するだろうから = D
flawr

@flawr Aww。私は完全に誤解しました、ハハ
ルイスメンドー

2

R、31 27バイト

2つの入力pとを使用する名前のない関数xpは多項式のR式であると仮定され(以下の例を参照)、x単に評価のポイントです。

function(p,x)eval(D(p,"x"))

これDは、シンボリック導関数wrtを計算しx、で式を評価するを呼び出すことで機能しxます。

出力例

関数に名前が付けられたと仮定するとf、次の方法で呼び出すことができます。

f(expression(4*x^3-2*x^4+5*x^10),19)
f(expression(0*x^4),400)
f(expression(4*x^0+5*x^1),-13)
f(expression(4.14*x^4+48*x^2),-3)
f(expression(1*x^3-5*x^0),5.4)

それぞれ以下を生成します:

[1] 1.613438e+13
[1] 0
[1] 5
[1] -735.12
[1] 87.48

これを見せてくれてありがとう!入力を式として持つ可能性を考えていませんでした-これは本当にエレガントなソリューションです。
rturnbull


2

C ++ 14、165 138 133 112 110バイト

Generic Variadic Lambdaは大幅に節約します。-2バイト#import前のスペースの削除<

#import<cmath>
#define A auto
A f(A x){return 0;}A f(A x,A a,A b,A...p){return a*b*std::pow(x,b-1)+f(x,p...);}

ゴルフをしていない:

#include <cmath>

auto f(auto x){return 0;}

auto f(auto x,auto a,auto b,auto...p){
    return a*b*std::pow(x,b-1)+f(x,p...);
}

使用法:

int main() {
 std::cout << f(19,4,3,-2,4,5,10) << std::endl;
 std::cout << f(400,0,4) << std::endl;
 std::cout << f(-13,4,0,5,1) << std::endl;
 std::cout << f(-3,4.14,4,48,2) << std::endl;
 std::cout << f(5.4,1,3,-5,0) << std::endl;
}

すべてのバイトカウントを取り消したようです。では、実際のバイト数はいくらですか?
numbermaniac

1
@numbermaniacありがとうございます。
カールナップ

1

Haskell、33バイト

f x=sum.map(\[c,e]->c*e*x**(e-1))

使用法:

> f 5.4 [[1, 3], [-5, 0]]
87.48000000000002

1

dc、31バイト

??sx0[snd1-lxr^**ln+z2<r]srlrxp

使用法:

$ dc -e "??sx0[snd1-lxr^**ln+z2<r]srlrxp"
4.14 4 48 2
_3
-735.12

0

DASH、33バイト

@@sum(->@* ^#1- :1#0 1(sS *)#0)#1

使用法:

(
  (
    @@sum(->@* ^#1- :1#0 1(sS *)#0)#1
  ) [[4;3];[_2;4];[5;10]]
) 19

説明

@@                             #. Curried 2-arg lambda
                               #. 1st arg -> X, 2nd arg -> Y
  sum                          #. Sum the following list:
    (map @                     #. Map over X
                               #. item list -> [A;B]
      * ^ #1 - :1#0 1(sS *)#0  #. This mess is just A*B*Y^(B-1)
    )#1                        #. X

0

Scala、46バイト

s=>i=>s map{case(c,e)=>c*e*math.pow(i,e-1)}sum

使用法:

val f:(Seq[(Double,Double)]=>Double=>Double)=
  s=>i=>s map{case(c,e)=>c*e*math.pow(i,e-1)}sum
print(f(Seq(4.0 → 3, -2.0 → 4, 5.0 → 10))(19))

説明:

s=>                        //define an anonymous function with a parameter s returning
  i=>                        //an anonymous function taking a paramater i and returning
    s map{                   //map each element of s:
      case(c,e)=>              //unpack the tuple and call the values c and e
        c*e*math.pow(i,e-1)    //calculate the value of the first derivate
    }sum                      //take the sum

0

公理31バイト

h(q,y)==eval(D(q,x),x,y)::Float

結果

 -> h(4*x^3-2*x^4+5*x^10, 19)
     161343 84838410.0

 -> h(4.14*x^4+48*x^2, -3)
     - 735.12

0

Python 2、39バイト

lambda p,x:sum(c*e*x**~-e for c,e in p)

lambdaこの関数は2つの入力を受け取り、pそしてxpは、質問で与えられた形式例で与えられた多項式です。x変化率を見つけるx値です。



0

C、78バイト

f(int*Q,int*W,int S,int x){return Q[--S]*W[S]*pow(x,W[S]-1)+(S?f(Q,W,S,x):0);}

0

Clojure、53バイト

#(apply +(for[[c e]%](apply * c e(repeat(dec e)%2))))

多項式はハッシュマップとして表され、キーは係数であり、値は指数です。


0

Casio Basic、16バイト

diff(a,x)|x=b

入力はの多項式でなければなりませんx。コード用に13バイト、入力用に+3バイトa,bパラメーターとして。

aに関して表現を導出するだけxで、で潜水しx=bます


0

Dyalog APL、26 25 23バイト

{a←⍺⋄+/{×/⍵×a*2⌷⍵-1}¨⍵}

多項式を右引数として、値を左引数として取ります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.