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.
uniformgirdi olarak iki kayan nokta sayısı alıravebeşit dağılımı verir[a,b]. Bunu varsayabilirsiniza < b; davaa ≥ btanımsız.blendgirdilerin üç olasılık dağılımları olarak alırP,QveR. Bir olasılık dağılımını verirSdeğerleri çizerx,yvezgelenP,QveR, sırası ile, ve ürünleryhalindex ≥ 0vezeğerx < 0.overgiriş, bir kayan nokta sayısı olarak alırfve bir olasılık dağılımınaPve olasılığını verirx ≥ frastgele bir sayı için de geçerlidirxçekilirP.
Referans overiç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 overkullanılarak oluşturulduğunu uniformve blendbir kullanıcının olasılık dağılımıyla yapacağı tek şeyin onu blendveya ' 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