Alanların hesaplanması.


12

P (x) = a 0 + a 1 * x + a 2 * x 2 + ... eğrisi arasındaki alanı veren en küçük kod, y = 0 çizgisi, x = 0 çizgisi ve x = C çizgisi

(yani bunun gibi bir şey:

aranan alan)

X <C için p (x)> = 0 (kodunuz p (x) negatif değerleri için çalışıyorsa bonus puan) olduğunu varsayabilirsiniz.

Giriş

C, bir 0 , bir 1 , ...

Çıktı

gerçek bir sayı - alan

Örnek 1:

input: 2, 0, 1
output: 2.0

İnceleme 2:

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

GÜNCELLEME:

  • C> 0 da varsayılmaktadır
  • alan eğri arasında, y = 0, x = C ve x = 0
  • girdi herhangi bir formun bir listesi olabilir; mutlaka virgülle ayrılmış değil.
  • çıktı herhangi bir biçimde gerçek olabilir (bu nedenle '18', '18 .0 'gibi geçerli bir çıktıdır)

1
Cevap hemen hemen tüm girdiler için "sonsuz" olacağından, sorunu yanlış bulduğunuzu düşünüyorum.
Peter Taylor

Giriş, standart girişten virgülle ayrılmış bir dize olarak okunmalı mıdır? Ya da değişken olarak bir değişken listesi alan bir fonksiyon yazabilir miyiz?
sepp2k

Şunu mu demek istediniz: x = 0, x = C, y = 0 ve eğri?
Keith Randall

2
@Peter: Sanmıyorum. O bir ters (ayrılmaz hangi resmini gösteren ediyorum sapmak), ama o belirten işlevi polinomlarıdır. [0, C) üzerindeki belirli integral sonlu katsayılar için iyi tanımlanmış ve sonlu olmalıdır.
dmckee --- eski moderatör yavru kedi

1
@dmckee, bunu fark etmiştim, ama benim açımdan daha çok - \ infty'den C'ye ve ayrışan önemsiz herhangi bir polinom için bir polinom entegre ediyordu. Soru şimdi bunu düzeltmek için değiştirildi.
Peter Taylor

Yanıtlar:


3

Mathematica: 48 Karakter

.

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

-1 bayt: Length@#-> Tr[1^#]. Ayrıca, atlayabilir @Input[]ve bir işlev yapabilirsiniz.
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)))

0Ve arasında bir polinom fonksiyonunun basit bir entegrasyonu C. Ve test etmedim, ama eminim ki negatif değerler için çalışıyor.


input()Bugün hakkında yeni bir şey öğrendim :)
st0le

3

Haskell, 85 karakter

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

1
Soru, tedavi ettiğiniz kadar katı değil. Giriş kodunu kesinlikle basitleştirebilir ve muhtemelen açık G / Ç ile tamamen ortadan kaldırabilirsiniz.
JB

3

J, 26 karakter

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

Örneğin

   f 2 0 1
2
   f 3 0 0 2
18

Temiz! Daha örtük yapmak için bir yol bulamıyorum. Yani d.bir bağlaç olmak benim acemi J becerileri çok kolay yapmaz.
JB

@JB: Evet, bu d. benim için de bir "sorun". :)
Eelvex

2

Yakut, 65 karakter

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

Kod, satırın sonuna değil, girdinin sonuna kadar okunur. Yani girişi sonlandırmak için Ctrl+ Dtuşuna basmanız gerekir . (Girişi echobir dosyada veya bir dosyadan aktarın.)


1
Ben bir değişkene "," atamak yardımcı olur ... bu konuda nasıl c=gets(q=",").to_fve $<.each(q){|a|s+=a.to_f*c**(i+=1)/i}bir karakter kaydeder ....
st0le

@ st0le: Çok hoş. Teşekkürler.
sepp2k

Bu argümanı atlamanıza izin vermek için atama ","(veya ?,daha da kısa olan) . Ve bir karakter daha kısadır . ;)$/$<.each$<.map$<.each
Ventero

2

C GCC 186 182 bayt

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

Bu program, y = 0, x = C ve x = 0 eğrisi arasındaki herhangi bir eğri için bir çıktı (alan) verir. Bu katsayıları (alabilir floatbir yanı) , 0 a 48 . Kabul edilen ilk girdiyi Ckatsayılar takip eder. ÈnterSon katsayıdan sonra basın .

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);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.