Adoro programar e conhecer todas as línguas, mas sou péssima em matemática. Infelizmente, minha escola exige que os alunos de informática façam um ano de cálculo. Há um teste na próxima semana e eu não conheço nenhuma das fórmulas para derivativos!
Por favor, ajude-me a encontrar as fórmulas. Preciso de uma cábula - um programa (o mais curto possível para que meu professor não perceba) que recebe uma expressão (como 4*x^3-2
) como entrada e gera a derivada. (Eu não me importo se a entrada e a saída usam argumentos de linha de comando, STDIN, STDOUT ou qualquer outra coisa, pois estou fazendo todo o cálculo na minha cabeça de qualquer maneira.)
O teste abrange os seguintes tipos de funções:
- Constantes, como
-3
ou8.5
- Funções de poder, como
x^0.5
oux^-7
- Funções exponenciais, como
0.5^x
ou7^x
(a base é sempre positiva) - Uma constante multiplicada por uma função, como
3*x^5
ou-0.1*0.3^x
- A soma e a diferença de múltiplas funções, como
-5*x^2+10-3^x
Meu professor sempre formata suas perguntas exatamente da mesma maneira, como mostrado acima. Ele também não usa frações, números como pi ou e , ou números realmente grandes (maiores que 1.000). Ele nunca usa parênteses e sempre mostra multiplicação usando um asterisco ( *
). A única variável usada é sempre x .
Por outro lado, meu professor é bastante tolerante com as respostas. Eles não precisam ser simplificados nem formatados exatamente como mostrado acima, desde que fique claro o que a resposta está dizendo.
Embora eu possa usar qualquer idioma, lembre-se de que não consigo descobrir derivativos sozinho. Portanto, se o programa usar funções internas para lidar com equações ou calcular derivadas, não poderei usá-lo.
Durante o teste, não terei acesso à Internet ou a outros arquivos além do programa na folha de dicas.
Nota: Este cenário é totalmente fictício. Na vida real, trapacear e ajudar os outros a trapacear é errado e nunca deve ser feito.
x
seja sempre a variável a diferenciar?Respostas:
Wolfram
136134109 [Agradecemos a Calle por seu comentário abaixo]Suporte limitado para regras de produtos e cadeias.
Exemplo:
Observe que isso não usa "funções internas para lidar com equações ou calcular derivadas": apenas a correspondência de padrões está envolvida *.
[* Bem ... tecnicamente, o intérprete também analisa e constrói uma espécie de AST a partir da entrada também]
Ungolfed:
fonte
Power
,Times
etc. IDK, o quanto isso melhorará sua versão de golfe, mas você tem pelo menos umaTimes
para poder definir. salve alguns caracteres. Observe também que, na sua versão não destruída, ele dizd[expr_]:= v/...
.Perl - 121
122(+2 para
-p
)Teste:
fonte
Haskell 38 Chars
A função
d
pega uma função e retorna uma função. É introduzido na forma de uma série de potências e produzido da mesma maneira (que é um tipo de qualquer coisa).Por exemplo, se introduzirmos
x->x^2
, obtemosx->2*x
.E para a função exponencial.
fonte
2^x
?4*x^3-2
) como entrada", conforme exigido pelo OP.Prolog 176
Operadores suportados: binário
+
, binário-
, binário*
, binário^
, unário-
. Observe que unário+
não é suportado.Exemplo de execução:
O prólogo fica confuso quando é executado em
^-
sequência. Um espaço deve ser inserido entre^
e-
para analisar a expressão corretamente.Espero que seu professor não se importe com a bagunça da equação.
Tempo louco:
fonte
C, 260
Ei, acho que conheço seu professor! Não é aquele que tem a capacidade sobrenatural de detectar estudantes executando funções de correspondência de padrões de biblioteca em sua cabeça?
Então, usar
sscanf
está fora de questão ... Mas não se preocupe:Exemplos em execução (entrada ativada
stdin
; saída vai parastdout
):Esse formato é muito melhor do que apenas
12*x^2
, porque dessa maneira seu professor pode ter certeza de que você calculou a resposta sozinho e não trapaceou, copiando-a de outra pessoa!A saída tem um pequeno problema de domínio
x=0
, mas está correta em quase todos os lugares !Para referência, aqui está uma versão não-destruída e legível (por meros mortais). Ele usa uma máquina de estados com 5 estados e 5 categorias de caracteres de entrada.
PS Cuidado com essa
gets
função: ela possui uma vulnerabilidade de segurança que pode deixar seu professor executar um rootkit em sua mente, fornecendo informações muito longas ...fonte
Lua
296268263Não muito golfed e atualmente não pode lidar com vários termos (você pode simplesmente executá-lo algumas vezes, certo?), Mas ele pode manipular
n^x
,x^n
en
como entrada.Ungolfed ...
fonte
str.func(str,...)
==str:func(...)
, é por isso cordas obteve o metatable afinal ...l
local. Apenas espere que a entrada seja armazenadaa
e diga que a saída será armazenadal
.a:find("x")
, também nota que1then
só funciona em Lua 5.2()
é opcional. O1then
foi corrigido porque eu não tenho o 5.2 (não fazendo nenhuma atualização da CPU até que a dissertação seja feita porque eu não quero estragar nada).ECMAScript 6, 127 bytes
Aqui está minha tentativa de regex (usando um único regex e alguma lógica no retorno de chamada de substituição):
Isso espera que a string de entrada seja armazenada
i
e simplesmente retorna o resultado. Experimente em um console compatível com ECMAScript 6 (como o Firefox).fonte
sed, 110
Tomando muito literalmente "Eles não precisam ser simplificados ou formatados exatamente como mostrado acima, desde que fique claro o que a resposta está dizendo":
A contagem de bytes inclui 1 para o
r
sinalizador.Ungolfed, com comentários:
Exemplo de execução:
Aposto que isso poderia ser jogado ainda mais; é a minha primeira tentativa
sed
. Diversão!fonte
Ruby, 152
... ou 150, se você não precisar imprimir ... ou 147, se também estiver de acordo com uma matriz que você precisa para se juntar.
correr com
ruby -nal
ungolfed:
Meu principal problema com este é o número de caracteres que a divisão adequada leva. A única outra maneira em que eu conseguia pensar era em
split(/(?<!\^)([-+])/)
dar+
e-
como seus próprios resultados. Alguma dica para uma solução melhor?Além disso, existe uma maneira mais curta de retornar,
s
se não estiver vazio, mas retornary
? Eu já useis[0]?y:s
? Em JS eu apenas farias||y
, mas""
é verdade em Ruby.fonte
split(/(?<!\^)(?=[-+])/)
:?