Obliczanie obszarów

12

Najmniejszy kod, który podaje pole między krzywą p (x) = a 0 + a 1 * x + a 2 * x 2 + ..., linia y = 0, linia x = 0 i linia x = C

(tj. coś takiego:

poszukiwany obszar)

Możesz założyć, że p (x)> = 0 dla x <C (punkty bonusowe, jeśli twój kod działa dla ujemnych wartości p (x)).

Wejście

C, 0 , a 1 , ...

Wynik

liczba rzeczywista - obszar

Przykład 1:

input: 2, 0, 1
output: 2.0

Przykład 2:

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

AKTUALIZACJA:

  • Zakłada się również C> 0
  • obszar znajduje się między krzywą, y = 0, x = C i x = 0
  • wejściem może być lista dowolnej postaci; niekoniecznie oddzielone przecinkami.
  • dane wyjściowe mogą być dowolnymi postaciami (dlatego „18” jest prawidłowym wynikiem, podobnie jak „18,0”)
Eelvex
źródło
1
Ponieważ odpowiedź będzie „nieskończona” dla prawie każdego wkładu, myślę, że źle zrozumiałeś problem.
Peter Taylor
Czy wejście należy czytać ze standardowego wejścia jako ciąg oddzielony przecinkami? Czy możemy napisać funkcję, która jako argument przyjmuje listę liczb zmiennoprzecinkowych?
sepp2k
Czy masz na myśli między x = 0, x = C, y = 0, a krzywą?
Keith Randall,
2
@Peter: Nie wydaje mi się. Pokazuje obraz odwrotności (której całka byłaby rozbieżna), ale funkcja, którą określa, jest wielomianem. Całka oznaczona przez [0, C) powinna być dobrze zdefiniowana i skończona dla współczynników skończonych.
dmckee --- były moderator kociak
1
@dmckee, zauważyłem to, ale chodziło mi o to, że integrował wielomian od - \ infty do C i dla każdego nietrywialnego wielomianu, który się rozbiera. Pytanie zostało teraz zmienione, aby to naprawić.
Peter Taylor,

Odpowiedzi:

3

Mathematica: 48 znaków

.

Sum[#[[i+1]]#[[1]]^i/i,{i,Length@#-1}]&@Input[]
Dr Belizariusz
źródło
-1 bajt: Length@#-> Tr[1^#]. Możesz także pominąć @Input[]i wykonać funkcję.
JungHwan Min
5

Python - 71 63 znaków:

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

Jest to prosta integracja funkcji wielomianu pomiędzy 0i C. I nie testowałem tego, ale jestem całkiem pewien, że działa na wartości ujemne.

Juan
źródło
Nauczyłem się input()dziś czegoś nowego :)
st0le
3

Haskell, 85 znaków

f(c:l)=sum.map(\(i,x)->x*c**i/i)$zip[1..]l
main=getLine>>=print.f.read.('[':).(++"]")
sepp2k
źródło
1
Pytanie nie jest tak surowe, jak je traktujesz. Zdecydowanie można uprościć kod wejściowy i całkowicie zrezygnować z jawnych operacji we / wy.
JB
3

J, 26 znaków

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

na przykład

   f 2 0 1
2
   f 3 0 0 2
18
Eelvex
źródło
Schludny! Nie mogę znaleźć sposobu, aby uczynić to bardziej milczącym. To d.bycie koniunkcją nie bardzo ułatwia moim początkującym umiejętnościom J.
JB
@JB: Tak, że d. to również „problem” dla mnie. :)
Eelvex
2

Ruby, 65 znaków

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

Kod czyta do końca wejścia, a nie do końca wiersza. Musisz więc nacisnąć Ctrl+, Daby zakończyć wprowadzanie. (Wprowadź dane wejściowe za pomocą echolub z pliku.)

sepp2k
źródło
1
myślę, że przypisanie zmiennej „,” pomoże ... co powiesz na to c=gets(q=",").to_fi $<.each(q){|a|s+=a.to_f*c**(i+=1)/i}zaoszczędzi jeden znak ....
st0le
@ st0le: Bardzo miło. Dzięki.
sepp2k
Przypisanie ","(lub ?,, co jest jeszcze krótsze), $/pozwala pominąć argument $<.each. I $<.mapjest jedną postacią krótszą niż $<.each. ;)
Ventero,
2

C GCC 186 182 bajtów

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

Ten program podaje dane wyjściowe (pole) dla dowolnej krzywej między krzywą, y = 0, x = C i x = 0. Może przyjmować także współczynniki floatod 0 do 48 . Po pierwszym zaakceptowanym wejściu Cnastępują współczynniki. Naciśnij Ènterpo ostatnim współczynniku.

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
źródło