ṣ”+ṣ”xV$€)p/ZPSƭ€j⁾x^Ʋ€j“ +
Cobalah online!
Program lengkap. Mengambil dua polinomial sebagai daftar dua string.
Penjelasan (formulir diperluas)
ṣ”+ṣ”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.
Mengasingkan
)
sama dengan µ€
.
A tertinggal”
tersirat dan dapat dihilangkan.
Algoritma
Katakanlah kita memiliki input ini:
["6x^2 + 7x^1 + -2x^0", "1x^2 + -2x^3"]
Prosedur pertama adalah Parsing, diterapkan pada masing-masing dari dua polinomial. Mari kita menangani yang pertama,"6x^2 + 7x^1 + -2x^0"
:
Langkah pertama adalah dengan memisahkan string '+'
, sehingga memisahkan istilah. Ini menghasilkan:
["6x^2 ", " 7x^1 ", " -2x^0"]
Langkah selanjutnya adalah membagi setiap string dengan 'x'
, untuk memisahkan koefisien dari eksponen. Hasilnya adalah ini:
[["6", "^2 "], [" 7", "^1 "], [" -2", "^0"]]
Saat ini, sepertinya ada banyak sampah di string ini, tetapi sampah itu sebenarnya tidak penting. Semua string ini akan dievaluasi sebagai tautan Jelly niladic. Secara sepele, spasi tidak penting, karena mereka tidak berada di antara angka-angka. Jadi kami dapat mengevaluasi di bawah dan masih mendapatkan hasil yang sama:
[["6", "^2"], ["7", "^1"], ["-2", "^0"]]
The ^
s terlihat sedikit lebih mengganggu, tetapi mereka benar-benar tidak melakukan apa-apa baik! Ya, ^
adalah atom XOR bitwise, namun rantai niladik bertindak seperti tautan monadik, kecuali bahwa tautan pertama benar-benar menjadi argumen, alih-alih mengambil argumen, jika itu niladik. Jika tidak, maka tautannya akan memiliki argumen 0
. Eksponen memiliki ^
s sebagai char pertama mereka, dan ^
bukan niladic, jadi argumennya dianggap 0
. Sisa string, yaitu angka, adalah argumen yang benar dari ^
. Jadi, misalnya, ^2
adalah0 XOR 2 = 2. Jelas,0 XOR n = n. Semua eksponen bilangan bulat, jadi kami baik-baik saja. Karenanya, mengevaluasi ini sebagai ganti dari yang di atas tidak akan mengubah hasilnya:
[["6", "2"], ["7", "1"], ["-2", "0"]]
Kita mulai:
[[6, 2], [7, 1], [-2, 0]]
Langkah ini juga akan dikonversi "-0"
menjadi 0
.
Karena kita mengurai kedua input, hasil setelah Parsing akan menjadi ini:
[[[6, 2], [7, 1], [-2, 0]], [[1, 2], [-2, 3]]]
Parsing sudah selesai. Prosedur selanjutnya adalah Perkalian.
Kami pertama-tama mengambil produk Cartesian dari dua daftar ini:
[[[6, 2], [1, 2]], [[6, 2], [-2, 3]], [[7, 1], [1, 2]], [[7, 1], [-2, 3]], [[-2, 0], [1, 2]], [[-2, 0], [-2, 3]]]
Banyak pasangan dibuat, masing-masing dengan satu elemen dari daftar kiri dan satu dari kanan, secara berurutan. Ini juga merupakan urutan output yang diinginkan. Tantangan ini benar-benar meminta kami untuk menerapkan distribusi multiplikatif, karena kami diminta untuk tidak melanjutkan hasilnya setelah itu.
Pasangan dalam setiap pasangan mewakili istilah yang ingin kita gandakan, dengan elemen pertama adalah koefisien dan yang kedua adalah eksponen. Untuk melipatgandakan persyaratan, kami mengalikan koefisien dan menambahkan eksponen bersama-sama (a xcb xd= a b xcxd= a b ( xcxd) = ( A b ) xc + d). Bagaimana kita melakukannya? Mari kita tangani pasangan kedua [[6, 2], [-2, 3]]
,.
Kami pertama-tama mengubah posisi pasangan:
[[6, -2], [2, 3]]
Kami kemudian mengambil produk dari pasangan pertama, dan jumlah dari yang kedua:
[-12, 5]
Bagian kode yang relevan PSƭ€
,, tidak benar-benar mengatur ulang penghitungnya untuk setiap pasangan istilah, tetapi, karena berpasangan, itu tidak perlu.
Menangani semua pasangan istilah, kami memiliki:
[[6, 4], [-12, 5], [7, 3], [-14, 4], [-2, 2], [4, 3]]
Di sini, Penggandaan selesai, karena kita tidak harus menggabungkan istilah yang serupa. Prosedur terakhir adalah Prettyfying.
Kami pertama kali bergabung dengan setiap pasangan dengan "x^"
:
[[6, 'x', '^', 4], [-12, 'x', '^', 5], [7, 'x', '^', 3], [-14, 'x', '^', 4], [-2, 'x', '^', 2], [4, 'x', '^', 3]]
Kemudian kami bergabung dengan daftar dengan " + "
:
[6, 'x', '^', 4, ' ', '+', ' ', -12, 'x', '^', 5, ' ', '+', ' ', 7, 'x', '^', 3, ' ', '+', ' ', -14, 'x', '^', 4, ' ', '+', ' ', -2, 'x', '^', 2, ' ', '+', ' ', 4, 'x', '^', 3]
Perhatikan bagaimana kita masih memiliki angka dalam daftar, jadi itu bukan string. Namun, Jelly memiliki proses yang disebut "pengetatan", berjalan tepat di akhir pelaksanaan program untuk mencetak hasilnya. Untuk daftar kedalaman 1, itu benar-benar hanya mengkonversi setiap elemen ke representasi string dan menyatukan string, jadi kami mendapatkan hasil yang diinginkan:
6x^4 + -12x^5 + 7x^3 + -14x^4 + -2x^2 + 4x^3