กำลังคำนวณพื้นที่


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

UPDATE:

  • C> 0 ถูกสมมติเช่นกัน
  • พื้นที่อยู่ระหว่างเส้นโค้ง y = 0, x = C และ x = 0
  • อินพุตสามารถเป็นรายการของรูปแบบใด ๆ ไม่จำเป็นต้องคั่นด้วยเครื่องหมายจุลภาค
  • เอาต์พุตสามารถเป็นจริงของรูปแบบใด ๆ (ดังนั้น '18' เป็นเอาต์พุตที่ถูกต้องเช่นเดียวกับ '18 .0 ')

1
เนื่องจากคำตอบจะเป็น "ไม่สิ้นสุด" สำหรับการป้อนข้อมูลเกือบทุกครั้งฉันคิดว่าคุณผิดปัญหา
Peter Taylor

ควรอ่านอินพุตจากอินพุตมาตรฐานเป็นสตริงที่คั่นด้วยเครื่องหมายจุลภาคหรือไม่? หรือเราจะเขียนฟังก์ชั่นที่รับรายการค่าลอยเป็นอาร์กิวเมนต์ได้หรือไม่?
sepp2k

คุณหมายถึงระหว่าง x = 0, x = C, y = 0 และเส้นโค้งหรือไม่?
Keith Randall

2
@ Peter: ฉันไม่คิดอย่างนั้น เขาแสดงรูปภาพของสิ่งที่ตรงกันข้าม (อินทิกรัลซึ่งจะแยกออก) แต่ฟังก์ชันที่เขาระบุคือพหุนาม อินทิกรัล จำกัด เขต [0, C) ควรถูกนิยามอย่างดีและ จำกัด สำหรับสัมประสิทธิ์ จำกัด
dmckee --- ผู้ดูแลอดีตลูกแมว

1
@ dmckee ฉันได้สังเกตเห็นว่า แต่ประเด็นของฉันก็ยิ่งมากกว่าที่เขาได้รวมพหุนามจาก - \ infty ถึง C และสำหรับพหุนามที่ไม่ใช่เรื่องไร้สาระที่ diverges ตอนนี้คำถามได้รับการแก้ไขเพื่อแก้ไข
Peter Taylor

คำตอบ:



5

Python - 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
คำถามไม่ได้เข้มงวดเท่ากับที่คุณปฏิบัติต่อมัน คุณสามารถลดความซับซ้อนของรหัสป้อนเข้าได้อย่างแน่นอนและอาจใช้ I / O อย่างชัดเจนร่วมกัน
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;)
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);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.