ṣ”+ṣ”xV$€)p/ZPSƭ€j⁾x^Ʋ€j“ +
ลองออนไลน์!
โปรแกรมเต็มรูปแบบ ใช้ชื่อพหุนามทั้งสองเป็นรายการของสองสาย
คำอธิบาย (แบบฟอร์มขยาย)
ṣ”+ṣ”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.
aliasing
)
µ€
เป็นเช่นเดียวกับ
ต่อท้าย”
เป็นนัยและสามารถละเว้นได้
ขั้นตอนวิธี
สมมติว่าเรามีข้อมูลนี้:
["6x^2 + 7x^1 + -2x^0", "1x^2 + -2x^3"]
ขั้นตอนแรกคือการแยกวิเคราะห์ใช้กับชื่อพหุนามสองแบบ มาจัดการกับอันแรกกัน"6x^2 + 7x^1 + -2x^0"
:
ขั้นตอนแรกคือการแยกสตริงโดย'+'
เพื่อแยกคำ ผลลัพธ์นี้ใน:
["6x^2 ", " 7x^1 ", " -2x^0"]
ขั้นตอนต่อไปคือการแยกแต่ละสตริงด้วย'x'
เพื่อแยกสัมประสิทธิ์จากเลขชี้กำลัง ผลลัพธ์คือ:
[["6", "^2 "], [" 7", "^1 "], [" -2", "^0"]]
ขณะนี้ดูเหมือนว่ามีถังขยะจำนวนมากในสตริงเหล่านี้ แต่ถังขยะนั้นไม่สำคัญจริง ๆ สตริงเหล่านี้ทั้งหมดจะได้รับการประเมินเป็นลิงก์วุ้น niladic สิ่งสำคัญที่สุดคือช่องว่างไม่สำคัญเนื่องจากไม่ได้อยู่ระหว่างตัวเลขของตัวเลข ดังนั้นเราสามารถประเมินด้านล่างและยังได้รับผลลัพธ์เดียวกัน:
[["6", "^2"], ["7", "^1"], ["-2", "^0"]]
^
มาดูอีกเล็กน้อยรบกวน แต่พวกเขาเป็นจริงไม่ได้ทำอะไรอย่างใดอย่างหนึ่ง! ดี^
เป็นอะตอมบิต XOR แต่โซ่ niladic กระทำเช่นการเชื่อมโยงเอกยกเว้นว่าลิงค์แรกจริงจะกลายเป็นข้อโต้แย้งแทนการโต้แย้งถ้ามัน niladic 0
ถ้ามันไม่ได้แล้วการเชื่อมโยงจะมีการโต้แย้งของ เลขยกกำลังที่มี^
ฐานะถ่านครั้งแรกของพวกเขาและ^
ไม่ได้เป็น 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]]]
การแยกวิเคราะห์เสร็จสมบูรณ์แล้ว ขั้นตอนต่อไปคือการคูณ
ก่อนอื่นเราจะนำผลิตภัณฑ์คาร์ทีเซียนของทั้งสองรายการ:
[[[6, 2], [1, 2]], [[6, 2], [-2, 3]], [[7, 1], [1, 2]], [[7, 1], [-2, 3]], [[-2, 0], [1, 2]], [[-2, 0], [-2, 3]]]
มีการสร้างหลายคู่โดยแต่ละองค์ประกอบมีหนึ่งรายการจากรายการด้านซ้ายและอีกหนึ่งรายการจากด้านขวาตามลำดับ สิ่งนี้จะเกิดขึ้นตามลำดับของผลลัพธ์ด้วย ความท้าทายนี้ขอให้เราใช้การกระจายแบบทวีคูณตามที่เราขอไม่ให้ประมวลผลต่อไปหลังจากนั้น
คู่ในแต่ละคู่หมายถึงคำที่เราต้องการคูณด้วยองค์ประกอบแรกคือสัมประสิทธิ์และอันดับที่สองเป็นเลขชี้กำลัง ในการคูณเงื่อนไขเราคูณสัมประสิทธิ์และเพิ่มเลขชี้กำลังด้วยกัน (a xคขxd= a b xคxd= a b ( xคxd) = ( a b ) xc + d) เราจะทำอย่างนั้นได้อย่างไร? Let 's [[6, 2], [-2, 3]]
จับคู่ที่สอง
เราทำการแปลงทั้งคู่เป็นครั้งแรก:
[[6, -2], [2, 3]]
จากนั้นเราก็นำผลคูณของคู่แรกและผลรวมของคู่ที่สอง:
[-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]
สังเกตว่าเรายังมีตัวเลขอยู่ในรายการดังนั้นมันไม่ใช่สตริง อย่างไรก็ตามเจลลี่มีกระบวนการที่เรียกว่า "การทำให้เป็นสตริง" ซึ่งวิ่งไปเมื่อสิ้นสุดการทำงานของโปรแกรมเพื่อพิมพ์ผลลัพธ์ สำหรับรายการความลึก 1 มันแค่แปลงแต่ละองค์ประกอบเป็นการแทนค่าสตริงและเชื่อมสตริงเข้าด้วยกันดังนั้นเราจะได้ผลลัพธ์ที่ต้องการ:
6x^4 + -12x^5 + 7x^3 + -14x^4 + -2x^2 + 4x^3