Einführung
Bei dieser Herausforderung besteht Ihre Aufgabe darin, eine Sammlung einfacher Funktionen zu implementieren, die zusammen eine verwendbare Minibibliothek für einfache Wahrscheinlichkeitsverteilungen bilden. Die folgenden Implementierungen sind akzeptabel, um einige der esoterischeren Sprachen aufzunehmen, die hier gerne verwendet werden:
- Ein Codefragment, das eine Sammlung benannter Funktionen (oder nächstgelegener Entsprechungen) definiert.
- Eine Sammlung von Ausdrücken, die benannte oder anonyme Funktionen (oder nächstgelegene Entsprechungen) ergeben.
- Ein einzelner Ausdruck, der mehrere benannte oder anonyme Funktionen (oder nächstgelegene Entsprechungen) ergibt.
- Eine Sammlung unabhängiger Programme, die Eingaben von der Befehlszeile STDIN oder dem nächstgelegenen Äquivalent und die Ausgabe an STDOUT oder das nächstgelegene Äquivalent übernehmen.
Die Funktionen
Sie müssen die folgenden Funktionen implementieren und bei Bedarf kürzere Namen verwenden.
uniformNimmt als Eingabe zwei Gleitkommazahlenaundbund gibt die Gleichverteilung auf zurück[a,b]. Sie können davon ausgehena < b; Der Falla ≥ bist undefiniert.blendnimmt als Eingaben drei WahrscheinlichkeitsverteilungenP,QundR. Sie gibt eine WahrscheinlichkeitsverteilungS, die Werte ziehtx,yundzausP,QundR, bzw., und Ausbeuten ,ywennx ≥ 0, undzwennx < 0.overNimmt als Eingabe eine Gleitkommazahlfund eine WahrscheinlichkeitsverteilungPund gibt die Wahrscheinlichkeit zurück,x ≥ fdie für eine Zufallszahl giltx, aus der gezogen wirdP.
Als Referenz overkann wie folgt definiert werden (im 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)
Sie können davon ausgehen, dass alle angegebenen Wahrscheinlichkeitsverteilungen overmit uniformund erstellt blendwerden und dass das einzige, was ein Benutzer mit einer Wahrscheinlichkeitsverteilung tun wird, darin besteht, sie an blendoder weiterzuleiten over. Sie können einen beliebigen Datentyp verwenden, um die Verteilungen darzustellen: Listen mit Zahlen, Zeichenfolgen, benutzerdefinierten Objekten usw. Das einzig Wichtige ist, dass die API ordnungsgemäß funktioniert. Auch Ihre Implementierung muss deterministisch sein, im Sinne der immer die gleiche Leistung für die gleichen Eingaben zurück.
Testfälle
Ihre Ausgabewerte sollten in diesen Testfällen mindestens zwei Stellen nach dem Dezimalpunkt korrekt sein.
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