Su tarea es tomar dos expresiones polinómicas enteras de una sola variable y multiplicarlas en su expansión de izquierda a derecha principal no simplificada de primer término (AKA FOIL en el caso de binomios). No combine términos similares ni reordene el resultado. Para ser más explícito sobre la expansión, multiplique el primer término en la primera expresión por cada término en el segundo, en orden, y continúe en la primera expresión hasta que todos los términos se hayan multiplicado por todos los demás términos. Las expresiones se darán en una variante simplificada de LaTeX.
Cada expresión será una secuencia de términos separados por +
(con exactamente un espacio en cada lado) Cada término se ajustará a la siguiente expresión regular: (notación PCRE)
-?\d+x\^\d+
En inglés simple, el término es un encabezado opcional -
seguido de uno o más dígitos seguidos de x
una potencia entera no negativa (con^
)
Un ejemplo de una expresión completa:
6x^3 + 1337x^2 + -4x^1 + 2x^0
Cuando se conecta a LaTeX, obtiene
La salida también debe cumplir con este formato.
Dado que los corchetes no rodean exponentes en este formato, LaTeX realmente representará exponentes de varios dígitos de manera incorrecta. (p. ej., se 4x^3 + -2x^14 + 54x^28 + -4x^5
representa como ) No es necesario que tenga en cuenta esto y no debe incluir los corchetes en su salida.
Ejemplos de casos de prueba
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
Reglas y Suposiciones
- Puede suponer que todas las entradas se ajustan a este formato exacto. El comportamiento para cualquier otro formato no está definido para los propósitos de este desafío.
- Cabe señalar que cualquier método para tomar los dos polinomios es válido, siempre que ambos se lean como cadenas que se ajusten al formato anterior.
- El orden de los polinomios es importante debido al orden esperado de expansión del producto.
- Debe admitir coeficientes de entrada entre y y exponentes de entrada de hasta .
- Por lo tanto, deben admitirse coeficientes de salida entre y y exponentes de hasta .
- Puede suponer que cada polinomio de entrada contiene no más de 16 términos
- Por lo tanto, debe (como mínimo) admitir hasta 256 términos en la salida
- Los términos con coeficientes cero deben dejarse como están, con los exponentes combinados adecuadamente
- Se permite el cero negativo en la entrada, pero no se puede distinguir semánticamente del cero positivo. Siempre da salida a cero positivo. No omita los términos cero.
¡Feliz golf! ¡Buena suerte!
Respuestas:
R ,
159153148 bytesPruébalo en línea!
Tenía muchas ganas de usar
outer
, por lo que es casi seguro que haya un enfoque más eficiente.fuente
Haskell ,
131122bytesPruébalo en línea!
f
analiza un polinomio de una cadena,!
multiplica dos de ellos y formatea el resultado.H.PWiz guardó 9 bytes. ¡Gracias!
Sin golf
fuente
Ruby ,
102 10098 bytesPruébalo en línea!
¿Cómo?
Primer paso: obtener todos los números de ambos polinomios:
scan
devuelve los números como una matriz de pares de cadenas. Luego, haga un producto cartesiano de las 2 listas. Ahora tenemos todos los números donde los necesitamos, pero aún en el orden incorrecto.Ejemplo: si multiplicamos
3x^4
por-5x^2
, obtenemos los números como[["3","4"],["-5","2"]]
, la primera idea era comprimir y aplanar esta lista, y luego poner los números en una expresión para ser evaluados como[3*-5, 4+2]
. En realidad, no necesitamos reordenar los números, podríamos hacerlo dentro de la expresión usando una variable temporal: la expresión se convierte en[3*(z=4,-5),z+2]
.Después de evaluar estas expresiones, obtenemos el coeficiente y el exponente, necesitamos unirlos usando
"x^"
, y luego unir todos los elementos usando"+"
.fuente
Haskell,
124121 bytesNota: TIO carece
Data.Lists
, así que importoData.Lists.Split
yData.List
: ¡ Pruébelo en línea!Editar: -3 bytes gracias a @Lynn.
fuente
f!x=map f.splitOn x
y luegoz=read!"x^"!"+"
guarda un byte; para la última líneadrop 3$do[u,v]<-z a;[p,q]<-z b;" + "++shows(u*p)"x^"++show(v+q)
ahorra dos más. 120 bytesData.List
lugar deData.Lists
, por lo que es +1 byte.Pyth - 39 bytes
Pruébalo en línea .
fuente
JavaScript (nodo de Babel) , 118 bytes
Toma entrada como
(a)(b)
.Pruébalo en línea!
fuente
Python 2 , 193 bytes
Pruébalo en línea!
Nota al margen: la primera vez que hago un desafío de golf de código, lo siento si el intento apesta jaja
fuente
re.finditer
podría no ser el enfoque más cortoRetina , 110 bytes
Pruébalo en línea! Explicación:
Prefije cada término en la primera entrada con un
#
, una copia de la segunda entrada y un espacio. Esto significa que todos los términos en las copias de la segunda entrada están precedidos por un espacio y ninguno de los términos de la primera entrada.Haga coincidir todas las copias de los términos en la segunda entrada y su término correspondiente de la primera entrada. Concatenar cualquier
-
signo, multiplicar los coeficientes y sumar los índices. Finalmente unir todas las sustituciones resultantes con la cadena+
.Eliminar cualquier par de
-
sy convertir-0
a0
.fuente
SNOBOL4 (CSNOBOL4) ,
192176 bytesPruébalo en línea!
fuente
Perl 6 , 114 bytes
Pruébalo en línea!
fuente
Python 2 , 130 bytes
Pruébalo en línea!
fuente
C # (compilador interactivo de Visual C #) ,
192190 bytesLa sintaxis de consulta parece ser un byte más corto que la sintaxis del método.
Pruébalo en línea!
fuente
Jalea , 28 bytes
Pruébalo en línea!
Programa completo Toma los dos polinomios como una lista de dos cadenas.
Explicación (forma expandida)
Aliasing
)
es el mismo queµ€
.Un final
”
está implícito y puede omitirse.Algoritmo
Digamos que tenemos esta entrada:
El primer procedimiento es el análisis, aplicado a cada uno de los dos polinomios. Manejemos el primero,
"6x^2 + 7x^1 + -2x^0"
:El primer paso es dividir la cadena por
'+'
, para separar los términos. Esto resulta en:El siguiente paso es dividir cada cadena por
'x'
, para separar el coeficiente del exponente. El resultado es este:Actualmente, parece que hay mucha basura en estas cadenas, pero esa basura en realidad no es importante. Estas cadenas se evaluarán como enlaces Jelly niládicos. Trivialmente, los espacios no son importantes, ya que no están entre los dígitos de los números. Así que también podríamos evaluar lo siguiente y seguir obteniendo el mismo resultado:
Los0 XOR 2 = 2 . Obviamente,0 XOR n = n . Todos los exponentes son enteros, por lo que estamos bien. Por lo tanto, evaluar esto en lugar de lo anterior no cambiará el resultado:
^
s se ven un poco más inquietante, pero que en realidad no hacen nada, ya sea! Bueno,^
es el átomo XOR bit a bit, sin embargo, las cadenas niládicas actúan como enlaces monádicos, excepto que el primer enlace en realidad se convierte en el argumento, en lugar de tomar un argumento, si es niládico. Si no es así, el enlace tendrá un argumento de0
. Los exponentes tienen la^
s como su primer carácter, y^
no es niládica, por lo que se supone que el argumento es0
. El resto de la cadena, es decir, el número, es el argumento correcto de^
. Entonces, por ejemplo,^2
esAquí vamos:
Este paso también se convertirá
"-0"
a0
.Como estamos analizando ambas entradas, el resultado después del análisis será este:
El análisis ahora está completo. El siguiente procedimiento es la multiplicación.
Primero tomamos el producto cartesiano de estas dos listas:
Se forman muchos pares, cada uno con un elemento de la lista de la izquierda y uno de la derecha, en orden. Esto también pasa a ser el orden previsto de la salida. Este desafío realmente nos pide que apliquemos la distributividad multiplicativa, ya que se nos pide que no procesemos más el resultado después de eso.
Los pares en cada par representan términos que queremos multiplicar, siendo el primer elemento el coeficiente y el segundo el exponente. Para multiplicar los términos, multiplicamos los coeficientes y sumamos los exponentes (a xCb xre= a b xCXre= a b ( xCXre) = ( a b ) xc + d ) ¿Como hacemos eso? Manejemos el segundo par,
[[6, 2], [-2, 3]]
.Primero transponemos el par:
Luego tomamos el producto del primer par y la suma del segundo:
La parte relevante del código,
PSƭ€
realidad, no restablece su contador para cada par de términos, pero, dado que son pares, no es necesario.Manejando todos los pares de términos, tenemos:
Aquí, la multiplicación se realiza, ya que no tenemos que combinar términos similares. El procedimiento final es el Prettyfying.
Primero unimos cada par con
"x^"
:Luego nos unimos a la lista con
" + "
:Observe cómo todavía tenemos números en la lista, por lo que no es realmente una cadena. Sin embargo, Jelly tiene un proceso llamado "stringificación", que se ejecutó justo al final de la ejecución de un programa para imprimir el resultado. Para una lista de profundidad 1, realmente solo convierte cada elemento en su representación de cadena y concatena las cadenas juntas, por lo que obtenemos el resultado deseado:
fuente
JavaScript,
112110 bytesEncontré dos alternativas con la misma longitud. Llamada con sintaxis curry:
f(A)(B)
Mostrar fragmento de código
Mostrar fragmento de código
-2 bytes ( Luis ): Eliminar espacios alrededor del
split
delimitador.JavaScript, 112 bytes
Utilizando
String.prototype.matchAll
.Mostrar fragmento de código
fuente
split' + ' => split'+'
guardar 2 bytesjoin
.