pengantar
Dalam tantangan ini, tugas Anda adalah mengimplementasikan kumpulan fungsi sederhana yang bersama-sama membentuk perpustakaan mini yang dapat digunakan untuk distribusi probabilitas sederhana. Untuk mengakomodasi beberapa bahasa yang lebih esoteris yang orang suka gunakan di sini, implementasi berikut dapat diterima:
- Cuplikan kode yang mendefinisikan kumpulan fungsi bernama (atau setara terdekat).
- Kumpulan ekspresi yang mengevaluasi fungsi bernama atau anonim (atau setara terdekat).
- Ekspresi tunggal yang mengevaluasi beberapa fungsi yang disebut atau anonim (atau setara terdekat).
- Kumpulan program independen yang mengambil input dari baris perintah, STDIN atau setara terdekat, dan output ke STDOUT atau setara terdekat.
Fungsinya
Anda harus menerapkan fungsi-fungsi berikut, menggunakan nama yang lebih pendek jika diinginkan.
uniformmengambil input dua nomor floating pointadanb, dan mengembalikan distribusi seragam aktif[a,b]. Anda dapat mengasumsikan itua < b; casea ≥ btidak terdefinisi.blendmengambil input tiga distribusi probabilitasP,QdanR. Ini mengembalikan distribusi probabilitasS, yang menarik nilaix,ydanzdariP,QdanR, masing-masing, dan menghasilkanyjikax ≥ 0, danzjikax < 0.overmengambil sebagai input angka floating pointfdan distribusi probabilitasP, dan mengembalikan probabilitas yangx ≥ fberlaku untuk nomor acak yangxdiambilP.
Untuk referensi, overdapat didefinisikan sebagai berikut (dalam 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)
Anda dapat mengasumsikan bahwa semua distribusi probabilitas yang diberikan overdibangun menggunakan uniformdan blend, dan bahwa satu-satunya hal yang akan dilakukan pengguna dengan distribusi probabilitas adalah memberi makan kepada blendatau over. Anda dapat menggunakan tipe data yang mudah untuk mewakili distribusi: daftar angka, string, objek khusus, dll. Satu-satunya hal yang penting adalah API bekerja dengan benar. Juga, implementasi Anda harus deterministik, dalam arti selalu mengembalikan output yang sama untuk input yang sama.
Uji kasus
Nilai output Anda harus benar setidaknya dua digit setelah titik desimal pada kasus uji ini.
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