ṣ”+ṣ”xV$€)p/ZPSƭ€j⁾x^Ʋ€j“ +
オンラインでお試しください!
完全なプログラム。2つの多項式を2つの文字列のリストとして受け取ります。
説明(拡張フォーム)
ṣ”+ṣ”xV$€µ€p/ZPSƭ€j⁾x^Ʋ€j“ + ” Arguments: x
µ Monadic chain.
€ Map the monadic link over the argument.
Note that this will "pop" the previous chain, so
it will really act as a link rather than a
sub-chain.
ṣ”+ ṣ, right = '+'.
Split the left argument on each occurrence of
the right.
Note that strings in Jelly are lists of
single-character Python strings.
€ Map the monadic link over the argument.
$ Make a non-niladic monadic chain of at least
two links.
ṣ”x ṣ, right = 'x'.
Split the left argument on each occurrence of
the right.
V Evaluate the argument as a niladic link.
/ Reduce the dyadic link over the argument.
p Cartesian product of left and right arguments.
€ Map the monadic link over the argument.
Ʋ Make a non-niladic monadic chain of at least
four links.
Z Transpose the argument.
€ Map the monadic link over the argument.
ƭ At the first call, call the first link. At the
second call, call the second link. Rinse and
repeat.
P Product: ;1×/$
S Sum: ;0+/$
j⁾x^ j, right = "x^".
Put the right argument between the left one's
elements and concatenate the result.
j“ + ” j, right = " + ".
Put the right argument between the left one's
elements and concatenate the result.
エイリアス
)
はと同じµ€
です。
末尾”
は暗示され、省略できます。
アルゴリズム
この入力があるとしましょう:
["6x^2 + 7x^1 + -2x^0", "1x^2 + -2x^3"]
最初の手順は、2つの多項式のそれぞれに適用される解析です。最初のものを処理しましょう"6x^2 + 7x^1 + -2x^0"
:
最初のステップは、文字列をで分割'+'
して、用語を分離することです。この結果:
["6x^2 ", " 7x^1 ", " -2x^0"]
次のステップでは、各文字列をで分割'x'
して、係数を指数から分離します。結果は次のとおりです。
[["6", "^2 "], [" 7", "^1 "], [" -2", "^0"]]
現在、これらの文字列には多くのゴミがあるように見えますが、そのゴミは実際には重要ではありません。これらの文字列はすべて、niladic Jellyリンクとして評価されます。数字の桁の間ではないため、スペースは重要ではありません。したがって、以下を評価しても同じ結果が得られます。
[["6", "^2"], ["7", "^1"], ["-2", "^0"]]
^
Sはもう少し邪魔に見えるが、彼らは実際にどちらか何もしません!さて、^
ビット単位のXORアトムですが、ニラディックチェーンはモナドリンクのように動作します。ただし、ニラディックの場合、最初のリンクは引数を取る代わりに実際に引数になります。そうでない場合、リンクの引数はになり0
ます。指数は^
最初の文字としてsを持ち、^
niladicではないため、引数はであると想定されます0
。文字列の残りの部分、つまり数値は、の正しい引数です^
。したがって、たとえば、^2
あります0 XOR 2 = 2。明らかに、0 XOR n = n。すべての指数は整数であるため、問題ありません。したがって、上記の代わりにこれを評価しても結果は変わりません。
[["6", "2"], ["7", "1"], ["-2", "0"]]
さあ行こう:
[[6, 2], [7, 1], [-2, 0]]
このステップもに変換さ"-0"
れ0
ます。
両方の入力を解析しているため、解析後の結果は次のようになります。
[[[6, 2], [7, 1], [-2, 0]], [[1, 2], [-2, 3]]]
これで解析が完了しました。次の手順は乗算です。
最初に、これら2つのリストのデカルト積を取得します。
[[[6, 2], [1, 2]], [[6, 2], [-2, 3]], [[7, 1], [1, 2]], [[7, 1], [-2, 3]], [[-2, 0], [1, 2]], [[-2, 0], [-2, 3]]]
多くのペアが作成され、それぞれ左のリストから1つの要素と右から1つの要素が順に配置されます。これは、出力の意図した順序でもあります。この課題では、結果をさらに処理しないように求められているため、乗法的分布を適用するように本当に求められます。
各ペアのペアは、乗算する項を表します。最初の要素は係数で、2番目の要素は指数です。項を乗算するには、係数を乗算し、指数を加算します(a xcb xd= a b xcバツd= a b (xcバツd)= (a b )xc + d)。どうすればいいですか?2番目のペアを処理しましょう[[6, 2], [-2, 3]]
。
最初にペアを転置します。
[[6, -2], [2, 3]]
次に、最初のペアの積と2番目のペアの合計を取得します。
[-12, 5]
コードの関連部分PSƭ€
、は実際には用語のペアごとにカウンターをリセットしませんが、ペアであるため、その必要はありません。
用語のすべてのペアを処理するには、次のものがあります。
[[6, 4], [-12, 5], [7, 3], [-14, 4], [-2, 2], [4, 3]]
ここでは、同様の用語を組み合わせる必要がないため、乗算が行われます。最後の手順はPrettyfyingです。
最初に各ペアを結合し"x^"
ます:
[[6, 'x', '^', 4], [-12, 'x', '^', 5], [7, 'x', '^', 3], [-14, 'x', '^', 4], [-2, 'x', '^', 2], [4, 'x', '^', 3]]
次に、リストに参加します" + "
:
[6, 'x', '^', 4, ' ', '+', ' ', -12, 'x', '^', 5, ' ', '+', ' ', 7, 'x', '^', 3, ' ', '+', ' ', -14, 'x', '^', 4, ' ', '+', ' ', -2, 'x', '^', 2, ' ', '+', ' ', 4, 'x', '^', 3]
リストにまだ数字が残っていることに注意してください。したがって、実際には文字列ではありません。ただし、Jellyには「文字列化」と呼ばれるプロセスがあり、プログラムの実行の最後に実行されて結果を出力します。深さ1のリストの場合、実際には各要素を文字列表現に変換し、文字列を連結するだけなので、目的の出力が得られます。
6x^4 + -12x^5 + 7x^3 + -14x^4 + -2x^2 + 4x^3