Introducción
Los humanos son una especie notable, pero a veces podemos ser muy incómodos de entender, especialmente para las computadoras. En particular, parece que nos gusta escribir polinomios de una manera muy complicada con reglas aparentemente arbitrarias.
¿Cuál es el programa más corto que puede escribir para formatear un polinomio correctamente usando estas reglas?
Reto
Entrada
Una lista de enteros entre -1000 y 1000 (inclusive), que representan los coeficientes de un polinomio, siendo la última entrada el coeficiente de x ^ 0 (la constante), la segunda última es el coeficiente de x ^ 1, etc.
Salida
Una cadena que representa este polinomio en la notación matemática formateada correctamente de humanos.
Reglas:
- El signo en el coeficiente principal solo se muestra si es negativo.
Right: -x^2+3
Wrong: +x^2+3
- Los componentes con coeficiente de 0 no se imprimen (excepto en el caso de la esquina donde todos los coeficientes son 0 *).
Right: x^5-x^2+3
Wrong: x^5+0x^4+0x^3-x^2+0x+3
- Los coeficientes
-1
y+1
se mostrarán sin el 1, a menos que sean la constante.
Right: x^5-x^2+1
Wrong: 1x^5-1x^2+1
- El exponente solo se muestra si es mayor que 1 y la variable solo se muestra si el exponente es mayor que 0.
Right: 3x^3-7x^2+2x+1
Wrong: 3x^3-7x^2+2x^1+1x^0
- * Caso de esquina: si bien los valores cero generalmente no imprimen ese componente, si todos los coeficientes son cero, se debe imprimir la constante 0.
Right: 0
Wrong: 0x+0
Wrong: (nothing)
- Este es el código de golf, por lo que el ganador será el programa con la menor cantidad de bytes.
Ejemplo de entrada y salida
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
Espero ver sus soluciones. ¡Que te diviertas!
EDITAR:
- Puede rodear las operaciones con espacios en blanco si lo desea. Entonces,
3x+5
y3x + 5
ambos están bien.3x+ 5
y3x +5
no lo son - Si desea producir caracteres exponentes reales (digamos en Tex), eso está permitido, ya que está aún más cerca de cómo escriben los humanos.
- Los coeficientes deben aparecer sin decimales, por ejemplo,
9x^2
es correcto,9.0x^2
no lo es.
fuente
3x^2 + 4
versus3x^2+4
?1x
->x
sustitución no cambia21x^2
en2x^2
.Respuestas:
Retina 0.8.2 , 56 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Explicación:
Inserte todos los poderes de
x
, incluyendox^1
pero nox^0
.Eliminar todas las potencias
x
con coeficientes cero, pero no un final0
(todavía).Eliminar un multiplicador de
1
(pero no una constante1
).Eliminar el
^1
dex^1
.Eliminar una constante 0 a menos que sea lo único que queda.
Eliminar el espacio antes de a
-
.Cambie los espacios restantes a
+
s.fuente
JavaScript (ES6),
107106 bytesPruébalo en línea!
¿Cómo?
La salida se construye aplicando las siguientes fórmulas a cada coeficiente c de la matriz de entrada a [] mientras se realiza un seguimiento del exponente actual e .
1.a fórmula: signo más
Si el coeficiente es estrictamente positivo y este no es el primer término en la expresión de salida, agregamos un
+
. De lo contrario, no agregamos nada.2da fórmula: signo menos y coeficiente
Si el exponente es cero o el valor absoluto del coeficiente no es igual a 1, agregamos el coeficiente (que puede incluir un inicio
-
). De lo contrario, agregamos un-
(si el coeficiente es negativo) o nada.3a fórmula: variable y exponente
Si el exponente es 0, no agregamos nada. Si el exponente es 1, añadimos
x
. De lo contrario, anexamosx^
seguido del exponente.fuente
Stax , 37 bytes
Ejecútelo y depúrelo en línea
Aquí está la versión desempaquetada y sin golf.
Ejecute este
fuente
Python 3,
279277258251 bytesToma la entrada como una lista de cadenas. Esta solución aún no está muy desarrollada. Básicamente, esto funciona reemplazando las cosas para adaptarlas al formato de salida, lo que aumenta considerablemente el recuento de bytes.
¡Pruébelo en línea!
Un agradecimiento especial a los ovs y NK1406 .
fuente
if'0'!=i
yif'-1'==i
.Pari / GP , 41 bytes
Pruébalo en línea!
Si una
*
se permite entre el coeficiente y la variable:Pari / GP , 3 bytes
Pruébalo en línea!
fuente
APL (Dyalog Classic) ,
114113109107106 bytesPruébalo en línea!
-4 bytes gracias a @dzaima!
Esto definitivamente se puede reducir aún más. Esto requiere
⎕IO←0
fuente
Pip , 78 bytes
Toma los coeficientes como argumentos de línea de comandos. Pruébalo en línea!
Utiliza
ME
(map-enumerate) yJ
(join) para generar algo de la forma0x^3+-1x^2+35x^1+0x^0
, y luego un montón de reemplazos de expresiones regulares para transformar esto en el formato adecuado.fuente
APL (Dyalog Classic) ,
7976 bytesPruébalo en línea!
fuente
Python 3,
161162 bytesSe corrigió un error gracias a los ovs.
Expandido:
fuente
C # , 237 bytes
fuente
Limpio , 172 bytes
Pruébalo en línea!
fuente
Wolfram Language / Mathematica, 39 bytes
Pruébalo en línea!
Resulta que hay un incorporado para entrar en el orden correcto.
Solución previa:
Wolfram Language / Mathematica, 93 bytes
Al menos para mí, esto es sorprendentemente largo para un lenguaje diseñado para la manipulación matemática. Parece queExpand@FromDigits[#,x]&
debería funcionar, pero el orden predeterminado para los polinomios es el reverso de lo que requiere la pregunta, por lo que se requiere un poco de determinación adicional.Explicación
fuente
SringReplace
serStringReplace
?Python3:
150146 bytes(implementaciones anteriores):
Puedes probarlo en línea
Felicitaciones a: @Benjamin
fuente
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 bytesPruébalo en línea!
fuente
Retina 0.8.2 , 113 bytes
Pruébalo en línea!
Estoy seguro de que hay mucho para jugar golf aquí ...
fuente
Haskell ,
166163 bytesPruébalo en línea! Ejemplo de uso:
g [0,-1,35,0]
rendimientos"-x^2+35x"
.Solución anterior de 166 bytes, que es ligeramente mejor legible:
Pruébalo en línea!
fuente
Ruby , 111 bytes
Pruébalo en línea!
Resolver esto en Ruby resultó ser un poco frustrante, principalmente debido al hecho de que, a diferencia de la mayoría de los idiomas, en Ruby (casi) todo es verdad, incluidos 0-sy cadenas vacías, de modo que incluso una simple comprobación de cero no se acerca. tan corto como
x?
.Jugué con varios métodos de construcción de la cadena, y finalmente me decidí por una combinación de varios enfoques:
+
y los-
signos se producen formateando la sintaxis con signo forzado:%+d
x^i
se selecciona mediante la indexación del operador de cohete[...][i<=>1]
fuente
Casco ,
44 43 4140 bytesPruébalo en línea!
Esto se siente un poco torpe; Husk no está optimizado para la manipulación de cadenas. Tomé prestadas algunas ideas de la respuesta Stax .
Explicación
fuente
Perl 6 , 97 bytes
Pruébalo en línea!
Explicación:
$!
realiza un seguimiento del exponente actual.Agregue
+
antes de los coeficientes positivos, excepto si es el primero distinto de cero. El$_&&
cortocircuito asegura que la variable de estado anónimo$
solo se incremente para coeficientes distintos de cero. La&
unión se colapsa cuando se obliga a Bool con?
.Decremento
$!
. Pica el coeficiente 1 o -1 a menos que sea constante.Términos lineales y constantes de casos especiales. El uso de la
<< >>
construcción de protección de comillas es un byte más corto que el equivalente('','x')
o2>$!??'x'x$!!!'x^'~$!
.Oculte los términos cero, pero siempre evalúe la expresión anterior para el
--$!
efecto secundario.Devuelve
0
si todos los coeficientes son cero.fuente
Java 8,
202176174173 bytesExplicación:
Pruébalo en línea.
fuente
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--)
a0*j--
.Python, 165 bytes
fuente
PHP, 213 bytes
Argumento de línea de comando según lo solicitado por OP (argumento único con corchetes y comas).
Bonito estampado y alguna explicación:
fuente
PowerShell, 295 bytes
fuente