Giriş
Bu meydan okumada, göreviniz birlikte basit olasılık dağılımları için kullanılabilir bir mini kütüphane oluşturan basit fonksiyonların bir koleksiyonunu uygulamaktır. İnsanların burada kullanmayı sevdikleri daha ezoterik dillerden bazılarını barındırmak için aşağıdaki uygulamalar kabul edilebilir:
- Adlandırılmış işlevlerin (veya en yakın eşdeğerlerinin) bir koleksiyonunu tanımlayan bir kod snippet'i.
- Adlandırılmış veya anonim işlevlere (veya en yakın eşdeğerlere) göre değerlendirilen bir ifade koleksiyonu.
- Birden fazla adlandırılmış veya anonim işleve (veya en yakın eşdeğere) göre değerlendirilen tek bir ifade.
- Komut satırından, STDIN veya en yakın eşdeğerden girişler alan ve STDOUT veya en yakın eşdeğerden çıkış alan bağımsız programlar topluluğu.
Fonksiyonlar
İsterseniz daha kısa isimler kullanarak aşağıdaki işlevleri yerine getireceksiniz.
uniform
girdi olarak iki kayan nokta sayısı alıra
veb
eşit dağılımı verir[a,b]
. Bunu varsayabilirsiniza < b
; davaa ≥ b
tanımsız.blend
girdilerin üç olasılık dağılımları olarak alırP
,Q
veR
. Bir olasılık dağılımını verirS
değerleri çizerx
,y
vez
gelenP
,Q
veR
, sırası ile, ve ürünlery
halindex ≥ 0
vez
eğerx < 0
.over
giriş, bir kayan nokta sayısı olarak alırf
ve bir olasılık dağılımınaP
ve olasılığını verirx ≥ f
rastgele bir sayı için de geçerlidirx
çekilirP
.
Referans over
için aşağıdaki gibi tanımlanabilir (sözde kodda):
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)
Verilen tüm olasılık dağılımlarının over
kullanılarak oluşturulduğunu uniform
ve blend
bir kullanıcının olasılık dağılımıyla yapacağı tek şeyin onu blend
veya ' ye beslemek olduğunu varsayabilirsiniz over
. Dağılımları temsil etmek için herhangi bir uygun veri türünü kullanabilirsiniz: sayılar, dizeler, özel nesneler, vb. Listeleri. Tek önemli şey API'nin düzgün çalışmasıdır. Ayrıca, aynı girdiler için her zaman aynı çıktıyı döndürme anlamında uygulamanız belirleyici olmalıdır .
Test senaryoları
Çıktı değerleriniz, bu test senaryolarında ondalık noktadan sonra en az iki basamaklı olmalıdır.
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