Este desafio, mas com uma especificação melhor.
Spec
Seu programa utilizará uma equação linear contendo uma única variável x
e produzirá o valor de x
.
Entrada / Análise
- A entrada conterá apenas números, operadores, parênteses (
()
)x
e um=
sinal (isso significa que não há espaço em branco). - Os parênteses sempre serão equilibrados.
- Sempre haverá pelo menos 1
x
. Umx
pode ser precedido por um número. - Todas as equações terão exatamente um resultado.
Um número pode ser definido seguindo estas etapas. Um número pode ser definido pela expressão regular: -?(\d+(\.\d+)?|\.\d+)
.
Se você não fala regex: um dígito é definido como 0-9
- Pode ter um
-
no início significando negativo - Depois, há podem ser alguns dígitos. Se eles não tiverem dígitos, haverá um ponto decimal
- Se existir um ponto decimal, pelo menos um dígito o seguirá
O maior número / valor será definido pelos recursos do seu idioma.
Um operador é um dos seguintes: +-*/
eles sempre aparecerão entre números e ou parênteses
isso significa que (5)(5)
não é uma entrada válida por uma questão de simplicidade.
Os parênteses sempre conterão uma expressão válida (uma combinação válida de números e / ou operadores) dentro deles. Parênteses "equilibrado" é definido, pois todos (
terão um fechamento associado)
Avaliação
- A ordem das operações deve ser seguida e as precedências são (da maior para a menor):
- Parênteses (mais profundamente aninhado primeiro)
- Multiplicação e Divisão
- Adição subtração
- Se ocorrerem dois operadores com a mesma precedência, você deve preferir ir para a esquerda -> direita
Resultado
Você deve produzir o resultado de alguma maneira. Se você não gerar apenas o resultado numérico, esclareça na sua resposta como a saída é gerada. Seu formato de saída deve ser consistente. A saída pode ser decimal, mas sempre será racional, a precisão é limitada à precisão do seu idioma. Somente se seu idioma não suportar aritmética de ponto flutuante, você não precisará suportá-lo.
Regras
- Built-ins trivializando esta tarefa são permitidos , mas você deve adicionar
[uses built-in]
claramente claramente ao cabeçalho da resposta. Isso isenta sua resposta de ganhar - Um "Built-ins trivializando esta tarefa" é um dos seguintes:
- Algo que pega uma equação e gera o valor para uma / a variável
- Algo que simplificará completamente uma equação
- Usando
eval
ou uma função relacionada para realizar uma quantidade significativa da análise. O uso deeval
e funções relacionadas não são permitidas se estiverem acostumadas a (com modificação mínima na entrada) resolver equações lineares. - Em caso de dúvida, basta perguntar em um comentário.
- Built-ins que analisam a equação são permitidos
Exemplos
3+4=x
7
4+x=5
1
3+3*3=x
12
3x-4=7+2x
11
3--1=x
4
3*(2+4x)=7x-4
-2
1.2+2.3x=5.8
2
10=4x
2.5
Entradas INVALID :
(5)(4)=x no operator between (5) and (4)
5(x+3)=2 no operator 5 and (...)
x=y the only variable is x
4=3 there is no x
x+3=x-7 no solution
x=x infinite solutions
+5=x + is not an unary operator. -5=x would be valid though
1/(x-3)=5 Nonlinear
3/x Nonlinear
fonte
eval
conta como trivializando o desafio? Além disso, formas denew Function(...)
contagem?Respostas:
JavaScript ES6, 246 bytes
Ainda há golfe a ser feito, mas pelo menos é uma solução!
Nomeie a função
n=>{n=n.split("=")...
para usá-la.Hyper-ungolfed:
Isso usa uma abordagem dinâmica. (Não tenho certeza se é assim que o algoritmo é chamado, apenas um nome que eu inventei.) Primeiro ele reúne a direção a ser buscada a partir do zero (ou seja, de que maneira as inclinações dos dois lados das equações se cruzam) e procura o valor. Depois de encontrar um ponto de diferença mínima, ele vai para esse ponto e diminui o incremento da pesquisa. Isso acaba gerando a solução mais precisa que precisamos.
fonte
JavaScript (Node.js) ,
10693 bytesExperimente online!
-13 bytes graças a @tsh
Ungolfed:
Explicação:
Esta solução funciona pelo método de Newton para encontrar raízes. O código subtrai o lado direito da equação do lado esquerdo, de tal forma que, quando
f(x)=0
,x
será igual ao valor que estamos resolvendo para. Portanto, quando encontrarmos a raiz dessa nova função, será o nossox
valor desejado . Em seguida, encontra a derivadaf'(x)
encontrando a inclinação entre dois pontos na função. Em seguida, os valores são simplesmente inserido no método de Newton, que indica para uma aproximação da raizx
,x=x-(f(x)/f'(x))
(no código, usamos um 0 como primeirox
valor). Uma vez que isso encontra as raízes, encontra o nossox
valor. E como a equação é garantida como linear, a aproximação será exata.fonte
Mathcad, [usa embutido]
O Mathcad possui dois métodos internos para resolver essas equações:
O solucionador simbólico está bastante satisfeito com y = xe retorna a solução x = y.
Para quem não conhece o Mathcad, a imagem abaixo é tirada diretamente da pasta de trabalho WYSIWYGish Mathcad 15. Alterar qualquer uma das expressões em que estão escritas fará com que o Mathcad reavalie sua resposta e atualize a exibição de acordo.
fonte
Axioma, 214 bytes [usa interno]
Se algum erro retornasse% i, para outros tipos de erros a função é interrompida do sistema, outra coisa como 1--2 parece estar fora do idioma ... test:
fonte