Ihre Aufgabe ist es, zwei einfachvariable ganzzahlige Polynomausdrücke zu nehmen und sie mit ihrer nicht vereinfachten Haupterweiterung von links nach rechts (AKA FOIL im Fall von Binomen) zu multiplizieren . Kombinieren Sie keine ähnlichen Begriffe und ordnen Sie das Ergebnis nicht neu an. Um die Erweiterung genauer zu beschreiben, multiplizieren Sie den ersten Term im ersten Ausdruck nacheinander mit jedem Term im zweiten und fahren Sie mit dem ersten Ausdruck fort, bis alle Terms mit allen anderen Terms multipliziert wurden. Ausdrücke werden in einer vereinfachten LaTeX-Variante angegeben.
Jeder Ausdruck ist eine Folge von Begriffen, die durch +
(mit genau einem Leerzeichen auf jeder Seite) getrennt sind. Jeder Ausdruck entspricht dem folgenden regulären Ausdruck: (PCRE-Notation)
-?\d+x\^\d+
Im Klartext ist der Begriff ein optionales Anführungszeichen, -
gefolgt von einer oder mehreren Ziffern, gefolgt von x
einer nichtnegativen ganzzahligen Potenz (mit ^
).
Ein Beispiel für einen vollständigen Ausdruck:
6x^3 + 1337x^2 + -4x^1 + 2x^0
Bei Anschluss an LaTeX erhalten Sie
Die Ausgabe sollte ebenfalls diesem Format entsprechen.
Da Exponenten in diesem Format nicht in Klammern eingeschlossen sind, gibt LaTeX mehrstellige Exponenten falsch wieder. (z. B. 4x^3 + -2x^14 + 54x^28 + -4x^5
Rendert als ) Sie müssen dies nicht berücksichtigen und sollten die Klammern nicht in Ihre Ausgabe aufnehmen.
Beispiel Testfälle
5x^4
3x^23
15x^27
6x^2 + 7x^1 + -2x^0
1x^2 + -2x^3
6x^4 + -12x^5 + 7x^3 + -14x^4 + -2x^2 + 4x^3
3x^1 + 5x^2 + 2x^4 + 3x^0
3x^0
9x^1 + 15x^2 + 6x^4 + 9x^0
4x^3 + -2x^14 + 54x^28 + -4x^5
-0x^7
0x^10 + 0x^21 + 0x^35 + 0x^12
4x^3 + -2x^4 + 0x^255 + -4x^5
-3x^4 + 2x^2
-12x^7 + 8x^5 + 6x^8 + -4x^6 + 0x^259 + 0x^257 + 12x^9 + -8x^7
Regeln und Annahmen
- Sie können davon ausgehen, dass alle Eingaben genau diesem Format entsprechen. Das Verhalten für jedes andere Format ist für die Zwecke dieser Herausforderung nicht definiert.
- Es ist zu beachten, dass jede Methode zur Aufnahme der beiden Polynome gültig ist, vorausgesetzt, beide werden als Zeichenfolgen eingelesen, die dem obigen Format entsprechen.
- Die Reihenfolge der Polynome ist aufgrund der erwarteten Reihenfolge der Produkterweiterung von Bedeutung.
- Sie müssen Eingabekoeffizienten zwischen und und Eingabeexponenten bis zu .
- Ausgangskoeffizienten zwischen und und Exponenten bis müssen daher unterstützt werden.
- Sie können davon ausgehen, dass jedes Eingabepolynom nicht mehr als 16 Terme enthält
- Daher müssen Sie (mindestens) bis zu 256 Terme in der Ausgabe unterstützen
- Terme mit Koeffizienten Null sollten so belassen werden, wie sie sind, wobei Exponenten richtig kombiniert werden
- Negative Null ist in der Eingabe zulässig, aber semantisch nicht von positiver Null zu unterscheiden. Immer positive Null ausgeben. Lassen Sie keine Nullterme aus.
Viel Spaß beim Golfen! Viel Glück!
Antworten:
R ,
159153148 BytesProbieren Sie es online!
Ich wollte es unbedingt verwenden
outer
, daher gibt es mit ziemlicher Sicherheit einen effizienteren Ansatz.quelle
Haskell ,
131122 BytesProbieren Sie es online!
f
parst ein Polynom aus einer Zeichenkette,!
multipliziert zwei davon und formatiert das Ergebnis.H.PWiz sparte 9 Bytes. Vielen Dank!
Ungolfed
quelle
Ruby ,
102 10098 BytesProbieren Sie es online!
Wie?
Erster Schritt: Hole alle Zahlen aus beiden Polynomen:
scan
Gibt die Zahlen als Array von Zeichenfolgenpaaren zurück. Dann machen Sie ein kartesisches Produkt der 2 Listen. Jetzt haben wir alle Nummern dort, wo wir sie brauchen, aber immer noch in der falschen Reihenfolge.Beispiel: Wenn wir mehrfach
3x^4
durch-5x^2
, so erhalten wir die Zahlen als[["3","4"],["-5","2"]]
die erste Idee zu zip war und diese Liste abflachen und dann die Zahlen in einen Ausdruck setzen , wie bewertet werden[3*-5, 4+2]
. Tatsächlich müssen wir die Zahlen nicht neu anordnen, sondern können dies innerhalb des Ausdrucks mithilfe einer temporären Variablen tun: Der Ausdruck wird[3*(z=4,-5),z+2]
.Nachdem wir diese Ausdrücke ausgewertet haben, erhalten wir den Koeffizienten und den Exponenten. Wir müssen sie mit verbinden
"x^"
und dann alle Tems mit verbinden"+"
.quelle
Haskell,
124121 BytesHinweis: TIO fehlt
Data.Lists
, deshalb importiere ichData.Lists.Split
undData.List
: Probiere es online aus!Edit: -3 Bytes dank @Lynn.
quelle
f!x=map f.splitOn x
undz=read!"x^"!"+"
speichert dann ein Byte; für die letzte zeiledrop 3$do[u,v]<-z a;[p,q]<-z b;" + "++shows(u*p)"x^"++show(v+q)
spart man noch zwei. 120 BytesData.List
stattData.Lists
, so dass es ein Byte ist.Pyth - 39 Bytes
Probieren Sie es online aus .
quelle
JavaScript (Babel Node) , 118 Byte
Übernimmt die Eingabe als
(a)(b)
.Probieren Sie es online!
quelle
Python 2 , 193 Bytes
Probieren Sie es online!
Randnotiz: Das erste Mal, dass ich eine Code-Golf-Challenge mache. Tut mir leid, wenn der Versuch scheitert, haha
quelle
re.finditer
vielleicht nicht der kürzeste WegNetzhaut , 110 Bytes
Probieren Sie es online! Erläuterung:
Stellen Sie jedem Begriff in der ersten Eingabe ein
#
, eine Kopie der zweiten Eingabe und ein Leerzeichen voran. Dies bedeutet, dass allen Begriffen in Kopien der zweiten Eingabe ein Leerzeichen vorangestellt ist und keiner der Begriffe aus der ersten Eingabe.Vergleichen Sie alle Kopien von Begriffen in der zweiten Eingabe mit dem entsprechenden Begriff aus der ersten Eingabe. Verketten Sie alle
-
Zeichen, multiplizieren Sie die Koeffizienten und addieren Sie die Indizes. Verbinden Sie schließlich alle resultierenden Ersetzungen mit der Zeichenfolge+
.Löschen Sie alle Paare von
-
s und konvertieren Sie-0
zu0
.quelle
SNOBOL4 (CSNOBOL4) ,
192176 BytesProbieren Sie es online!
quelle
Perl 6 , 114 Bytes
Probieren Sie es online!
quelle
Python 2 , 130 Bytes
Probieren Sie es online!
quelle
C # (Visual C # Interactive Compiler) ,
192 bis190 ByteDie Abfragesyntax scheint ein Byte kürzer als die Methodensyntax zu sein.
Probieren Sie es online!
quelle
Gelee , 28 Bytes
Probieren Sie es online!
Volles Programm. Nimmt die beiden Polynome als Liste von zwei Zeichenfolgen.
Erklärung (erweiterte Form)
Aliasing
)
ist das gleiche wieµ€
.Ein Trailing
”
ist impliziert und kann weggelassen werden.Algorithmus
Nehmen wir an, wir haben diesen Input:
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:Der nächste Schritt besteht darin, jede Zeichenfolge durch zu teilen
'x'
, um den Koeffizienten vom Exponenten zu trennen. Das Ergebnis ist folgendes: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:
Das0 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:
^
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 Argument0
. Die Exponenten haben das^
s als erstes^
Zeichen und sind nicht niladisch, daher wird das Argument angenommen0
. Der Rest der Zeichenkette, dh die Zahl, ist das richtige Argument von^
. So zum Beispiel^2
istAuf geht's:
Dieser Schritt wandelt auch
"-0"
zu0
.Da wir beide Eingaben analysieren, lautet das Ergebnis nach dem Parsen wie folgt:
Das Parsing ist jetzt abgeschlossen. Das nächste Verfahren ist die Multiplikation.
Wir nehmen zuerst das kartesische Produkt dieser beiden Listen:
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:
Wir nehmen dann das Produkt des ersten Paares und die Summe des zweiten:
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:
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^"
:Dann treten wir der Liste bei mit
" + "
: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:
quelle
JavaScript,
112110 BytesIch habe zwei Alternativen mit der gleichen Länge gefunden. Aufruf mit aktueller Syntax:
f(A)(B)
Code-Snippet anzeigen
Code-Snippet anzeigen
-2 Bytes ( Luis ): Leerzeichen um das
split
Trennzeichen entfernen .JavaScript, 112 Bytes
Verwenden
String.prototype.matchAll
.Code-Snippet anzeigen
quelle
split' + ' => split'+'
2 Bytes zu rettenjoin
.