Розрахунок площ.


12

Найменший код, який дає площу між кривою p (x) = a 0 + a 1 * x + a 2 * x 2 + ..., прямою y = 0, прямою x = 0 і прямою x = C

(тобто щось подібне:

розшукова область)

Можна припустити, що p (x)> = 0 для x <C (бонусні бали, якщо ваш код працює на негативних значеннях p (x)).

Вхідні дані

C, a 0 , a 1 , ...

Вихідні дані

реальна кількість - площа

Приклад 1:

input: 2, 0, 1
output: 2.0

Приклад 2:

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

ОНОВЛЕННЯ:

  • С> 0 також передбачається
  • площа знаходиться між кривою, y = 0, x = C і x = 0
  • вхід може бути списком будь-якої форми; не обов'язково розділяються комами.
  • вихід може бути реальним у будь-якій формі (таким чином, "18" є дійсним результатом, як і "18 .0")

1
Оскільки відповідь буде майже нескінченною майже для будь-якого вкладу, я думаю, ви помилилися з проблемою.
Пітер Тейлор

Чи слід вводити дані зі стандартного введення у вигляді рядка, розділеного комою? Або ми можемо написати функцію, яка приймає список плавців як аргумент?
sepp2k

Ви маєте на увазі між x = 0, x = C, y = 0 і кривою?
Кіт Рендалл

2
@ Петер: Я не думаю, що так. Він показує зображення зворотного (інтеграл якого буде розходитися), але функція, яку він визначає, є многочленом. Визначений інтеграл над [0, С) повинен бути чітко визначеним і кінцевим для кінцевих коефіцієнтів.
dmckee --- кошеня колишнього модератора

1
@dmckee, я це помічав, але мій погляд був більше в тому, що він інтегрує поліном від - \ infty до C, і будь-який нетривіальний многочлен, який розходиться. Питання тепер було внесено зміни, щоб виправити це.
Пітер Тейлор

Відповіді:



5

Пітон - 71 63 символів:

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

Це проста інтеграція поліноміальної функції між 0і C. І я цього не перевіряв, але я впевнений, що він працює на негативних значеннях.


Дізналися щось нове про input()сьогодні :)
st0le

3

Haskell, 85 символів

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

1
Питання не таке суворе, як ви ставитесь до нього. Ви, безумовно, можете спростити вхідний код і, можливо, взагалі відмовитися від явного вводу / виводу.
JB

3

J, 26 символів

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

напр

   f 2 0 1
2
   f 3 0 0 2
18

Акуратно! Я не можу знайти спосіб зробити його більш мовчазним. Це d.поєднання не дуже легко моїм початківцям J навичкам.
JB

@JB: Так, це д. є "проблемою" і для мене. :)
Eelvex

2

Рубі, 65 годин

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

Код читається до кінця введення, а не до кінця рядка. Тому вам потрібно натиснути Ctrl+, Dщоб припинити введення. (Трубопровідний вхід за допомогою echoабо з файлу.)


1
Я думаю, що присвоєння змінної "," допоможе ... як щодо цього c=gets(q=",").to_fі $<.each(q){|a|s+=a.to_f*c**(i+=1)/i}, економить один
знак

@ st0le: Дуже добре. Дякую.
sepp2k

Призначення ","(або ?,, що ще коротше) $/дозволяє опускати аргумент $<.each. І $<.mapна один персонаж коротший, ніж $<.each. ;)
Вентеро

2

C GCC 186 182 байт

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

Ця програма дає вихід (область) для будь-якої кривої між кривою, y = 0, x = C і x = 0. Він може приймати коефіцієнти ( floatтакож) від 0 до 48 . Перший прийнятий вхід Cсупроводжується коефіцієнтами. Натисніть Ènterпісля останнього коефіцієнта.

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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.