Giới thiệu
Trong thử thách này, nhiệm vụ của bạn là thực hiện một tập hợp các hàm đơn giản cùng nhau tạo thành một thư viện nhỏ có thể sử dụng để phân phối xác suất đơn giản. Để phù hợp với một số ngôn ngữ bí truyền hơn mà mọi người muốn sử dụng ở đây, các triển khai sau đây có thể được chấp nhận:
- Một đoạn mã xác định một tập hợp các hàm được đặt tên (hoặc tương đương gần nhất).
- Một tập hợp các biểu thức đánh giá các hàm được đặt tên hoặc ẩn danh (hoặc tương đương gần nhất).
- Một biểu thức duy nhất đánh giá một số hàm được đặt tên hoặc ẩn danh (hoặc tương đương gần nhất).
- Một tập hợp các chương trình độc lập lấy đầu vào từ dòng lệnh, STDIN hoặc tương đương gần nhất và xuất ra STDOUT hoặc tương đương gần nhất.
Chức năng
Bạn sẽ thực hiện các chức năng sau, sử dụng tên ngắn hơn nếu muốn.
uniform
mất như là đầu vào hai số dấu chấm độnga
vàb
, và trả về sự phân bố đồng đều trên[a,b]
. Bạn có thể cho rằnga < b
; trường hợpa ≥ b
không xác định.blend
lấy làm đầu vào ba phân phối xác suấtP
,Q
vàR
. Nó trả về một phân phối xác suấtS
, rút ra các giá trịx
,y
vàz
từP
,Q
vàR
, tương ứng, và mang lạiy
nếux ≥ 0
, vàz
nếux < 0
.over
lấy đầu vào là số dấu phẩy độngf
và phân phối xác suấtP
và trả về xác suấtx ≥ f
giữ cho một số ngẫu nhiênx
được rút ra từ đóP
.
Để tham khảo, over
có thể được định nghĩa như sau (trong mã giả):
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)
Bạn có thể giả định rằng tất cả các phân phối xác suất được cung cấp over
được xây dựng bằng cách sử dụng uniform
và blend
, và điều duy nhất người dùng sẽ làm với phân phối xác suất là đưa nó đến blend
hoặc over
. Bạn có thể sử dụng bất kỳ kiểu dữ liệu thuận tiện nào để thể hiện các bản phân phối: danh sách các số, chuỗi, đối tượng tùy chỉnh, v.v. Điều quan trọng duy nhất là API hoạt động chính xác. Ngoài ra, việc thực hiện của bạn phải mang tính quyết định, theo nghĩa luôn luôn trả lại cùng một đầu ra cho cùng một đầu vào.
Các trường hợp thử nghiệm
Giá trị đầu ra của bạn phải chính xác đến ít nhất hai chữ số sau dấu thập phân trên các trường hợp kiểm tra này.
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