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”)

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[]

-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.


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.('[':).(++"]")

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

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.)


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);
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.