Calcolo delle aree.


12

Il codice più piccolo che indica l'area tra la curva p (x) = a 0 + a 1 * x + a 2 * x 2 + ..., la linea y = 0, la linea x = 0 e la linea x = C

(cioè qualcosa del genere:

area desiderata)

Puoi supporre che p (x)> = 0 per x <C (punti bonus se il tuo codice funziona con valori negativi di p (x)).

Ingresso

C, a 0 , a 1 , ...

Produzione

un numero reale: l'area

Esempio 1:

input: 2, 0, 1
output: 2.0

Esempio 2:

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

AGGIORNARE:

  • Si presuppone anche C> 0
  • l'area è compresa tra la curva, y = 0, x = C e x = 0
  • l'input può essere un elenco di qualsiasi forma; non necessariamente separati da virgola.
  • l'output può essere reale di qualsiasi forma (quindi, '18' è un output valido, come lo è '18 .0 ')

1
Poiché la risposta sarà "infinita" per quasi tutti gli input, penso che tu abbia frainteso il problema.
— Peter Taylor,

L'input deve essere letto dall'input standard come una stringa separata da virgola? Oppure possiamo scrivere una funzione che prende un elenco di float come argomento?
— sepp2k,

Intendi tra x = 0, x = C, y = 0 e la curva?
— Keith Randall,

2
@Peter: io non la penso così. Egli mostra una foto di un inverso (l'integrale delle quali sarebbe divergere), ma la funzione che specifica è un polinomio. L'integrale definito su [0, C) deve essere ben definito e finito per i coefficienti finiti.
— dmckee --- ex gattino moderatore

1
@dmckee, l'avevo notato, ma il mio punto era più che stava integrando un polinomio da - \ infty a C, e per qualsiasi polinomio non banale che divergesse. La domanda è stata ora modificata per risolvere questo problema.
— Peter Taylor,

Risposte:


3

Mathematica: 48 caratteri

.

Sum[#[[i+1]]#[[1]]^i/i,{i,Length@#-1}]&@Input[]

-1 byte: Length@#-> Tr[1^#]. Inoltre, potresti omettere @Input[]e creare una funzione.
— JungHwan Min

5

Python - 71 63 caratteri:

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

È una semplice integrazione di una funzione polinomiale tra 0e C. E non l'ho provato, ma sono abbastanza sicuro che funzioni con valori negativi.


input()Oggi
— ho

3

Haskell, 85 caratteri

f(c:l)=sum.map(\(i,x)->x*c**i/i)$zip[1..]l
main=getLine>>=print.f.read.('[':).(++"]")

1
La domanda non è così severa come la tratti. Potresti sicuramente semplificare il codice di input e forse eliminare completamente l'I / O esplicito.
— JB

3

J, 26 caratteri

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

per esempio

   f 2 0 1
2
   f 3 0 0 2
18

! Neat Non riesco a trovare un modo per renderlo più tacito. Il fatto di d.essere una congiunzione non rende molto facile per le mie abilità di novizio J.
— JB

@JB: Sì, quello d. è un "problema" anche per me. :)
— Eelvex,

2

Rubino, 65 caratteri

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

Il codice legge fino alla fine dell'input, non alla fine della riga. Quindi devi premere Ctrl+ Dper terminare l'input. (Installa l'input usando echoo da un file.)


1
penso che assegnare "," a una variabile aiuterà ... che ne dici di questo c=gets(q=",").to_fe $<.each(q){|a|s+=a.to_f*c**(i+=1)/i}, salva un carattere ....
— st0le

@ st0le: molto bello. Grazie.
— sepp2k,

Assegnare ","(o ?,, che è ancora più breve) per $/consentire di omettere l'argomento $<.each. Ed $<.mapè un personaggio più corto di $<.each. ;)
— Ventero,

2

C GCC 186 182 byte

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

Questo programma fornisce un output (area) per qualsiasi curva tra la curva, y = 0, x = C e x = 0. Può prendere coefficienti ( floatpure) da 0 a 48 . Il primo input accettato è Cseguito da coefficienti. Premere Ènterdopo l'ultimo coefficiente.

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);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.