As somas de Riemann esquerda e direita são aproximações para integrais definidas . Obviamente, em matemática, precisamos ser muito precisos; portanto, pretendemos calculá-las com várias subdivisões que se aproximam do infinito, mas isso não é necessário para os propósitos deste desafio. Em vez disso, você deve tentar escrever o programa mais curto, obtendo entrada e fornecendo saída através de qualquer um dos métodos padrão , em qualquer linguagem de programação , que faz o seguinte:
Tarefa
Dados dois números racionais e (os limites da integral definido), um número inteiro positivo , um booleano representando esquerda / para a direita e uma função de caixa preta , calcular a soma de Riemann esquerda ou para a direita (dependendo ) de , usando subdivisões iguais .
Especificações de E / S
e podem ser números / de ponto flutuante racional ou fracções.
pode ser representado por dois valores distintos e consistentes, mas lembre-se de quevocê não tem permissãopara assumir funções completas ou parciais como entrada.
é uma função de caixa preta. Citando a resposta da meta acima,o conteúdo (ou seja, o código) das funções da caixa preta pode não ser acessado, você pode chamá-las apenas (passar argumentos, se aplicável) e observar sua saída. Se necessário, inclua as informações necessárias sobre a sintaxe usada pelo seu idioma para que possamos testar seu envio.
Como saída, você deve fornecer uma fração / ponto flutuante / racional que representa a soma de Riemann solicitada. Como discutido no passado , a imprecisão de ponto flutuante pode ser ignorada, desde que sua saída seja precisa com pelo menos três casas decimais quando arredondada para o múltiplo mais próximo de 1/1000 (por exemplo, 1.4529999
é bom em vez de 1.453
).
Especificações matemáticas
é a garantia de ser contínua entre e (sem saltos, sem furos, não há asymptotes verticais).
Há três casos possíveis com os quais você deve lidar: (O resultado deve ser ou equivalente), ou .
Se , a integral altera seu sinal. Além disso, o sentido correto da integral, neste caso, é no sentido de .
As áreas abaixo do gráfico são negativas e as acima do gráfico são positivas.
Exemplos / Casos de Teste
A resolução não é ótima, porque eu tive que reduzi-los um pouco, mas eles ainda são legíveis.
f(x) = x * sin(1 / x); a = 0; b = 1; n = 50; k = right — Output: 0.385723952885505. Note that sine uses radians here, but feel free to use degrees instead.
Agora que f (x) é uma caixa preta, por que isso importa?Respostas:
R ,
69656357 bytesExperimente online!
Aceita
k=FALSE
somas à direita, embora o link TIO agora inclua aliases para "esquerda" e "direita" para facilitar o uso.a+w*(1:n-k)
gera pontos adequados à esquerda ou à direita.Em seguida,
sapply
aplicaf
- se a cada elemento do resultado, quesum
aumentamos e multiplicamos pela largura do intervalo(b-a)/n
para produzir o resultado. Este último também cuida de qualquer problema de sinal que possamos ter.fonte
SNOBOL4 (CSNOBOL4) , 127 bytes
Experimente online!
Supondo que a função
p
esteja definida em algum lugar, isso levaa,b,n,k,(name of p)
, comk=0
para a direita el=1
para a esquerda.O catspaw's
SNOBOL4+
suportaREAL
s, mas não possui funções trigonométricas embutidas. No entanto, suponho que alguém possa ter umasin
função razoável usando uma série de taylor.Não tenho 100% de certeza de que essa é a maneira "correta" de passar uma função de caixa preta no SNOBOL (que, a meu conhecimento, não possui funções de primeira classe), mas me parece razoável.
Suponho que assumindo que a função seja definida como
f
menor, pois a linhal
pode sermas não é passado como argumento, que parece um pouco como "trapaça".
Observe que o link TIO possui uma instrução
:(e)
afterDEFINE
, que é para que o código realmente seja executado corretamente.fonte
Julia 0,6 , 50 bytes
Experimente online!
Um intervalo normalizado é construído, coletado em um vetor e depois escalado. A coleta do intervalo em um vetor usando
[X...]
é necessária para evitar ainexact error
multiplicação do intervalo diretamente por 0 quandoa=b
. Da mesma forma, construir um intervalo diretamente com:
ourange()
não é possível quandoa=b
.O uso de k é muito semelhante à solução de Guiseppe , com
k=1
forright
ek=0
forleft
.fonte
f.
vetorizaf
seus argumentos?f.
é a aplicação elemento a elemento def
.Haskell ,
7367 bytesObrigado a H.PWiz e Bruce Forte pelas dicas!
Experimente online!
Solução bastante simples.
k
é0
para a esquerda e1
para a direita.fonte
b
Python 2 ,
9994 bytesUm pouco de uma solução ingênua.
Experimente online!
fonte
JavaScript (Node.js) ,
737159 bytesExperimente online!
fonte
Geléia , 21 bytes
Experimente online!
Retire
a,b
dos argumentos ede stdin.
Se você não conhece o Jelly, pode usar o Python para escrever a função de caixa preta
f
:f (x) = 2x + 1 ; a = 5; b = 13; n = 4; k = direita
f (x) = √x ; a = 1; b = 2,5; n = 3; k = esquerda
f (x) = -3x + 4 + 1/5 * x 2 ; a = 12,5; b = 2,5; n = 10; k = direita
f (x) = 9 - 4x + 2/7 * x 2 ; a = 0; b = 15; n = 3; k = esquerda
f (x) = 6 ; a = 1; b = 4; n = 2; k = direita
f (x) = x * sen (1 / x) ; a = 0; b = 1; n = 50; k = direita
Explicação:
fonte
Perl 6 , 65 bytes
Experimente online!
Relativamente simples. A única complicação está a tratar do
a > b
caso, o que eu faço por xor-ing a bandeira de entrada$^k
com0 > d
, o que inverte quandoa > b
.fonte
APL (Dyalog Classic) , 37 bytes
Experimente online!
APL NARS, 37 caracteres
A função tem o argumento à esquerda da função, no argumento numérico à direita abn k. Na questão k = deixada aqui, significa k = ¯1; k = aqui significa k = 0. Teste:
fonte