Расчет площадей.

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

вход

С, 0 , 1 , ...

Выход

реальное число - площадь

Пример 1:

input: 2, 0, 1
output: 2.0

Пример 2:

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

ОБНОВИТЬ:

  • C> 0 также предполагается
  • площадь находится между кривой, у = 0, х = с и х = 0
  • вход может быть списком любой формы; не обязательно через запятую
  • выходные данные могут быть действительными в любой форме (таким образом, «18» является допустимым выходным значением, как и «18 .0»)
Eelvex
источник
1
Поскольку ответ будет «бесконечным» практически для любого ввода, я думаю, что вы неправильно сформулировали проблему.
Питер Тейлор
Должен ли ввод считываться из стандартного ввода в виде строки, разделенной запятыми? Или мы можем написать функцию, которая принимает список с плавающей точкой в ​​качестве аргумента?
sepp2k
Вы имеете в виду между x = 0, x = C, y = 0 и кривой?
Кит Рэндалл
2
@Peter: я так не думаю. Он показывает картину инверсии (интеграл которой будет расходиться), но функция, которую он определяет, является полиномом. Определенный интеграл по [0, C) должен быть хорошо определен и конечен для конечных коэффициентов.
dmckee --- котенок экс-модератора
1
@dmckee, я заметил это, но больше всего я хотел сказать, что он интегрировал многочлен из - \ infty в C, и для любого нетривиального многочлена, который расходится. Вопрос был исправлен, чтобы исправить это.
Питер Тейлор

Ответы:

3

Mathematica: 48 символов

,

Sum[#[[i+1]]#[[1]]^i/i,{i,Length@#-1}]&@Input[]
Доктор Велизарий
источник
-1 байт: Length@#-> Tr[1^#]. Кроме того, вы можете опустить @Input[]и сделать функцию.
JungHwan Мин
5

Python - 71 63 символа:

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

Это простая интеграция полиномиальной функции между 0и C. И я не проверял это, но я вполне уверен, что это работает для отрицательных значений.

Juan
источник
Узнал что-то новое о input()сегодняшнем
дне
3

Хаскель, 85 символов

f(c:l)=sum.map(\(i,x)->x*c**i/i)$zip[1..]l
main=getLine>>=print.f.read.('[':).(++"]")
sepp2k
источник
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
Eelvex
источник
Ухоженная! Я не могу найти способ сделать его более молчаливым. Это d.соединение не делает мои навыки новичка очень легкими.
JB
@JB: Да, это d. это тоже проблема для меня. :)
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файле или из файла.)

sepp2k
источник
1
я думаю, что присвоение переменной "," поможет ... как насчет этого c=gets(q=",").to_fи $<.each(q){|a|s+=a.to_f*c**(i+=1)/i}сохраняет один символ ....
st0le
@ st0le: Очень мило. Благодарю.
сентября
Присвоение ","(или ?,, что еще короче) для $/позволяет опустить аргумент для $<.each. И $<.mapна один символ короче $<.each. ;)
Ventero
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);
}
Абель Том
источник