Calcul des surfaces.

12

Le plus petit code qui donne l'aire entre la courbe p (x) = a 0 + a 1 * x + a 2 * x 2 + ..., la ligne y = 0, la ligne x = 0 et la ligne x = C

(c'est-à-dire quelque chose comme ceci:

zone recherchée)

Vous pouvez supposer que p (x)> = 0 pour x <C (points bonus si votre code fonctionne pour des valeurs négatives de p (x)).

Contribution

C, a 0 , a 1 , ...

Production

un vrai nombre - la zone

Exemple 1:

input: 2, 0, 1
output: 2.0

Examen 2:

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

MISE À JOUR:

  • C> 0 est également supposé
  • l'aire est comprise entre la courbe, y = 0, x = C et x = 0
  • l'entrée peut être une liste de n'importe quelle forme; pas nécessairement séparés par des virgules.
  • la sortie peut être un réel de n'importe quelle forme (ainsi, «18» est une sortie valide, tout comme «18 .0»)
Eelvex
la source
1
Puisque la réponse va être «infinie» pour presque toutes les entrées, je pense que vous avez mal exprimé le problème.
Peter Taylor
L'entrée doit-elle être lue à partir de l'entrée standard sous la forme d'une chaîne séparée par des virgules? Ou pouvons-nous écrire une fonction qui prend une liste de flottants comme argument?
sepp2k
Voulez-vous dire entre x = 0, x = C, y = 0 et la courbe?
Keith Randall
2
@Peter: Je ne pense pas. Il montre une image d'une inverse ( dont l'intégrale serait diverger), mais la fonction qu'il spécifie est un polynôme. L'intégrale définie sur [0, C) doit être bien définie et finie pour les coefficients finis.
dmckee --- chaton ex-modérateur
1
@dmckee, je l'avais remarqué, mais mon point de vue était plus qu'il intégrait un polynôme de - \ infty à C, et pour tout polynôme non trivial qui diverge. La question a maintenant été modifiée pour y remédier.
Peter Taylor

Réponses:

3

Mathematica: 48 caractères

.

Sum[#[[i+1]]#[[1]]^i/i,{i,Length@#-1}]&@Input[]
Dr. belisarius
la source
-1 octet: Length@#-> Tr[1^#]. Vous pouvez également omettre @Input[]et créer une fonction.
JungHwan Min
5

Python - 71 63 caractères:

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

Il s'agit d'une simple intégration d'une fonction polynomiale entre 0et C. Et je ne l'ai pas testé, mais je suis sûr que cela fonctionne pour les valeurs négatives.

Juan
la source
input()
J'ai
3

Haskell, 85 caractères

f(c:l)=sum.map(\(i,x)->x*c**i/i)$zip[1..]l
main=getLine>>=print.f.read.('[':).(++"]")
sepp2k
la source
1
La question n'est pas aussi stricte que vous la traitez. Vous pourriez certainement simplifier le code d'entrée et éventuellement supprimer complètement les E / S explicites.
JB
3

J, 26 caractères

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

par exemple

   f 2 0 1
2
   f 3 0 0 2
18
Eelvex
la source
Soigné! Je ne peux pas trouver un moyen de le rendre plus tacite. Cela d.étant une conjonction ne rend pas très facile mes compétences novices en J.
JB
@JB: Oui, cela d. est un "problème" pour moi aussi. :)
Eelvex
2

Rubis, 65 caractères

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

Le code lit jusqu'à la fin de l'entrée, pas la fin de la ligne. Vous devez donc appuyer sur Ctrl+ Dpour terminer la saisie. (Dirigez l'entrée en utilisant echoou à partir d'un fichier.)

sepp2k
la source
1
je pense que l'attribution du "," à une variable aidera ... que diriez-vous de cela c=gets(q=",").to_fet $<.each(q){|a|s+=a.to_f*c**(i+=1)/i}, enregistre un caractère ....
st0le
@ st0le: Très bien. Merci.
sepp2k
L'affectation ","(ou ?,, qui est encore plus courte) à $/vous permet d'omettre l'argument de $<.each. Et $<.mapest un caractère plus court que $<.each. ;)
Ventero
2

C GCC 186 182 octets

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);}

Ce programme donne une sortie (surface) pour toute courbe entre la courbe, y = 0, x = C et x = 0. Il peut également prendre des coefficients floatde 0 à 48 . La première entrée acceptée est Csuivie de coefficients. Appuyez sur Ènteraprès le dernier coefficient.

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
la source