Cálculo de áreas.

12

El código más pequeño que da el área entre la curva p (x) = a 0 + a 1 * x + a 2 * x 2 + ..., la línea y = 0, la línea x = 0 y la línea x = C

(es decir, algo como esto:

área deseada)

Puede suponer que p (x)> = 0 para x <C (puntos de bonificación si su código funciona para valores negativos de p (x)).

Entrada

C, a 0 , a 1 , ...

Salida

un número real - el área

Ejemplo 1:

input: 2, 0, 1
output: 2.0

Examen 2:

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

ACTUALIZAR:

  • C> 0 también se supone
  • el área está entre la curva, y = 0, x = C yx = 0
  • la entrada puede ser una lista de cualquier forma; no necesariamente separados por comas.
  • la salida puede ser real de cualquier forma (por lo tanto, '18' es una salida válida, al igual que '18 .0 ')
Eelvex
fuente
1
Dado que la respuesta va a ser "infinita" para casi cualquier entrada, creo que ha expresado mal el problema.
Peter Taylor
¿Debería leerse la entrada de la entrada estándar como una cadena separada por comas? ¿O podemos escribir una función que tome una lista de flotantes como argumento?
sepp2k
¿Quieres decir entre x = 0, x = C, y = 0 y la curva?
Keith Randall
2
@Peter: No lo creo. Se muestra una imagen de una inversa (la integral de los cuales se divergen), pero la función que especifica es un polinomio. La integral definida sobre [0, C) debe estar bien definida y ser finita para coeficientes finitos.
dmckee --- ex gatito moderador
1
@dmckee, lo había notado, pero mi punto era más que él estaba integrando un polinomio de - \ infty a C, y para cualquier polinomio no trivial que diverge. La pregunta ahora se ha modificado para solucionar esto.
Peter Taylor

Respuestas:

3

Mathematica: 48 caracteres

.

Sum[#[[i+1]]#[[1]]^i/i,{i,Length@#-1}]&@Input[]
Dr. belisario
fuente
-1 byte: Length@#-> Tr[1^#]. Además, puede omitir @Input[]y hacer una función.
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)))

Es una integración simple de una función polinómica entre 0y C. Y no lo he probado, pero estoy bastante seguro de que funciona para valores negativos.

Juan
fuente
Aprendí algo nuevo sobre input()hoy :)
st0le
3

Haskell, 85 personajes

f(c:l)=sum.map(\(i,x)->x*c**i/i)$zip[1..]l
main=getLine>>=print.f.read.('[':).(++"]")
sepp2k
fuente
1
La pregunta no es tan estricta como la tratas. Definitivamente, podría simplificar el código de entrada y posiblemente eliminar por completo las E / S explícitas.
JB
3

J, 26 caracteres

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

p.ej

   f 2 0 1
2
   f 3 0 0 2
18
Eelvex
fuente
¡Ordenado! No puedo encontrar una manera de hacerlo más tácito. El hecho de d.ser una conjunción no hace que sea muy fácil para mis habilidades de principiante J.
JB
@JB: Sí, eso d. También es un "problema" para mí. :)
Eelvex
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

El código se lee hasta el final de la entrada, no al final de la línea. Por lo tanto, debe presionar Ctrl+ Dpara terminar la entrada. (Canalice la entrada usando echoo desde un archivo).

sepp2k
fuente
1
Creo que la asignación de "" a una variable ayudará ... ¿qué tal esto c=gets(q=",").to_fy $<.each(q){|a|s+=a.to_f*c**(i+=1)/i}, salva una Char ....
st0le
@ st0le: Muy bien. Gracias.
sepp2k
Asignar ","(o ?,, que es aún más corto) a le $/permite omitir el argumento $<.each. Y $<.mapes un personaje más corto que $<.each. ;)
Ventero
2

C GCC 186182 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 proporciona una salida (área) para cualquier curva entre la curva, y = 0, x = C yx = 0. Puede tomar coeficientes ( floattambién) de un 0 a un 48 . La primera entrada aceptada es Cseguida por coeficientes. Presione Ènterdespués del ú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
fuente