introduction
Dans ce défi, votre tâche consiste à implémenter une collection de fonctions simples qui forment ensemble une mini-bibliothèque utilisable pour des distributions de probabilités simples. Pour prendre en charge certains des langages les plus ésotériques que les gens aiment utiliser ici, les implémentations suivantes sont acceptables:
- Un extrait de code définissant une collection de fonctions nommées (ou équivalents les plus proches).
- Collection d'expressions évaluant des fonctions nommées ou anonymes (ou leurs équivalents les plus proches).
- Expression unique qui évalue plusieurs fonctions nommées ou anonymes (ou équivalents les plus proches).
- Une collection de programmes indépendants qui prennent les entrées de la ligne de commande, STDIN ou l'équivalent le plus proche, et la sortie vers STDOUT ou l'équivalent le plus proche.
Les fonctions
Vous devez implémenter les fonctions suivantes, en utilisant des noms plus courts si vous le souhaitez.
uniform
prend en entrée deux nombres à virgule flottantea
etb
, et renvoie la distribution uniforme[a,b]
. Vous pouvez supposer celaa < b
; l'affairea ≥ b
n'est pas définie.blend
prend en entrée trois distributions de probabilitéP
,Q
etR
. Il renvoie une distribution de probabilitéS
, qui tire des valeursx
,y
etz
deP
,Q
etR
, respectivement, et produity
six ≥ 0
, etz
six < 0
.over
prend en entrée un nombre à virgule flottantef
et une distribution de probabilitéP
, et retourne la probabilité quix ≥ f
vaut pour un nombre aléatoirex
tiré deP
.
Pour référence, over
peut être défini comme suit (en 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)
Vous pouvez supposer que toutes les distributions de probabilité données à over
sont construites à l'aide de uniform
et blend
, et que la seule chose qu'un utilisateur va faire avec une distribution de probabilité est de l'alimenter en blend
ou over
. Vous pouvez utiliser n'importe quel type de données pratique pour représenter les distributions: listes de nombres, chaînes, objets personnalisés, etc. La seule chose importante est que l'API fonctionne correctement. De plus, votre implémentation doit être déterministe, dans le sens de toujours renvoyer la même sortie pour les mêmes entrées.
Cas de test
Vos valeurs de sortie doivent être correctes à au moins deux chiffres après la virgule décimale sur ces cas de test.
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