บทนำ
ในความท้าทายนี้งานของคุณคือการใช้คอลเลกชันของฟังก์ชั่นที่เรียบง่ายที่รวมกันเป็นห้องสมุดขนาดเล็กที่ใช้งานได้สำหรับการแจกแจงความน่าจะเป็นแบบง่าย เพื่อรองรับภาษาที่ลึกลับกว่าบางคนที่ต้องการใช้ที่นี่การใช้งานต่อไปนี้เป็นที่ยอมรับ:
- ส่วนย่อยของรหัสกำหนดคอลเลกชันของฟังก์ชันที่มีชื่อ (หรือเทียบเท่าที่ใกล้เคียงที่สุด)
- คอลเลกชันของนิพจน์ที่ประเมินฟังก์ชันที่ระบุชื่อหรือไม่ระบุชื่อ (หรือเทียบเท่าที่ใกล้เคียงที่สุด)
- นิพจน์เดียวที่ประเมินไปยังฟังก์ชันที่ระบุชื่อหรือไม่ระบุชื่อหลายรายการ (หรือเทียบเท่าที่ใกล้เคียงที่สุด)
- คอลเล็กชันของโปรแกรมอิสระที่รับอินพุตจากบรรทัดรับคำสั่ง STDIN หรือเทียบเท่าที่ใกล้เคียงที่สุดและเอาต์พุตไปยัง STDOUT หรือเทียบเท่าที่ใกล้เคียงที่สุด
ส่วนฟังก์ชั่น
คุณจะต้องใช้ฟังก์ชั่นต่อไปนี้โดยใช้ชื่อที่สั้นลงหากต้องการ
uniform
ใช้เวลาเป็น input ตัวเลขสองจุดลอยa
และและผลตอบแทนการกระจายชุดบนb
[a,b]
คุณสามารถสันนิษฐานได้ว่าa < b
; กรณีa ≥ b
ไม่ได้กำหนดblend
จะเป็นสามแจกแจงความน่าจะปัจจัยการผลิตP
, และQ
R
มันกลับกระจายความน่าจะเป็นS
ที่ดึงค่าx
,y
และz
จากP
,Q
และR
ตามลำดับและอัตราผลตอบแทนy
ถ้าx ≥ 0
และถ้าz
x < 0
over
ใช้เวลาเป็น input จำนวนจุดลอยf
และการกระจายความน่าจะเป็นP
และผลตอบแทนที่น่าจะเป็นที่x ≥ f
ถือสำหรับจำนวนสุ่มมาจากx
P
สำหรับการอ้างอิงover
สามารถกำหนดได้ดังต่อไปนี้ (ใน pseudocode):
over(f, uniform(a, b)):
if f <= a: return 1.0
else if f >= b: return 0.0
else: return (b - f)/(b - a)
over(f, blend(P, Q, R)):
p = over(0.0, P)
return p*over(f, Q) + (1-p)*over(f, R)
คุณสามารถคิดว่าทุกแจกแจงความน่าจะได้รับการover
สร้างใช้uniform
และblend
และว่าสิ่งเดียวที่ผู้ใช้จะทำอย่างไรกับการกระจายความน่าจะเป็นคือการให้อาหารมันหรือblend
over
คุณสามารถใช้ประเภทข้อมูลที่สะดวกเพื่อแสดงการแจกแจง: รายการตัวเลข, สตริง, วัตถุที่กำหนดเองและอื่น ๆ สิ่งสำคัญเพียงอย่างเดียวคือ API ทำงานอย่างถูกต้อง นอกจากนี้การใช้งานของคุณจะต้องถูกกำหนดไว้ในความหมายของการส่งคืนผลลัพธ์เดียวกันสำหรับอินพุตเดียวกันเสมอ
กรณีทดสอบ
ค่าผลลัพธ์ของคุณควรถูกต้องเป็นอย่างน้อยสองหลักหลังจุดทศนิยมในกรณีทดสอบเหล่านี้
over(4.356, uniform(-4.873, 2.441)) -> 0.0
over(2.226, uniform(-1.922, 2.664)) -> 0.09550806803314438
over(-4.353, uniform(-7.929, -0.823)) -> 0.49676329862088375
over(-2.491, uniform(-0.340, 6.453)) -> 1.0
over(0.738, blend(uniform(-5.233, 3.384), uniform(2.767, 8.329), uniform(-2.769, 6.497))) -> 0.7701533851999125
over(-3.577, blend(uniform(-3.159, 0.070), blend(blend(uniform(-4.996, 4.851), uniform(-7.516, 1.455), uniform(-0.931, 7.292)), blend(uniform(-5.437, -0.738), uniform(-8.272, -2.316), uniform(-3.225, 1.201)), uniform(3.097, 6.792)), uniform(-8.215, 0.817))) -> 0.4976245638164541
over(3.243, blend(blend(uniform(-4.909, 2.003), uniform(-4.158, 4.622), blend(uniform(0.572, 5.874), uniform(-0.573, 4.716), blend(uniform(-5.279, 3.702), uniform(-6.564, 1.373), uniform(-6.585, 2.802)))), uniform(-3.148, 2.015), blend(uniform(-6.235, -5.629), uniform(-4.647, -1.056), uniform(-0.384, 2.050)))) -> 0.0
over(-3.020, blend(blend(uniform(-0.080, 6.148), blend(uniform(1.691, 6.439), uniform(-7.086, 2.158), uniform(3.423, 6.773)), uniform(-1.780, 2.381)), blend(uniform(-1.754, 1.943), uniform(-0.046, 6.327), blend(uniform(-6.667, 2.543), uniform(0.656, 7.903), blend(uniform(-8.673, 3.639), uniform(-7.606, 1.435), uniform(-5.138, -2.409)))), uniform(-8.008, -0.317))) -> 0.4487803553043079