Problema
Eu tenho um GRANDE programa novo que mudará a maneira como pensamos em matemática na computação, absorvendo cadeias de funções algébricas e fazendo coisas INCRÍVEIS com elas! O único problema é que sou capaz de analisar álgebra específica, caso contrário o universo se dobra em si mesmo, o que é ruim. Felizmente, só preciso de algumas operações básicas na entrada deste incrível novo programa, mas ainda preciso expandi-la!
Regras
Uma resposta deve ser capaz de simplificar as seguintes expressões
2+2
deve reduzir a4
(5+x)+6
deve reduzir ax+11
(x+2)^2
deve reduzir ax^2+4*x+4
(x-5)*(3+7*x)
deve reduzir a7*x^2-32*x-15
5*x+9*x
deve reduzir a14*x
(2*x^2)*x^3
deve reduzir a2*x^5
As respostas devem poder COMPLETAMENTE remover parênteses, o que implica que toda a distribuição deve ocorrer.
As respostas devem poder lidar com todos os seguintes operadores e tokens padrão:
+
(A função de adição)-
(A função de subtração)*
(A função de multiplicação)(
(O parêntese esquerdo, usado para indicar um grupo))
(O parêntese direito, usado para indicar o final do último grupo iniciado)x
(A variável padrão)[0-9]+
(números literais não negativos)
As respostas devem ser capazes de, pelo menos, quadrado, usando a notação expr ^ 2, incluindo (expr) ^ 2 recursivamente, pois (expr) é uma expressão;)
Uma solução deve estar em uma notação de infixo padrão, nenhum dos absurdos da RPN!
Nenhuma biblioteca funciona como a do Mathematica
Simplify
para fazer isso por você.A solução deve ser uma função que recebe um único argumento e retorna a versão expandida
Como se trata de código-golfe, a resposta com o menor número de pressionamentos (chave) vence, 1 semana a partir do OP.
Notas
Não há espaços neste mundo da matemática, é claro! Apenas parênteses.
Portanto, nenhuma divisão é necessária para salvar da fatoração
A ordem padrão de operações se aplica.
Estou ciente de que parte do que estou pedindo é simplificação (por exemplo 2+2=4
), onde outras partes são realmente o oposto, como expandir (x+1)^2
para ser x^2+2x+1
. Isso é intencional. :)
-25 golpes para uma solução que pode fazer (expr) ^ n em vez de apenas (expr) ^ 2
-15 traçados para uma solução capaz de avaliar a multiplicação justaposta, como 4x+5x
== 9x
ou 4(x+1)
=4x+4
-5 traços para uma solução capaz de lidar com várias variáveis (uma variável sendo exatamente um caractere do alfabeto em minúsculas)
-5 golpes para uma solução capaz de remover os 0s iniciais ( 007
apenas 7
[hoje não, Bond!] [Caramba, agora sinto que estou escrevendo o Lisp])
Respostas:
J - 350 char - 25 = 325 pts
Perdoe-me, Roger Hui, porque pequei.
A monstruosidade acima define um número de variáveis, das quais a variável
f
é uma função que satisfaz as restrições da pergunta acima. Eu reivindico o bônus "expr ^ n" por 25 pontos.Aqui está o golfe em ação no J REPL.
Aqui está a essência do que está acontecendo.
'()'...@([-.~;@]<@(p^:(1<#));.1~1,0=2*/\[:+/\(*0,}:@)1 _1 0{~i.)&;:
- Divida recursivamente a expressão com base em suas subexpressões entre parênteses e avalie-as (o...
bit a ser descrito abaixo) à medida que estiverem prontas.;:
executa a tokenização.(([^:(''-:])". ::])&.>)
- Avalie átomos. Se o átomo for numérico, ele será transformado em um número escalar. Se o átomo é um operador, ele é deixado como está. Se o átomo for a variávelx
, ele será transformado no vetor0 1
. (É por isso que definimosx=:0 1
no início.) Em geral, armazenamos o polinômioa*x^n + b*x^(n-1) + ... + c*x + d
como an+1
lista -itemd c ... b a
.e=:2 :'(<@; ::({:u/&.>{.)/.~i.@#([->+>:){.@i.&(<,v))^:_'
- Essa curiosa conjunção leva um verbo à esquerda e um caractere à direita. Ele encontra a primeira instância desse caractere em sua entrada tokenizada e sem parêntesis, avalia-o com os argumentos ao seu redor e repete até que não haja mais caracteres a serem encontrados. Assim, simplificamos iterativamente a expressão, com a ordem das operações controlada pela ordem de aplicação dee
.rplc
é uma função de biblioteca padrão para substituição de substring. Podemos salvar outros três caracteres se for permitido colocar os termos de grau mais baixo primeiro, em vez dos mais altos, removendo o@|.
.Sinceramente, não tenho certeza se posso extrair mais personagens deste golfe. Não consigo pensar em nenhuma outra abordagem que não exija uma quantidade semelhante de excesso de engenharia, mas isso não significa que não exista. De qualquer forma, tenho certeza de que espremi todos os personagens óbvios desta versão.
fonte
-
token é anotado apenas como a função de subtração. :)(2*x+3)^(2+3)*2^3
deve dar256x^5+1920x^4+5760x^3+8640x^2+6480x+1944
ou estou faltando alguma coisa?JavaScript (EcmaScript 6) 698 (bônus 748-50)
725 780 1951Para ser jogado golfe. Mas tenho orgulho de que funcione.(Edit: correção de bug, problemas com colchetes e menos)
(Edit2: jogou mais, bug corrigido na saída)
(Edit3: jogou mais uma vez, última vez que prometo)
Comente
Basicamente, a função X é uma calculadora de infix que opera em polinômios literais.
Cada polinômio é armazenado como um objeto js, sendo a chave o termo (x ^ 3y ^ 2) e o valor o coeficiente numérico. As funções A, M e E são soma, multiplicação e expoente.
Código de golfe
(Provavelmente não pode ser jogado golfe mais ...) Nota: sem contar novas linhas adicionadas para (ehm ...) legibilidade
Teste no console do FireFox
Resultado
Bônus
Código Ungolfed
fonte
for(i1,i2,i3; c1,c2; s1,s2,s3)
. Eu tenho apenas um ponto e vírgula no campo golfed para fechar uma instrução dentro de um for (função O). Por que vírgulas? dois stamenents devem ser agrupados com {} enquanto duas ou mais expressões podem ser simplesmente listadas.Matemática: 56 - 25 - 15 - 5 - 5 = 6
É claro que nenhuma biblioteca funciona como
Expand
ouDistribute
apenas substituição de padrões. O Mathematica faz quase tudo por nós (hax!), O que resta são apenas regras para distribuição e expansão de energia. Os únicos exemplos não triviais, portanto, são(x-5)*(3+7*x)
e(x+2)^2
.Exemplos
fonte