소개
이 과제에서는 간단한 확률 분포에 사용할 수있는 미니 라이브러리를 함께 구성하는 간단한 함수 모음을 구현해야합니다. 사람들이 여기에서 사용하기에 더 난해한 언어를 수용하기 위해 다음과 같은 구현이 허용됩니다.
- 명명 된 함수 (또는 가장 가까운 함수)의 컬렉션을 정의하는 코드 스 니펫.
- 명명 된 함수 또는 익명 함수 (또는 가장 가까운 함수)로 평가되는 표현식 모음입니다.
- 여러 개의 명명 된 함수 나 익명 함수 (또는 가장 가까운 함수)로 평가되는 단일 표현식입니다.
- 명령 행, STDIN 또는 가장 유사한 항목에서 입력을 가져 와서 STDOUT 또는 가장 유사한 항목으로 출력하는 독립 프로그램의 모음입니다.
기능
원하는 경우 더 짧은 이름을 사용하여 다음 기능을 구현해야합니다.
uniform
입력으로 두 개의 부동 소수점 숫자를 소요a
하고b
, 반환에 균일 한 분포를[a,b]
. 당신은 그것을 가정 할 수 있습니다a < b
; 사건a ≥ b
은 정의되지 않았다.blend
입력 세 확률 분포로 얻어P
,Q
및R
. 이 확률 분포 반환S
값을 무x
,y
및z
행P
,Q
및R
각각 수율y
경우x ≥ 0
및z
경우x < 0
.over
부동 소수점 숫자f
와 확률 분포 를 입력으로 취하고 에서 추출한 난수에 대한P
확률을 반환합니다 .x ≥ f
x
P
참고 over
로 다음과 같이 정의 할 수 있습니다 (의사 코드로).
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)
주어진 모든 확률 분포가 있다고 가정 할 수 있습니다 over
사용하여 구성되어 uniform
와 blend
, 그리고 사용자가 확률 분포와 함께 할 것입니다 유일한인지에 공급하는 blend
나 over
. 편리한 데이터 유형을 사용하여 숫자, 문자열, 사용자 정의 객체 등의 분포를 나타내는 분포를 나타낼 수 있습니다. 유일한 중요한 것은 API가 올바르게 작동한다는 것입니다. 또한 동일한 입력에 대해 항상 동일한 출력을 반환한다는 의미에서 구현 은 결정 론적 이어야합니다 .
테스트 사례
이러한 테스트 사례에서 출력 값은 소수점 다음 두 자리 이상으로 정확해야합니다.
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