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.
uniformprend en entrée deux nombres à virgule flottanteaetb, et renvoie la distribution uniforme[a,b]. Vous pouvez supposer celaa < b; l'affairea ≥ bn'est pas définie.blendprend en entrée trois distributions de probabilitéP,QetR. Il renvoie une distribution de probabilitéS, qui tire des valeursx,yetzdeP,QetR, respectivement, et produitysix ≥ 0, etzsix < 0.overprend en entrée un nombre à virgule flottantefet une distribution de probabilitéP, et retourne la probabilité quix ≥ fvaut pour un nombre aléatoirextiré deP.
Pour référence, overpeut ê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 à oversont construites à l'aide de uniformet blend, et que la seule chose qu'un utilisateur va faire avec une distribution de probabilité est de l'alimenter en blendou 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