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.