Menghitung area.

12

Kode terkecil yang memberikan area antara kurva p (x) = a 0 + a 1 * x + a 2 * x 2 + ..., garis y = 0, garis x = 0 dan garis x = C

(Yaitu sesuatu seperti ini:

daerah yang diinginkan)

Anda dapat mengasumsikan bahwa p (x)> = 0 untuk x <C (poin bonus jika kode Anda bekerja untuk nilai negatif dari p (x)).

Memasukkan

C, a 0 , a 1 , ...

Keluaran

bilangan real - area

Contoh 1:

input: 2, 0, 1
output: 2.0

Examlpe 2:

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

MEMPERBARUI:

  • C> 0 juga diasumsikan
  • area berada di antara kurva, y = 0, x = C dan x = 0
  • input dapat berupa daftar bentuk apa pun; belum tentu koma dipisahkan.
  • output dapat berupa bentuk nyata apa pun (dengan demikian, '18' adalah output yang valid, seperti '18 .0 ')
Eelvex
sumber
1
Karena jawabannya akan "tak terbatas" untuk hampir semua masukan, saya pikir Anda salah menuliskan masalahnya.
Peter Taylor
Haruskah input dibaca dari input standar sebagai string yang dipisahkan koma? Atau bisakah kita menulis fungsi yang mengambil daftar float sebagai argumen?
sepp2k
Maksud Anda antara x = 0, x = C, y = 0, dan kurva?
Keith Randall
2
@ Peter: Saya kira tidak. Dia menunjukkan gambar invers (integral yang akan berbeda), tetapi fungsi yang dia tentukan adalah polinomial. Integral pasti atas [0, C) harus didefinisikan dengan baik dan terbatas untuk koefisien hingga.
dmckee --- ex-moderator kitten
1
@ Dmckee, saya telah memperhatikan hal itu, tetapi poin saya lebih dari itu bahwa ia mengintegrasikan polinomial dari - \ infty ke C, dan untuk polinomial non-sepele yang menyimpang. Pertanyaannya sekarang telah diubah untuk memperbaikinya.
Peter Taylor

Jawaban:

3

Mathematica: 48 Karakter

.

Sum[#[[i+1]]#[[1]]^i/i,{i,Length@#-1}]&@Input[]
Belisarius
sumber
-1 byte: Length@#-> Tr[1^#]. Anda juga dapat menghilangkan @Input[]dan membuat suatu fungsi.
JungHwan Min
5

Python - 71 63 karakter:

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

Ini adalah integrasi sederhana dari fungsi polinomial antara 0dan C. Dan saya belum mengujinya, tapi saya cukup yakin itu bekerja untuk nilai negatif.

Juan
sumber
Belajar sesuatu yang baru tentang input()hari ini :)
st0le
3

Haskell, 85 karakter

f(c:l)=sum.map(\(i,x)->x*c**i/i)$zip[1..]l
main=getLine>>=print.f.read.('[':).(++"]")
sepp2k
sumber
1
Pertanyaannya tidak seketat seperti Anda memperlakukannya. Anda pasti bisa menyederhanakan kode input, dan mungkin menghapus I / O secara eksplisit.
JB
3

J, 26 karakter

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

misalnya

   f 2 0 1
2
   f 3 0 0 2
18
Eelvex
sumber
Rapi! Saya tidak dapat menemukan cara untuk membuatnya lebih diam-diam. Yang d.menjadi konjungsi tidak membuatnya sangat mudah untuk keterampilan J pemula saya.
JB
@ JK: Ya, itu d. adalah "masalah" bagi saya juga. :)
Eelvex
2

Ruby, 65 karakter

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

Kode membaca hingga akhir input, bukan akhir baris. Jadi, Anda perlu menekan Ctrl+ Duntuk menghentikan input. (Pipa input dengan menggunakan echoatau dari file.)

sepp2k
sumber
1
saya pikir menugaskan "," ke variabel akan membantu ... bagaimana dengan ini c=gets(q=",").to_fdan $<.each(q){|a|s+=a.to_f*c**(i+=1)/i}, menyimpan satu char ....
st0le
@ st0le: Bagus sekali. Terima kasih.
sepp2k
Menetapkan ","(atau ?,, yang bahkan lebih pendek) untuk $/memungkinkan Anda menghilangkan argumen $<.each. Dan $<.mapsatu karakter lebih pendek dari $<.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);}

Program ini memberikan output (area) untuk setiap kurva antara kurva, y = 0, x = C dan x = 0. Itu dapat mengambil koefisien ( floatjuga) dari 0 hingga 48 . Input yang diterima pertama Cdiikuti oleh koefisien. Tekan Èntersetelah koefisien terakhir.

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
sumber