Gelee , 28 Bytes
ṣ”+ṣ”xV$€)p/ZPSƭ€j⁾x^Ʋ€j“ +
Probieren Sie es online!
Volles Programm. Nimmt die beiden Polynome als Liste von zwei Zeichenfolgen.
Erklärung (erweiterte Form)
ṣ”+ṣ”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
)ist das gleiche wie µ€.
Ein Trailing ”ist impliziert und kann weggelassen werden.
Algorithmus
Nehmen wir an, wir haben diesen Input:
["6x^2 + 7x^1 + -2x^0", "1x^2 + -2x^3"]
Das erste Verfahren ist das Parsen, das auf jedes der beiden Polynome angewendet wird. Lassen Sie uns den ersten behandeln "6x^2 + 7x^1 + -2x^0":
Der erste Schritt besteht darin, die Zeichenfolge durch zu teilen '+', um die Begriffe zu trennen. Das führt zu:
["6x^2 ", " 7x^1 ", " -2x^0"]
Der nächste Schritt besteht darin, jede Zeichenfolge durch zu teilen 'x', um den Koeffizienten vom Exponenten zu trennen. Das Ergebnis ist folgendes:
[["6", "^2 "], [" 7", "^1 "], [" -2", "^0"]]
Momentan sieht es so aus, als ob in diesen Zeichenfolgen eine Menge Müll ist, aber dieser Müll ist eigentlich unwichtig. Diese Saiten werden alle als Niladic Jelly Links ausgewertet. Trivialerweise sind die Leerzeichen unwichtig, da sie nicht zwischen den Ziffern der Zahlen stehen. Wir könnten also auch das Folgende auswerten und trotzdem das gleiche Ergebnis erzielen:
[["6", "^2"], ["7", "^1"], ["-2", "^0"]]
Das ^ sehen etwas beunruhigender aus, aber sie machen eigentlich auch nichts! Nun, ^ist das bitweise XOR-Atom, jedoch wirken Niladenketten wie monadische Verknüpfungen, mit der Ausnahme, dass die erste Verknüpfung tatsächlich zum Argument wird, anstatt ein Argument zu nehmen, wenn es Niladenketten sind. Ist dies nicht der Fall, hat der Link das Argument 0. Die Exponenten haben das ^s als erstes ^Zeichen und sind nicht niladisch, daher wird das Argument angenommen 0. Der Rest der Zeichenkette, dh die Zahl, ist das richtige Argument von ^. So zum Beispiel ^2ist0 XOR 2 = 2. Offensichtlich,0 XOR n = n. Alle Exponenten sind ganzzahlig, also ist alles in Ordnung. Daher wird das Ergebnis nicht geändert, wenn Sie dies anstelle der oben genannten auswerten:
[["6", "2"], ["7", "1"], ["-2", "0"]]
Auf geht's:
[[6, 2], [7, 1], [-2, 0]]
Dieser Schritt wandelt auch "-0"zu 0.
Da wir beide Eingaben analysieren, lautet das Ergebnis nach dem Parsen wie folgt:
[[[6, 2], [7, 1], [-2, 0]], [[1, 2], [-2, 3]]]
Das Parsing ist jetzt abgeschlossen. Das nächste Verfahren ist die Multiplikation.
Wir nehmen zuerst das kartesische Produkt dieser beiden Listen:
[[[6, 2], [1, 2]], [[6, 2], [-2, 3]], [[7, 1], [1, 2]], [[7, 1], [-2, 3]], [[-2, 0], [1, 2]], [[-2, 0], [-2, 3]]]
Es werden viele Paare gebildet, von denen jedes ein Element aus der linken und eines aus der rechten Liste enthält. Dies ist auch die beabsichtigte Reihenfolge der Ausgabe. Diese Herausforderung fordert uns wirklich auf, multiplikative Verteilungsfähigkeit anzuwenden, da wir gebeten werden, das Ergebnis danach nicht weiter zu verarbeiten.
Die Paare in jedem Paar stellen Terme dar, die wir multiplizieren möchten, wobei das erste Element der Koeffizient und das zweite der Exponent ist. Um die Terme zu multiplizieren, multiplizieren wir die Koeffizienten und addieren die Exponenten (a xcb xd= a b xcxd= a b ( xcxd) = ( a b ) xc + d). Wie machen wir das? Lassen Sie uns das zweite Paar handhaben , [[6, 2], [-2, 3]].
Wir transponieren zuerst das Paar:
[[6, -2], [2, 3]]
Wir nehmen dann das Produkt des ersten Paares und die Summe des zweiten:
[-12, 5]
Der relevante Teil des Codes PSƭ€setzt seinen Zähler nicht für jedes Begriffspaar zurück, muss es aber nicht, da es sich um Paare handelt.
Für alle Begriffspaare haben wir:
[[6, 4], [-12, 5], [7, 3], [-14, 4], [-2, 2], [4, 3]]
Hier wird die Multiplikation durchgeführt, da wir keine ähnlichen Begriffe kombinieren müssen. Das letzte Verfahren ist das Prettyfying.
Wir verbinden jedes Paar zuerst mit "x^":
[[6, 'x', '^', 4], [-12, 'x', '^', 5], [7, 'x', '^', 3], [-14, 'x', '^', 4], [-2, 'x', '^', 2], [4, 'x', '^', 3]]
Dann treten wir der Liste bei mit " + ":
[6, 'x', '^', 4, ' ', '+', ' ', -12, 'x', '^', 5, ' ', '+', ' ', 7, 'x', '^', 3, ' ', '+', ' ', -14, 'x', '^', 4, ' ', '+', ' ', -2, 'x', '^', 2, ' ', '+', ' ', 4, 'x', '^', 3]
Beachten Sie, dass die Liste noch Zahlen enthält, es handelt sich also nicht wirklich um eine Zeichenfolge. Jelly hat jedoch einen Prozess namens "Stringification", der direkt am Ende der Ausführung eines Programms ausgeführt wird, um das Ergebnis auszudrucken. Für eine Liste mit Tiefe 1 konvertiert es wirklich nur jedes Element in seine Zeichenfolgendarstellung und verkettet die Zeichenfolgen miteinander, sodass wir die gewünschte Ausgabe erhalten:
6x^4 + -12x^5 + 7x^3 + -14x^4 + -2x^2 + 4x^3