introduction
Les humains sont une espèce remarquable, mais nous pouvons parfois être très difficiles à comprendre, en particulier pour les ordinateurs. En particulier, il semble que nous aimions écrire des polynômes de manière très compliquée, avec des règles apparemment arbitraires.
Quel est le programme le plus court que vous puissiez écrire pour formater correctement un polynôme en utilisant ces règles?
Défi
Contribution
Liste d'entiers compris entre -1000 et 1000 (inclus), représentant les coefficients d'un polynôme, la dernière entrée étant le coefficient de x ^ 0 (la constante), la dernière dernière étant le coefficient de x ^ 1, etc.
Sortie
Une chaîne représentant ce polynôme dans la notation mathématique humaine correctement formatée.
Règles:
- Le signe sur le coefficient de début n'apparaît que s'il est négatif.
Right: -x^2+3
Wrong: +x^2+3
- Les composants dont le coefficient est égal à 0 ne sont pas imprimés (à l'exception du cas où tous les coefficients sont 0 *).
Right: x^5-x^2+3
Wrong: x^5+0x^4+0x^3-x^2+0x+3
- Les coefficients
-1
et+1
doivent être affichés sans le 1, à moins qu’ils ne soient la constante.
Right: x^5-x^2+1
Wrong: 1x^5-1x^2+1
- L'exposant n'est affiché que s'il est supérieur à 1 et la variable uniquement si l'exposant est supérieur à 0.
Right: 3x^3-7x^2+2x+1
Wrong: 3x^3-7x^2+2x^1+1x^0
- * Cas des angles: bien que les valeurs nulles ne génèrent généralement pas ce composant, si tous les coefficients sont nuls, la constante 0 doit être imprimée.
Right: 0
Wrong: 0x+0
Wrong: (nothing)
- Il s’agit d’un code-golf et le gagnant sera le programme contenant le moins d’octets.
Exemple d'entrée et de sortie
Input: Output:
[0] 0
[0,0] 0
[0,-1,35,0] -x^2+35x
[5,1,7,-9] 5x^3+x^2+7x-9
[100,0,0,-1] 100x^3-1
[931,21,-11,1] 931x^3+21x^2-11x+1
J'ai hâte de voir vos solutions. S'amuser!
MODIFIER:
- Vous pouvez entourer les opérations par des espaces si vous le souhaitez. Donc
3x+5
et3x + 5
sont bien tous les deux.3x+ 5
et3x +5
ne sont pas. - Si vous voulez produire des caractères d'exposant réels (par exemple en Tex), cela est autorisé car ils sont encore plus proches de la façon dont les humains écrivent.
- Les coefficients doivent apparaître sans décimales, par exemple,
9x^2
est correct,9.0x^2
n'est pas.
la source
3x^2 + 4
contre3x^2+4
?1x
->x
remplacement ne se transforme pas21x^2
en2x^2
.Réponses:
Retina 0.8.2 , 56 bytes
Essayez-le en ligne! Le lien inclut des cas de test. Explication:
Insérer tous les pouvoirs de
x
, y comprisx^1
mais pasx^0
.Supprimez toutes les puissances de
x
coefficients nuls, mais pas de fin0
(pour le moment).Supprimer un multiplicateur de
1
(mais pas une constante1
).Supprimer le
^1
dex^1
.Supprimez une constante 0 sauf si c'est la seule chose qui reste.
Supprimer l'espace avant un
-
.Remplacez les espaces restants par
+
s.la source
JavaScript (ES6),
107106 octetsEssayez-le en ligne!
Comment?
La sortie est construite en appliquant les formules suivantes à chaque coefficient c du tableau d’entrée a [] tout en gardant une trace de l’exposant actuel e .
1ère formule: signe plus
Si le coefficient est strictement positif et qu’il ne s’agit pas du premier terme de l’expression en sortie, on ajoute un
+
. Sinon, nous n’ajoutons rien.2ème formule: signe moins et coefficient
Si l'exposant est égal à zéro ou si la valeur absolue du coefficient n'est pas égale à 1, nous ajoutons le coefficient (qui peut inclure un premier
-
). Sinon, on ajoute soit un-
(si le coefficient est négatif) soit rien.3ème formule: variable et exposant
Si l'exposant est 0, nous n'ajoutons rien. Si l'exposant est 1, nous annexons
x
. Sinon, nous annexonsx^
suivi de l'exposant.la source
Stax , 37 octets
Exécuter et déboguer en ligne
Voici la version non compressée et non emballée.
Exécuter celui-ci
la source
Python 3,
279277258251 octetsPrend les entrées sous forme de liste de chaînes. Cette solution n'est pas encore très golfée. Cela fonctionne essentiellement en remplaçant des éléments pour les adapter au format de sortie, ce qui augmente considérablement le nombre d'octets.
Essayez-le en ligne!
Un merci spécial aux ovs et NK1406 .
la source
if'0'!=i
etif'-1'==i
.Paris / GP , 41 octets
Essayez-le en ligne!
Si un
*
entre le coefficient et la variable est autorisé:Pari / GP , 3 octets
Essayez-le en ligne!
la source
APL (Dyalog Classic) ,
114113109107106 octetsEssayez-le en ligne!
-4 octets grâce à @dzaima!
Cela peut définitivement être joué au golf. Cela nécessite
⎕IO←0
la source
Pip , 78 octets
Prend les coefficients comme arguments de ligne de commande. Essayez-le en ligne!
Utilise
ME
(map-enumerate) etJ
(join) pour générer quelque chose de la forme0x^3+-1x^2+35x^1+0x^0
, puis un tas de remplacements de regex pour le transformer au format approprié.la source
APL (Dyalog Classic) ,
7976 octetsEssayez-le en ligne!
la source
Python 3,
161162 octetsCorrection d'un bug grâce aux ovs.
Étendu:
la source
C # , 237 octets
la source
Propre , 172 octets
Essayez-le en ligne!
la source
Wolfram Language / Mathematica, 39 octets
Essayez-le en ligne!
Il s'avère qu'il y a une fonction intégrée pour entrer dans le bon ordre.
Solution précédente:
Wolfram Language / Mathematica, 93 octets
Au moins pour moi, cela est étonnamment long pour un langage conçu pour la manipulation mathématique. Il semble que celaExpand@FromDigits[#,x]&
devrait fonctionner, mais l'ordre par défaut pour les polynômes est l'inverse de ce que la question nécessite, ce qui nécessite un peu de travail supplémentaire.Explication
la source
SringReplace
êtreStringReplace
?Python3:
150146 octets(implémentations précédentes):
Vous pouvez l' essayer en ligne
Félicitations à: @Benjamin
la source
f=lambda l:''.join('+-'[a<0]+str(a)[a<0:5*((abs(a)!=1)|(1>i))]+'x^'[:i]+str(i)[:i-1]for i,a in zip(range(len(l)-1,-1,-1),l)if a).lstrip('+')or '0'
Perl 5
-a
, 94 octetsEssayez-le en ligne!
la source
Retina 0.8.2 , 113 octets
Essayez-le en ligne!
Je suis sûr qu'il y a beaucoup à jouer au golf ici ...
la source
Haskell ,
166163 octetsEssayez-le en ligne! Exemple d'utilisation:
g [0,-1,35,0]
rendements"-x^2+35x"
.La solution précédente de 166 octets, qui est légèrement mieux lisible:
Essayez-le en ligne!
la source
Ruby , 111 octets
Essayez-le en ligne!
Résoudre cela en Ruby s’est avéré un peu frustrant, principalement parce que, contrairement à la plupart des langues, en Ruby (presque), tout est en vérité, y compris les 0-s et les chaînes vides, de sorte que même un simple contrôle de zéro devient nul aussi petit que
x?
.J'ai joué avec différentes méthodes de construction de la corde, et finalement j'ai choisi plusieurs approches:
+
et les-
signes sont générés par la syntaxe de formatage avec signe forcé:%+d
x^i
est sélectionnée à l'aide de l'indexation d'opérateur de fusée[...][i<=>1]
la source
Husk ,
44 43 4140 octetsEssayez-le en ligne!
Cela semble un peu maladroit; Husk n'est pas optimisé pour la manipulation de chaîne. J'ai emprunté quelques idées à la réponse Stax .
Explication
la source
Perl 6 , 97 octets
Essayez-le en ligne!
Explication:
$!
garde la trace de l'exposant actuel.Ajouter
+
avant les coefficients positifs, sauf s’il s’agit du premier non nul. Le$_&&
court-circuit permet de s'assurer que la variable d'état anonyme$
n'est incrémentée que pour des coefficients non nuls. La&
jonction est effondrée lorsqu'elle est contrainte à Bool?
.Décrémenter
$!
. Couper le coefficient 1 ou -1 sauf s'il est constant.Termes linéaires et constants dans des cas spéciaux. L'utilisation de la
<< >>
construction de protection des guillemets est inférieure d'un octet à l'équivalent('','x')
ou2>$!??'x'x$!!!'x^'~$!
.Cachez les termes nuls, mais évaluez toujours l'expression précédente pour l'
--$!
effet secondaire.Renvoie
0
si tous les coefficients sont nuls.la source
Java 8,
202176174173 octetsExplication:
Essayez-le en ligne.
la source
a->{String r="";int j=a.length;for(int u:a)r+=u==(j^j--)?"":"+"+u+(j<1?"":j<2?"x":"x^"+j);return r.isEmpty()?"0":r.substring(1).replace("+-","-").replaceAll("([+-])1x","$1x");}
(j^j--)
pour0*j--
.Python, 165 octets
la source
PHP, 213 octets
Argument de ligne de commande comme demandé par OP (argument unique avec des crochets et des virgules).
Joli imprimé et quelques explications:
la source
PowerShell, 295 octets
la source