Crie um programa que resolva uma expressão matemática usando os elementos de lados alternados da expressão. A maneira como isso é feito é que, em vez de ler da esquerda para a direita, você lê o primeiro caractere, depois o último, depois o segundo, depois o penúltimo, etc. Isso fornecerá uma nova expressão que você deverá avaliar e enviar.
a*b/c+d-e
135798642 <-- Order you read the expression in
ae*-bd/+c <-- Order of operation.
Exemplo:
1*3/2+4-5
15*-34/+2 = -255
Se a expressão não «funcionar», a 1
deve ser inserida nas posições necessárias para fazê-la funcionar.
Alguns exemplos provavelmente o ilustrarão melhor:
Input: 1+1+1+1+1
Result: 23 // Because 1+1+1+1+1 -> 11++11++1 -> 23
Input: 1+2-3+12-5
Result: -19 // Because 1+2-3+12-5 -> 15+-22-13+ -> 15+-22-13+1 -> -19
// |
// Not valid expression
Input: 2*2*2*2*2
Result: 968 // Because 2*2*2*2*2 -> 22**22**2 -> 22*1*22*1*2 -> 968
// || ||
// Not valid, 1 must be inserted
Input: 17/2
Output: 127 // Because 17/2 = 127/ -> 127/1 -> 127
Os operadores que devem ser suportados são + - * /
. Não haverá parênteses. Regras matemáticas normais e "sintaxe" são usadas, portanto, por exemplo **
, não significa exponenciação. a++++1
é equivalente a a+1
(ou seja, estilo MATLAB, não C ++).
Caso haja alguma dúvida, algumas operações válidas são:
-a
+a
a++b
a+-b
a*-b
a*+b
a*++b
a/b
a/-b
a/+b
-a/--b
Embora todos os itens a seguir não sejam válidos. É mostrado com o que eles devem ser substituídos:
a+ | a+1
a- | a-1
a++++ | a++++1 (This is equivalent to a+1)
a*+++ | a*+++1 (This is equivalent to a*1)
a**b | a*1*b
a*/b | a*1/b
a/*b | a/1*b
a* | a*1
*a | 1*a
***a | 1*1*1*a
Regras:
- O código pode ser uma função ou um programa completo
- A entrada pode ser STDIN ou argumento de função
- A entrada deve ser uma expressão matemática válida, sem aspas
''
ou""
. - A saída deve ser a resposta para a nova expressão, como um número inteiro, decimal ou uma fração simplificada.
- Pelo menos três dígitos após o ponto decimal devem ser suportados. Então
1/3 = 0.333
não0.33
.0.333333333
é aceito. ans = ...
é aceito.- Novas linhas e espaços iniciais e finais são aceitos.
- A entrada será apenas números inteiros
- A divisão por zero pode resultar em erro, NaN, Inf etc. A saída de um número não é aceita.
Como sempre, o código mais curto em bytes vence. Um vencedor será selecionado uma semana a partir do dia em que o desafio foi lançado. As respostas postadas mais tarde ainda podem ganhar se forem mais curtas que o líder atual.
fonte
2^64
, e deve ocorrer um erro ou quebra se você passar por cima?0/0
se a expressão for eval para divisão inteira ou módulo por zero?x/0
será uma saída válida. Contanto que não dê uma resposta incorreta, tudo bem. Erro e "Não é um número" são, por definição, corretos, e o infinito é "correto o suficiente",Respostas:
Perl,
108100 bytesO código é de 96 bytes, mais 4 para o argumento da linha de comandos
-pF//
, em que-p
inserçõeswhile (<>) { .. } continue { print }
e-F//
divide a entrada e a coloca@F
.Observe que a entrada não deve ter uma nova linha à direita; portanto, use
/bin/echo -n 'formula' | perl ...
Menos golfe:
Teste
Coloque o acima em um arquivo chamado
114.pl
e o script de teste abaixo em um arquivo próximo a ele:Em execução, ele produz:
Observe que
1/0
causa um erro de divisão por zero: aseval
saídasundef
, representadas pela sequência vazia.fonte
JavaScript ES6, 105
106Editar Salvo 1 byte thx @Kenney
Snippet de teste
fonte
p < '0' ? ( c=='/' | c<'+' || ' ' )+c : c ;
.