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.
uniformmất như là đầu vào hai số dấu chấm độngavà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 ≥ bkhông xác định.blendlấy làm đầu vào ba phân phối xác suấtP,QvàR. Nó trả về một phân phối xác suấtS, rút ra các giá trịx,yvàztừP,QvàR, tương ứng, và mang lạiynếux ≥ 0, vàznếux < 0.overlấy đầu vào là số dấu phẩy độngfvà phân phối xác suấtPvà trả về xác suấtx ≥ fgiữ cho một số ngẫu nhiênxđược rút ra từ đóP.
Để tham khảo, overcó 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 uniformvà 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 blendhoặ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