Flächen berechnen.

12

Der kleinste Code, der die Fläche zwischen der Kurve p (x) = a 0 + a 1 * x + a 2 * x 2 + ..., der Linie y = 0, der Linie x = 0 und der Linie x = C angibt

(dh so ähnlich:

gesuchter Bereich)

Sie können annehmen, dass p (x)> = 0 für x <C (Bonuspunkte, wenn Ihr Code für negative Werte von p (x) funktioniert).

Eingang

C, a 0 , a 1 , ...

Ausgabe

eine reelle Zahl - der Bereich

Beispiel 1:

input: 2, 0, 1
output: 2.0

Beispiel 2:

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

AKTUALISIEREN:

  • C> 0 wird ebenfalls angenommen
  • Die Fläche liegt zwischen der Kurve, y = 0, x = C und x = 0
  • Die Eingabe kann eine Liste beliebiger Form sein. nicht unbedingt durch Kommas getrennt.
  • Die Ausgabe kann ein Real jeder Form sein (daher ist '18' eine gültige Ausgabe, ebenso wie '18 .0').
Eelvex
quelle
1
Da die Antwort für fast alle Eingaben "unendlich" sein wird, haben Sie das Problem vermutlich falsch angegeben.
Peter Taylor
Soll die Eingabe von der Standardeingabe als durch Kommas getrennte Zeichenfolge gelesen werden? Oder können wir eine Funktion schreiben, die eine Liste von Gleitkommazahlen als Argument verwendet?
3.
Meinen Sie zwischen x = 0, x = C, y = 0 und der Kurve?
Keith Randall
2
@ Peter: Das glaube ich nicht. Er zeigt ein Bild einer Inversen (deren Integral divergieren würde ), aber die Funktion, die er angibt, ist ein Polynom. Das bestimmte Integral über [0, C) sollte für endliche Koeffizienten gut definiert und endlich sein.
dmckee --- Ex-Moderator Kätzchen
1
@dmckee, das hatte ich bemerkt, aber mein Punkt war eher, dass er ein Polynom von - \ infty nach C integriert und für jedes nicht-triviale Polynom, das divergiert. Die Frage wurde nun geändert, um dies zu beheben.
Peter Taylor

Antworten:

3

Mathematica: 48 Zeichen

.

Sum[#[[i+1]]#[[1]]^i/i,{i,Length@#-1}]&@Input[]
Dr. belisarius
quelle
-1 Byte: Length@#-> Tr[1^#]. Sie können @Input[]auch eine Funktion weglassen und ausführen.
JungHwan Min
5

Python - 71 63 Zeichen:

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

Es ist eine einfache Integration einer Polynomfunktion zwischen 0und C. Und ich habe es nicht getestet, aber ich bin mir ziemlich sicher, dass es für negative Werte funktioniert.

Juan
quelle
input()Heute etwas Neues gelernt :)
st0le
3

Haskell, 85 Zeichen

f(c:l)=sum.map(\(i,x)->x*c**i/i)$zip[1..]l
main=getLine>>=print.f.read.('[':).(++"]")
sepp2k
quelle
1
Die Frage ist nicht so streng, wie Sie es behandeln. Sie könnten den Eingabecode definitiv vereinfachen und möglicherweise die explizite E / A ganz beseitigen.
JB
3

J, 26 Zeichen

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

z.B

   f 2 0 1
2
   f 3 0 0 2
18
Eelvex
quelle
Ordentlich! Ich kann keinen Weg finden, es stiller zu machen. Das d.ist eine Konjunktion, die es meinen Anfängern nicht leicht macht, sich mit J zu beschäftigen.
JB
@JB: Ja, das d. ist auch für mich ein "Problem". :)
Eelvex
2

Rubin, 65 Zeichen

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

Der Code liest bis zum Ende der Eingabe, nicht bis zum Ende der Zeile. Sie müssen also Ctrl+ Ddrücken, um die Eingabe zu beenden. (Pipe die Eingabe mit echooder aus einer Datei.)

sepp2k
quelle
1
Ich denke, die Zuweisung des "," zu einer Variablen wird helfen ... wie wäre es damit c=gets(q=",").to_fund $<.each(q){|a|s+=a.to_f*c**(i+=1)/i}spart ein
Zeichen
@ st0le: Sehr nett. Vielen Dank.
4.
Wenn Sie ","(oder ?,, was noch kürzer ist) zuweisen , $/können Sie das Argument für weglassen $<.each. Und $<.mapist ein Zeichen kürzer als $<.each. ;)
Ventero
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);}

Dieses Programm gibt eine Ausgabe (Fläche) für jede Kurve zwischen der Kurve, y = 0, x = C und x = 0. Es können ( floatauch) Koeffizienten von 0 bis 48 verwendet werden . Nach der ersten akzeptierten Eingabe Cfolgen die Koeffizienten. Drücken Sie Ènternach dem letzten Koeffizienten.

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
quelle