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»)

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[]

-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.


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.('[':).(++"]")

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

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.)


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);
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.