Sua tarefa é pegar duas expressões polinomiais inteiras de variável única e multiplicá-las em sua expansão principal da esquerda para a direita não simplificada do primeiro termo (AKA FOIL no caso de binômios). Não combine termos semelhantes nem reordene o resultado. Para ser mais explícito sobre a expansão, multiplique o primeiro termo na primeira expressão por cada termo no segundo, em ordem, e continue na primeira expressão até que todos os termos tenham sido multiplicados por todos os outros termos. As expressões serão dadas em uma variante simplificada do LaTeX.
Cada expressão será uma sequência de termos separados por +
(com exatamente um espaço de cada lado). Cada termo estará em conformidade com a seguinte expressão regular: (notação PCRE)
-?\d+x\^\d+
Em inglês simples, o termo é um líder opcional -
seguido por um ou mais dígitos seguidos por x
e um número inteiro não negativo (com ^
)
Um exemplo de uma expressão completa:
6x^3 + 1337x^2 + -4x^1 + 2x^0
Quando conectado ao LaTeX, você obtém
A saída também deve estar em conformidade com este formato.
Como os colchetes não envolvem expoentes nesse formato, o LaTeX renderiza expoentes de vários dígitos incorretamente. (por exemplo, é 4x^3 + -2x^14 + 54x^28 + -4x^5
processado como ) Você não precisa dar conta disso e não deve incluir os colchetes na saída.
Casos de teste de exemplo
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
Regras e premissas
- Você pode assumir que todas as entradas estão em conformidade com este formato exato. O comportamento para qualquer outro formato é indefinido para os propósitos deste desafio.
- Deve-se notar que qualquer método de captura dos dois polinômios é válido, desde que ambos sejam lidos como cadeias de caracteres em conformidade com o formato acima.
- A ordem dos polinômios é importante devido à ordem esperada da expansão do produto.
- Você deve suportar coeficientes de entrada entre e e expoentes de entrada até .
- Coeficientes de saída entre e e expoentes até devem, portanto, ser suportados.
- Você pode assumir que cada polinômio de entrada contém no máximo 16 termos
- Portanto, você deve (no mínimo) suportar até 256 termos na saída
- Termos com coeficientes zero devem ser deixados como estão, com os expoentes sendo combinados adequadamente
- O zero negativo é permitido na entrada, mas é indistinguível do zero positivo semântica. Sempre emita zero positivo. Não omita zero termos.
Golfe feliz! Boa sorte!
Respostas:
R ,
159153148 bytesExperimente online!
Eu realmente queria usar
outer
, então há quase certamente uma abordagem mais eficiente.fonte
Haskell ,
131122 bytesExperimente online!
f
analisa um polinômio de uma string,!
multiplica dois deles e formata o resultado.H.PWiz salvou 9 bytes. Obrigado!
Ungolfed
fonte
Ruby ,
102 10098 bytesExperimente online!
Quão?
Primeiro passo: obtenha todos os números de ambos os polinômios:
scan
retorna os números como uma matriz de pares de cadeias. Em seguida, faça um produto cartesiano das 2 listas. Agora, temos todos os números onde precisamos deles, mas ainda na ordem errada.Exemplo: se multiplicarmos
3x^4
por-5x^2
, obtemos os números como[["3","4"],["-5","2"]]
, a primeira idéia foi compactar e achatar essa lista e, em seguida, colocar os números em uma expressão a ser avaliada como[3*-5, 4+2]
. Na verdade, não precisamos reordenar os números, podemos fazê-lo dentro da expressão usando uma variável temporária: a expressão se torna[3*(z=4,-5),z+2]
.Depois de avaliar essas expressões, obtemos o coeficiente e o expoente, precisamos uni-los usando
"x^"
e, em seguida, unimos todos os tems usando"+"
.fonte
Haskell,
124121 bytesNota: O TIO não possui
Data.Lists
, portanto importoData.Lists.Split
eData.List
: Experimente online!Edit: -3 bytes graças a @Lynn.
fonte
f!x=map f.splitOn x
ez=read!"x^"!"+"
salva um byte; para a última linhadrop 3$do[u,v]<-z a;[p,q]<-z b;" + "++shows(u*p)"x^"++show(v+q)
economiza mais dois. 120 bytesData.List
vez deData.Lists
, portanto, é de 1 byte.Pitão - 39 bytes
Experimente online .
fonte
JavaScript (Nó Babel) , 118 bytes
Aceita entrada como
(a)(b)
.Experimente online!
fonte
Python 2 , 193 bytes
Experimente online!
Nota lateral: Primeira vez em um desafio de código de golfe, desculpe se a tentativa for péssima haha
fonte
re.finditer
pode não ser a abordagem mais curtoRetina , 110 bytes
Experimente online! Explicação:
Prefixe cada termo na primeira entrada com a
#
, uma cópia da segunda entrada e um espaço. Isso significa que todos os termos nas cópias da segunda entrada são precedidos por um espaço e nenhum dos termos da primeira entrada é.Combine todas as cópias dos termos na segunda entrada e o termo correspondente da primeira entrada. Concatene quaisquer
-
sinais, multiplique os coeficientes e adicione os índices. Finalmente, junte todas as substituições resultantes à string+
.Exclua quaisquer pares de se
-
converta-0
para0
.fonte
SNOBOL4 (CSNOBOL4) ,
192176 bytesExperimente online!
fonte
Perl 6 , 114 bytes
Experimente online!
fonte
Python 2 , 130 bytes
Experimente online!
fonte
C # (compilador interativo do Visual C #) ,
192190 bytesA sintaxe da consulta parece ser um byte menor que a sintaxe do método.
Experimente online!
fonte
Gelatina , 28 bytes
Experimente online!
Programa completo. Toma os dois polinômios como uma lista de duas cadeias.
Explicação (formulário expandido)
Alias
)
é o mesmo queµ€
.Um final
”
está implícito e pode ser omitido.Algoritmo
Digamos que temos esta entrada:
O primeiro procedimento é a análise, aplicada a cada um dos dois polinômios. Vamos lidar com o primeiro,
"6x^2 + 7x^1 + -2x^0"
:O primeiro passo é dividir a string por
'+'
, para separar os termos. Isto resulta em:O próximo passo é dividir cada sequência por
'x'
, para separar o coeficiente do expoente. O resultado é este:Atualmente, parece que há muito lixo nessas cadeias, mas esse lixo não é realmente importante. Essas seqüências serão avaliadas como links niládicos de geléia. Trivialmente, os espaços não são importantes, pois não estão entre os dígitos dos números. Assim, podemos avaliar o abaixo e ainda assim obter o mesmo resultado:
^
^
0
^
^
0
^
^2
Aqui vamos nós:
Esta etapa também será convertida
"-0"
para0
.Como estamos analisando as duas entradas, o resultado após a análise será este:
A análise está concluída. O próximo procedimento é a multiplicação.
Primeiro, tomamos o produto cartesiano dessas duas listas:
Muitos pares são feitos, cada um com um elemento da lista da esquerda e um da direita, em ordem. Isso também é a ordem pretendida da saída. Esse desafio realmente nos pede para aplicar a distributividade multiplicativa, pois somos solicitados a não processar o resultado depois disso.
[[6, 2], [-2, 3]]
Primeiro, transpomos o par:
Depois, pegamos o produto do primeiro par e a soma do segundo:
A parte relevante do código,
PSƭ€
na verdade, não redefine seu contador para cada par de termos, mas, como são pares, não é necessário.Manipulando todos os pares de termos, temos:
Aqui, a multiplicação é feita, pois não precisamos combinar termos semelhantes. O procedimento final é o Prettyfying.
Primeiro unimos cada par com
"x^"
:Em seguida, ingressamos na lista com
" + "
:Observe como ainda temos números na lista, portanto não é realmente uma string. No entanto, o Jelly possui um processo chamado "stringification", executado no final da execução de um programa para imprimir o resultado. Para uma lista da profundidade 1, ele realmente apenas converte cada elemento em sua representação de string e concatena as strings juntas, para obter a saída desejada:
fonte
JavaScript,
112110 bytesEncontrei duas alternativas com o mesmo comprimento. Ligue com sintaxe de currying:
f(A)(B)
Mostrar snippet de código
Mostrar snippet de código
-2 bytes ( Luis ): remova os espaços ao redor do
split
delimitador.JavaScript, 112 bytes
Usando
String.prototype.matchAll
.Mostrar snippet de código
fonte
split' + ' => split'+'
salvar 2 bytesjoin
.