루비, 64 바이트
먼저 내 제출. 인자 람다 함수 distance 1, angle 1, distance 2, angle2
.
->r,a,s,b{([d=(b-a).abs,?i.to_c.arg*4-d,2].min-2)*[r,s].min+s+r}
이제 여기에 66 바이트 (할당 제외 f=
) 의 두 가지 다른 솔루션과 64 바이트의 실제 제출이 있습니다.
Solution 1:Using include Math, 66 bytes excluding f=
include Math;f=->r,a,s,b{[acos(cos(b-a)),2].min*[r,s].min+(s-r).abs}
Solution 2:Using complex number to define PI instead, 66 bytes excluding f=
f=->r,a,s,b{[d=(b-a).abs,?i.to_c.arg*4-d,2].min*[r,s].min+(s-r).abs}
SUBMISSION AGAIN, 64 bytes excluding f=
f=->r,a,s,b{([d=(b-a).abs,?i.to_c.arg*4-d,2].min-2)*[r,s].min+s+r}
제출은 솔루션 2를 기반으로하지만 identity (s-r).abs
= s+r-[s,r].min*2
를 사용 하여 코드를 2 바이트 단축하므로 -2
괄호 안에 있습니다.
다른 주목할만한 특징 ?i.to_c.arg*4
은를 사용하지 않고 expression = 2 * PI include Math
입니다. 정밀도가 낮 으면 리터럴로 대체 할 수 있습니다.
솔루션 2는 테스트 프로그램에 주석을 달았습니다.
f=->r,a,s,b{ #r,s are distances, a,b are angles for points 1 and 2 respectively.
[d=(b-a).abs, #From nearer point we can take arc of length d radians perhaps crossing zero angle to the ray of the further point
?i.to_c.arg*4-d, #or go the other way round which may be shorter (?i.to_c.arg*4 == 2*PI, subtract d from this.)
2].min* #or go through the centre if the angle exceeds 2 radians.
[r,s].min+ #Multiply the radians by the distance of the nearer point from the origin to get the distance travelled.
(s-r).abs #Now add the distance to move along the ray out to the further point.
}
#test cases per question (given as complex numbers, converted to arrays of [distance,angle]+[distance,angle] (+ concatenates.)
#the "splat" operator * converts the array to 4 separate arguments for the function.
p f[*("1+i".to_c.polar + "1-i".to_c.polar)]
p f[*("0".to_c.polar + "1+i".to_c.polar)]
p f[*("1".to_c.polar + "-0.4161+0.90929i".to_c.polar)]
p f[*("1+i".to_c.polar + "1".to_c.polar)]
p f[*("1+2i".to_c.polar + "3+4i".to_c.polar)]
산출
2.221441469079183
1.4142135623730951
1.9999342590038496
1.1996117257705434
3.1660966740274357