多項式ラプラス変換

Dec 26 2020

これはこのチャレンジの再投稿であり、より緩いI / Oフォーマットと更新されたルールに合わせて改良することを目的としています

あなたは\で整数多項式を取るプログラムを書くことになっています$t\$入力として、この多項式のラプラス変換を出力します。いくつかの定義とプロパティ:

  • 与えられた関数のラプラス変換\$f(t)\$ です

$$\mathcal{L}\{f(t)\} = F(s) = \int_0^\infty f(t)e^{-st}dt$$

  • \のラプラス変換$f(t) = t^n, \, n = 0, 1, 2, ...\$ です

$$\mathcal{L}\{t^n\} = \frac{n!}{s^{n+1}}$$

  • ラプラス変換は加算で分散します:

$$\mathcal{L}\{f(t)+g(t)\} = \mathcal{L}\{f(t)\} + \mathcal{L}\{g(t)\}$$

  • 関数を掛けた定数のラプラス変換は、変換を掛けた定数に等しくなります。

$$\mathcal{L}\{af(t)\} = a\mathcal{L}\{f(t)\}$$

  • 整数多項式は、各項が整数係数を持ち、負でない次数を持つ多項式です。

実例:

$$\begin{align} \mathcal{L}\{3t^4+2t^2+t-4\} & = \mathcal{L}\{3t^4\}+\mathcal{L}\{2t^2\}+\mathcal{L}\{t\}-\mathcal{L}\{4\} \\ & = 3\mathcal{L}\{t^4\}+2\mathcal{L}\{t^2\}+\mathcal{L}\{t\}-4\mathcal{L}\{1\} \\ & = 3\left(\frac{4!}{s^5}\right)+2\left(\frac{2!}{s^3}\right)+\left(\frac{1!}{s^2}\right)-4\left(\frac{0!}{s}\right) \\ & = \frac{72}{s^5}+\frac{4}{s^3}+\frac{1}{s^2}-\frac{4}{s} \end{align}$$


多項式の標準表現で入力を行うことができます。いくつかの例(\$3x^4+2x^2+x-4\$ 例として)は次のとおりです。

  • 係数のリスト。[-4, 1, 2, 0, 3]または[3, 0, 2, 1, -4]
  • 係数と累乗のペア。[[3, 4], [2, 2], [1, 1], [-4, 0]]とさまざまな異なる注文
  • 好きな変数を使用した文字列。 3x^4+2x^2+x-4

同様に、出力は負の次数の多項式になるため、(\を使用して)などの同様の形式で出力できます。$\mathcal{L}\{3x^4+2x^2+x-4\} = \frac{72}{s^5}+\frac4{s^3}+\frac1{s^2}-\frac4s\$):

  • 係数のリスト。[72, 0, 4, 1, -4]または[-4, 1, 4, 0, 72]
  • 係数と累乗のペア。[[72, -5], [4, -3], [1, -2], [-4, -1]]およびさまざまな異なる順序(またはパワーのポジティブバージョン)
  • 好きな変数を使用した文字列。 72s^-5+4s^-3+s^-2-4s^-1

不明な代替I / O方法がある場合は、以下にコメントして質問してください。

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

回答

7 xnor Dec 26 2020 at 08:42

Haskell、25バイト

zipWith(*)$scanl(*)1[1..]

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

[1,1,2,6,...]非常scanlに簡単です。を使用して階乗のリストを生成しzipWith(*)、入力の各要素に対応する値を乗算します。

32バイト

foldr(\(i,x)r->x:map((i+1)*)r)[]

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

かなり折りたたみベースのソリューション。入力を(exponent, coefficient)ペアとして受け取ります。

6 xash Dec 26 2020 at 06:50

伝達、15バイト

v"*<
0+1"
 1{*}

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

左側の2つの列は"、1、2、3、…を上部にコピーします*。右上の値はラップごとにその値で乗算されるため、(余分な1 = 0!から始めて)1!、2!、3!、…が下にコピーされ*ます。{入力を読み取り、階乗を乗算して出力します}

5 GioD Dec 26 2020 at 12:34

ゼリー、4バイト

J’!×

入力を係数のリストとして受け取ります。

説明

J’!×

J   | Returns an array of elements from 1 to length of input array
 ’  | Subtracts 1 from each
  ! | Factorial each
   ×| Multiply each item in the original array by the created array

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

5 Bubbler Dec 28 2020 at 13:02

APL(Dyalog Unicode)、3バイト

×∘!

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

リベラルなI / Oを極端にします:多項式を取ります\$ 3x^4 + 2x^2+x-4 \$2つの引数として、左の係数と右の累乗を降順で、のようにゼロ項を含めます3 0 2 1 ¯4 f 4 3 2 1 0。多項式を係数のベクトルとして返します。

4 ZaelinGoodman Dec 28 2020 at 22:48

PowerShell、28バイト

係数のリストとして入力

$p++;$args|%{$p*$_;$p*=++$i}

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

3 Razetime Dec 26 2020 at 12:56

APL(Dyalog Unicode)、7バイト

⊢×!∘⍳∘≢

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

使用⎕IO←0(0-インデックス)

係数のリストとして入力します。

3 att Dec 26 2020 at 09:44

Wolfram言語(Mathematica)、10バイト

#2!#&@@@#&

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

ゼロ係数を含む係数/電力ペアのリストを電力でソートして入力し、対応する係数のリストを出力します。


ビルトインはより長いです:23バイト

LaplaceTransform[#,t,]&

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

で多項式を入力し、。で多項式tを出力しますNull

2 Neil Dec 26 2020 at 06:40

網膜、30バイト

L$`.+ $&$:&* +`\d+_ $.(*$(_$%'

オンラインでお試しください!I / Oは、最も低い次数から最も高い次数までの係数の改行区切りリストです。説明:

L$`.+ $&$:&*

係数ごとに、その次数に等しい数の下線を追加します。

+`\d+_
$.(*$(_$%'

アンダースコアがなくなるまで、各係数に後続のアンダースコアの数を掛けて、プロセスで1つ削除します。

2 user Dec 26 2020 at 06:36

スカラ3、52の、48バイト

p=>p.indices.scanLeft(1)(_*_.+(1))zip p map(_*_)

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

整数のリストとして、最低から最高までの入出力。

p.indices0からp.size - 1。までの範囲を与えます。乗算を使用して左にスキャンすると、各インデックスで階乗が得られますが、最初の要素が0であるため、1を追加する必要があります(したがって_.+(1))。次に、すべての階乗が係数で圧縮され、乗算されます。

2 xnor Dec 26 2020 at 08:27

Python 2、39バイト

p=i=1
while 1:print p*input();p*=i;i+=1

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

入力と出力は、最小次数(最も近いゼロ)から始まる、行ごとに1つの係数です。

(coefficient, exponent)ペアで取ると少し長くなります。

p=1
while 1:x,i=input();print p*x;p*=i+1

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

2 Sean Dec 26 2020 at 13:16

楽、15バイト

*Z*1,|[\*] 1..*

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

[\*] 1..*は、で始まる階乗の無限シーケンスです1!。追加の1(for 0!)が前面に貼り付けられ、その後、すべてZ*が唯一の入力シーケンスで乗算()で圧縮されます*

2 Shaggy Dec 26 2020 at 17:00

Japt -m、3バイト

*Vl

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

2 pajonk Dec 26 2020 at 16:59

R、34の 28 25バイト

(x=scan())*gamma(seq(!x))

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

かなり簡単です。
Rには、短い名前の階乗関数がありませんが、がありgammaます。@Giuseppeからのトリックを使用して
シーケンスを生成します。x

2 Arnauld Dec 26 2020 at 06:15

JavaScriptの(ES6)、 31の 29バイト

I / O:最低度から最高度までの係数のリスト。

a=>a.map((v,i)=>v*=p=i?p*i:1)

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

コメント

a =>              // a[] = polynomial coefficients
  a.map((v, i) => // for each coefficient v at position i in a[]:
    v *=          //   multiply v by:
      p =         //     the updated factorial p, which is:
        i ?       //       if i > 0:
          p * i   //         multiplied by i
        :         //       else:
          1       //         initialized to 1
  )               // end of map()
2 Noodle9 Dec 26 2020 at 08:11

SageMath、27の23バイト

ovsのおかげで4バイト節約できました!!!

lambda f:f.laplace(x,x)

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

\の関数を取ります$x\$入力として、\の関数としてラプラス変換を返します$x\$

1 Neil Dec 26 2020 at 23:46

チャコール、12バイト

IEA×ιΠ⊞Oυ∨κ¹

オンラインでお試しください!リンクは、コードの詳細バージョンへのリンクです。I / Oは、最低度から最高度までの係数のリストです。説明:

  A             Input array
 E              Map over elements
    ι           Current element
   ×            Multiplied by
     Π          Product of
        υ       Predefined empty list
      ⊞O        After pushing
         ∨      Logical Or of
          κ     Current index
           ¹    Literal 1
I               Cast to string
                Implicitly print
1 KevinCruijssen Jan 07 2021 at 14:57

05AB1E、4バイト

εN!*

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

または代わりに:

ā<!*

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

どちらも係数のリストを入力として受け取ります。

説明:

ε     # Map over each value of the (implicit) input-list
 N    #  Push the 0-based map-index
  !   #  Pop and take it's faculty
   *  #  Multiply it by the current value
      # (after the map, the resulting list is output implicitly)

ā     # Push a list in the range [1,length] based on the (implicit) input-list
 <    # Decrease each by 1 to make the range [0,length)
  !   # Take the faculty of each
   *  # And multiply it to the values at the same positions in the (implicit) input-list
      # (after which the result is output implicitly)