Cálculo de áreas.

12

O menor código que fornece a área entre a curva p (x) = a 0 + a 1 * x + a 2 * x 2 + ..., a linha y = 0, a linha x = 0 e a linha x = C

(ou seja, algo como isto:

área desejada)

Você pode assumir que p (x)> = 0 para x <C (pontos de bônus se o seu código funcionar com valores negativos de p (x)).

Entrada

C, a 0 , a 1 , ...

Resultado

um número real - a área

Exemplo 1:

input: 2, 0, 1
output: 2.0

Exemplo 2:

input: 3.0, 0, 0.0, 2
output: 18

ATUALIZAR:

  • C> 0 também é assumido
  • a área está entre a curva, y = 0, x = C ex = 0
  • a entrada pode ser uma lista de qualquer forma; não necessariamente separado por vírgula.
  • a saída pode ser real de qualquer forma (portanto, '18' é uma saída válida, assim como '18 .0 ')
Eelvex
fonte
1
Como a resposta será "infinita" para quase todas as informações, acho que você errou o problema.
31411 Peter
A entrada deve ser lida a partir da entrada padrão como uma sequência separada por vírgula? Ou podemos escrever uma função que usa uma lista de flutuadores como argumento?
sepp2k
Você quer dizer entre x = 0, x = C, y = 0 e a curva?
21411 Keith Randall
2
@ Peter: Eu acho que não. Ele mostra uma imagem de uma inversa (a integral de que iria divergem), mas a função que ele especifica é um polinômio. A integral definida acima de [0, C) deve ser bem definida e finita para coeficientes finitos.
dmckee --- ex-moderador gatinho
1
@dmckee, eu tinha notado isso, mas meu argumento era mais que ele estava integrando um polinômio de - \ infty a C, e para qualquer polinômio não trivial que diverge. A questão foi alterada para corrigir isso.
Peter Taylor

Respostas:

3

Mathematica: 48 caracteres

.

Sum[#[[i+1]]#[[1]]^i/i,{i,Length@#-1}]&@Input[]
Dr. belisarius
fonte
-1 byte: Length@#-> Tr[1^#]. Além disso, você pode omitir @Input[]e criar uma função.
JungHwan Min
5

Python - 71 63 caracteres:

a=input()
print sum(1.*a[i]*a[0]**i/i for i in range(1,len(a)))

É uma integração simples de uma função polinomial entre 0e C. E não testei, mas tenho certeza de que funciona com valores negativos.

Juan
fonte
Algo aprendeu de novo sobre input()hoje :)
st0le
3

Haskell, 85 caracteres

f(c:l)=sum.map(\(i,x)->x*c**i/i)$zip[1..]l
main=getLine>>=print.f.read.('[':).(++"]")
sepp2k
fonte
1
A questão não é tão rigorosa quanto você a trata. Definitivamente, você poderia simplificar o código de entrada e possivelmente acabar com a E / S explícita.
JB
3

J, 26 caracteres

f=:3 :'((1}.y)&p.d._1)0{y'

por exemplo

   f 2 0 1
2
   f 3 0 0 2
18
Eelvex
fonte
Arrumado! Não consigo encontrar uma maneira de torná-lo mais tácito. Ser d.uma conjunção não torna muito fácil minhas habilidades iniciantes em J.
JB
@JB: Sim, isso d. é um "problema" para mim também. :)
Eelvex 12/02
2

Ruby, 65 caracteres

i=s=0
c=gets(q=",").to_f
$<.each(q){|a|s+=a.to_f*c**(i+=1)/i}
p s

O código lê até o final da entrada, não no final da linha. Então você precisa pressionar Ctrl+ Dpara finalizar a entrada. (Insira a entrada usando echoou de um arquivo.)

sepp2k
fonte
1
Eu acho que atribuir o "" a uma variável vai ajudar ... e quanto a isso c=gets(q=",").to_fe $<.each(q){|a|s+=a.to_f*c**(i+=1)/i}, salva um caractere ....
st0le
@ st0le: Muito bom. Obrigado.
sepp2k
Atribuir ","(ou ?,, que é ainda mais curto) a $/permite omitir o argumento $<.each. E $<.mapé um caractere menor que $<.each. ;)
Ventero 12/02
2

C GCC 186 182 bytes

f(){i=0,l=1;float *d,s=0.0;d=malloc(sizeof(float)*50);scanf("%f",&d[0]);while(getchar()!='\n'){scanf("%f",&d[l]);l++;}for(i=0;i<l;i++)s+=d[i+1]*pow(d[0],(i+1))/(i+1);printf("%f",s);}

Este programa fornece uma saída (área) para qualquer curva entre a curva, y = 0, x = C ex = 0. Pode levar coeficientes ( floattambém) de 0 a 48 . A primeira entrada aceita é Cseguida por coeficientes. Pressione Ènterapós o último coeficiente.

void f()
{
  int i=0,l=1;
  float *d,s=0.0;
  const int sz=100;
  d=malloc(sizeof(float)*sz);

  scanf("%f",&d[0]);
  while(getchar()!='\n')
  {
    scanf("%f",&d[l]);
    l++;
  }

  for(i=0;i<l;i++)
    s+=d[i+1]*pow(d[0],(i+1))/(i+1);

   printf("%f",s);
}
Abel Tom
fonte