Votre tâche consiste à prendre deux expressions polynomiales entières à variable unique et à les multiplier dans leur expansion de gauche à droite non simplifiée du premier terme (AKA FOIL dans le cas des binômes). Ne combinez pas des termes similaires et ne réorganisez pas le résultat. Pour être plus explicite sur l'expansion, multipliez le premier terme de la première expression par chaque terme du second, dans l'ordre, et continuez dans la première expression jusqu'à ce que tous les termes aient été multipliés par tous les autres termes. Les expressions seront données dans une variante simplifiée de LaTeX.
Chaque expression sera une séquence de termes séparés par +
(avec exactement un espace de chaque côté) Chaque terme sera conforme à l'expression régulière suivante: (notation PCRE)
-?\d+x\^\d+
En anglais simple, le terme est un interligne facultatif -
suivi d'un ou plusieurs chiffres suivis de x
et d'une puissance entière non négative (avec ^
)
Un exemple d'une expression complète:
6x^3 + 1337x^2 + -4x^1 + 2x^0
Une fois branché sur LaTeX, vous obtenez
La sortie doit également être conforme à ce format.
Étant donné que les crochets n'entourent pas les exposants dans ce format, LaTeX rendra en fait les exposants à plusieurs chiffres de manière incorrecte. (par exemple, 4x^3 + -2x^14 + 54x^28 + -4x^5
rend ) Vous n'avez pas besoin de tenir compte de cela et vous ne devez pas inclure les crochets dans votre sortie.
Exemples de cas de test
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
Règles et hypothèses
- Vous pouvez supposer que toutes les entrées sont conformes à ce format exact. Le comportement pour tout autre format n'est pas défini aux fins de ce défi.
- Il convient de noter que toute méthode de prise en compte des deux polynômes est valide, à condition que les deux soient lus en tant que chaînes conformes au format ci-dessus.
- L'ordre des polynômes est important en raison de l'ordre prévu de l'expansion du produit.
- Vous devez prendre en charge les coefficients d'entrée compris entre et et les exposants d'entrée jusqu'à .
- Les coefficients de sortie entre et et les exposants jusqu'à doivent donc être pris en charge.
- Vous pouvez supposer que chaque polynôme d'entrée ne contient pas plus de 16 termes
- Par conséquent, vous devez (au minimum) prendre en charge jusqu'à 256 termes dans la sortie
- Les termes avec des coefficients nuls doivent être laissés tels quels, les exposants étant correctement combinés
- Le zéro négatif est autorisé en entrée, mais il est impossible de le distinguer sémantiquement du zéro positif. Toujours sortir un zéro positif. N'omettez pas les termes zéro.
Bon golf! Bonne chance!
Réponses:
R ,
159153148 octetsEssayez-le en ligne!
Je voulais vraiment utiliser
outer
, donc il y a presque sûrement une approche plus efficace.la source
Haskell ,
131122 octetsEssayez-le en ligne!
f
analyse un polynôme à partir d'une chaîne, en!
multiplie deux et formate le résultat.H.PWiz a enregistré 9 octets. Merci!
Non golfé
la source
Rubis ,
102 10098 octetsEssayez-le en ligne!
Comment?
Première étape: obtenir tous les nombres des deux polynômes:
scan
renvoie les nombres sous forme de tableau de paires de chaînes. Ensuite, faites un produit cartésien des 2 listes. Nous avons maintenant tous les numéros où nous en avons besoin, mais toujours dans le mauvais ordre.Exemple: si nous multiplions
3x^4
par-5x^2
, nous obtenons les nombres comme[["3","4"],["-5","2"]]
, la première idée était de compresser et d'aplatir cette liste, puis de mettre les nombres dans une expression à évaluer comme[3*-5, 4+2]
. En fait, nous n'avons pas besoin de réorganiser les nombres, nous pouvons le faire à l'intérieur de l'expression en utilisant une variable temporaire: l'expression devient[3*(z=4,-5),z+2]
.Après avoir évalué ces expressions, nous obtenons le coefficient et l'exposant, nous devons les joindre à l'aide
"x^"
, puis joindre tous les tems à l'aide"+"
.la source
Haskell,
124121 octetsRemarque: TIO manque
Data.Lists
, alors j'importeData.Lists.Split
etData.List
: Essayez-le en ligne!Edit: -3 octets grâce à @Lynn.
la source
f!x=map f.splitOn x
puisz=read!"x^"!"+"
enregistre un octet; pour la dernière lignedrop 3$do[u,v]<-z a;[p,q]<-z b;" + "++shows(u*p)"x^"++show(v+q)
enregistre deux autres. 120 octetsData.List
place deData.Lists
, donc c'est +1 octet.Pyth - 39 octets
Essayez-le en ligne .
la source
JavaScript (nœud Babel) , 118 octets
Prend l'entrée comme
(a)(b)
.Essayez-le en ligne!
la source
Python 2 , 193 octets
Essayez-le en ligne!
Note: Première fois que vous faites un défi de golf de code, désolé si la tentative est nulle haha
la source
re.finditer
ce ne soit peut-être pas l'approche la plus courteRétine , 110 octets
Essayez-le en ligne! Explication:
Préfixez chaque terme dans la première entrée avec un
#
, une copie de la deuxième entrée et un espace. Cela signifie que tous les termes dans les copies de la deuxième entrée sont précédés d'un espace et aucun des termes de la première entrée ne l'est.Faites correspondre toutes les copies des termes de la deuxième entrée et leur terme correspondant de la première entrée. Concatène tous les
-
signes, multiplie les coefficients et ajoute les indices. Enfin, joignez toutes les substitutions résultantes avec la chaîne+
.Supprimez toutes les paires de
-
s et convertissez-les-0
en0
.la source
SNOBOL4 (CSNOBOL4) ,
192176 octetsEssayez-le en ligne!
la source
Perl 6 , 114 octets
Essayez-le en ligne!
la source
Python 2 , 130 octets
Essayez-le en ligne!
la source
C # (Visual C # Interactive Compiler) ,
192190 octetsLa syntaxe de requête semble être un octet plus court que la syntaxe de méthode.
Essayez-le en ligne!
la source
Gelée , 28 octets
Essayez-le en ligne!
Programme complet. Prend les deux polynômes comme une liste de deux chaînes.
Explication (formulaire développé)
Aliasing
)
est le même queµ€
.Un suivi
”
est implicite et peut être omis.Algorithme
Disons que nous avons cette entrée:
La première procédure est l'analyse syntaxique, appliquée à chacun des deux polynômes. La poignée de laisser le premier un,
"6x^2 + 7x^1 + -2x^0"
:La première étape consiste à diviser la chaîne de
'+'
manière à séparer les termes. Il en résulte:L'étape suivante consiste à diviser chaque chaîne par
'x'
, pour séparer le coefficient de l'exposant. Le résultat est le suivant:Actuellement, il semble qu'il y ait beaucoup de corbeille dans ces chaînes, mais cette corbeille est en fait sans importance. Ces chaînes vont toutes être évaluées comme des liens de gelée niladiques. Curieusement, les espaces sont sans importance, car ils ne sont pas entre les chiffres des chiffres. Donc, nous pourrions aussi bien évaluer ce qui suit et toujours obtenir le même résultat:
Les0 XOR 2 = 2 . Évidemment,0 XOR n = n . Tous les exposants sont entiers, nous allons donc bien. Par conséquent, évaluer cela au lieu de ce qui précède ne changera pas le résultat:
^
s semblent un peu plus dérangeants, mais ils ne font rien non plus! Eh bien,^
c'est l'atome XOR au niveau du bit, mais les chaînes niladiques agissent comme des liens monadiques, sauf que le premier lien devient en fait l'argument, au lieu de prendre un argument, s'il est niladique. Si ce n'est pas le cas, le lien aura un argument de0
. Les exposants ont le^
s comme premier caractère et^
ne sont pas niladic, donc l'argument est supposé être0
. Le reste de la chaîne, c'est-à-dire le nombre, est le bon argument de^
. Ainsi, par exemple,^2
estEt c'est parti:
Cette étape sera également convertie
"-0"
en0
.Puisque nous analysons les deux entrées, le résultat après l'analyse sera le suivant:
L'analyse est maintenant terminée. La procédure suivante est la multiplication.
Nous prenons d'abord le produit cartésien de ces deux listes:
De nombreuses paires sont faites, chacune avec un élément de la liste de gauche et un de la droite, dans l'ordre. Cela se trouve également être l'ordre prévu de la sortie. Ce défi nous demande vraiment d'appliquer la distributivité multiplicative, car on nous demande de ne plus traiter le résultat par la suite.
Les paires de chaque paire représentent des termes que nous voulons multiplier, le premier élément étant le coefficient et le second étant l'exposant. Pour multiplier les termes, nous multiplions les coefficients et additionnons les exposants (un xcb xré= a b xcXré= a b ( xcXré) = ( a b ) xc + d ). Comment fait-on cela? Allons gérer la deuxième paire,
[[6, 2], [-2, 3]]
.Nous transposons d'abord la paire:
On prend alors le produit de la première paire, et la somme de la seconde:
La partie pertinente du code
PSƭ€
,, ne réinitialise pas réellement son compteur pour chaque paire de termes, mais, comme ce sont des paires, ce n'est pas nécessaire.Pour toutes les paires de termes, nous avons:
Ici, la multiplication est effectuée, car nous n'avons pas à combiner des termes similaires. La procédure finale est le Prettyfying.
Nous rejoignons d'abord chaque paire avec
"x^"
:Ensuite, nous rejoignons la liste avec
" + "
:Remarquez comment nous avons encore des nombres dans la liste, donc ce n'est pas vraiment une chaîne. Cependant, Jelly a un processus appelé "stringification", exécuté juste à la fin de l'exécution d'un programme pour imprimer le résultat. Pour une liste de profondeur 1, il convertit vraiment chaque élément en sa représentation de chaîne et concatène les chaînes ensemble, nous obtenons donc la sortie souhaitée:
la source
JavaScript,
112110 octetsJ'ai trouvé deux alternatives de même longueur. Appel avec syntaxe de curry:
f(A)(B)
Afficher l'extrait de code
Afficher l'extrait de code
-2 octets ( Luis ): supprime les espaces autour du
split
délimiteur.JavaScript, 112 octets
Utilisation
String.prototype.matchAll
.Afficher l'extrait de code
la source
split' + ' => split'+'
pour économiser 2 octetsjoin
.