Diferenciação simbólica 1: ido coefishin '
Tarefa
Escreva um programa que capte um polinômio em x de stdin (1 <deg (p) <128) e o diferencie. O polinômio de entrada será uma sequência do seguinte formato:
"a + bx + cx^2 + dx^3 +" ...
onde o coeficiente de cada termo é um número inteiro (-128 <a <128). Cada termo é separado por um espaço, um + e outro espaço; termos lineares e constantes aparecem como acima (ou seja, não x^0
ou x^1
). Os termos aparecerão em ordem crescente e os poderes com coeficiente zero são omitidos. Todos os termos com coeficiente 1 ou -1 exibem esse coeficiente explicitamente.
Sua saída deve ter exatamente a mesma forma. Observe que os coeficientes na saída podem ser tão grandes quanto 127 * 127 == 16129.
Exemplos
"3 + 1x + 2x^2" ==> "1 + 4x"
"1 + 2x + -3x^2 + 17x^17 + -1x^107" ==> "2 + -6x + 289x^16 + -107x^106"
"17x + 1x^2" ==> "17 + 2x"
Pontuação
Sua pontuação é o comprimento do seu programa em bytes, multiplicado por três, se você usar uma biblioteca interna ou uma que faça álgebra simbólica.
Respostas:
Retina ,
534342414035 bytesPara fins de contagem, cada linha entra em um arquivo separado, mas você pode executar o procedimento acima como um único arquivo, chamando Retina com o
-s
sinalizador.Isso espera que os números na sequência de entrada sejam fornecidos em unário e produzirão a saída no mesmo formato. Por exemplo
ao invés de
Explicação
O código descreve uma única substituição de regex, que é basicamente 4 substituições compactadas em uma. Observe que apenas uma das ramificações preencherá o grupo.
$2
Se alguma das outras três corresponder, a correspondência será simplesmente excluída da sequência. Então, podemos analisar os quatro casos diferentes separadamente:Se é possível alcançar um espaço desde o início da string sem encontrar um,
x
isso significa que o primeiro termo é o termo constante e nós o excluímos. Devido à ganância+
, isso também corresponderá ao mais e ao segundo espaço após o termo constante. Se não houver um termo constante, essa parte simplesmente nunca corresponderá.Isso corresponde a um
x
que é seguido por um espaço, ou seja,x
o termo linear (se existir), e o remove. Podemos ter certeza de que há um espaço depois dele, porque o grau do polinômio é sempre pelo menos 2.Isso realiza a multiplicação do coeficiente pelo expoente. Isso corresponde a um único
1
no coeficiente e o substitui por todo o expoente correspondente por meio do visor.Isso reduz todos os expoentes restantes, correspondendo à direita
1
(garantida pela cabeça de impressão). Se for possível corresponder^11
(e um limite de palavras), removeremos isso, o que cuidará da exibição correta do termo linear.Para a compactação, percebemos que a maioria das condições não se afetam.
(\^1)?
não corresponderá se o lookahead no terceiro caso for verdadeiro, para que possamos colocar esses dois juntos comoAgora já temos a aparência necessária para o segundo caso e os outros nunca podem ser verdadeiros quando combinados
x
, para que possamos simplesmente generalizar o1
para\w
:O primeiro caso realmente não tem nada em comum com os outros, então mantemos em separado.
fonte
CJam,
4341 bytesObrigado a @ jimmy23013 por apontar um bug e jogar fora dois bytes!
Experimente online no intérprete CJam .
Como funciona
fonte
Perl,
6463 bytesCódigo 62b + 1 linha de comando (-p)
Não é incrível no momento, mas vou continuar tentando encurtá-lo.
Exemplo de uso:
Obrigado Denis por -1b
fonte
Julia, 220 bytes
Sem expressões regulares!
Isso cria uma função lambda que aceita uma string e retorna uma string. As entranhas imitam o que acontece quando o código Julia é avaliado: uma string é analisada em símbolos, expressões e chamadas. Na verdade, posso tentar escrever uma função de diferenciação simbólica completa de Julia e enviá-la para fazer parte de Julia.
Ungolfed + explicação:
fonte
C,
204162 bytesAnalise basicamente cada termo e imprima o termo diferenciado em sequência. Bastante direto.
fonte
JavaScript ES6, 108 bytes
Fragmento ES5:
fonte
Python 2, 166 bytes
Rapaz, isso parece mais longo do que deveria ser.
A função
d
pega um termo não constantet
e retorna sua derivada. A razãodef
pela qual a função, em vez de usar um lambda, é para que eu possa atribuir o expoente menos 1 ae
, que é usado mais quatro vezes. A principal coisa chata é ter que passar de um lado para o outro entre strings e ints, embora o operador de backtick do Python 2 o ajude.Em seguida, dividimos a entrada em termos e apelamos
d
a cada uma"x"
delas, eliminando assim o termo constante. Os resultados são reunidos novamente e impressos.fonte
CJam,
62575549 bytesBem, o Dennis envergonhou isso antes que eu percebesse que o site estava de volta. Mas aqui está minha criação de qualquer maneira:
A versão mais recente salva alguns bytes com os atalhos sugeridos por @Dennis (use variáveis e divida no espaço em vez de
+
).Experimente online
fonte
_({'^a\}{;}?
é 1 byte mais longo que:T({T'^a\}&
.~
bloco restante e poderá eliminá-lo também.x
. Eu encontrei mais algumas melhorias enquanto estava nisso. Principalmente, como agora tenho os valores nas variáveis, posso lembrá-los onde realmente preciso deles, economizando alguma manipulação de pilha. Eu também tive um desvioa
que deveria ter sido excluído quando otimizei a geração de saída anteriormente.Pitão, 62 bytes
Solução bastante feia, usando algumas substituições de regex.
fonte
Python 3, 176 bytes
De fato, o principal incômodo é ter que converter entre strings e ints. Além disso, se um termo constante fosse necessário, o código seria apenas 153 bytes.
fonte
Python 2, 229 bytes
fonte
Python 2, 174 bytes
Infelizmente, o truque do DLosc para renomear o método split e executar a diferenciação em uma função específica não reduz o meu código ...
fonte