에서는 상대성 , 반대 방향으로 이동되는 다른 개체에 이동체의 속도는 수식에 의해 주어진다 :
s = ( v + u ) / ( 1 + v * u / c ^ 2)
이 공식에서
와
는 물체의 속도의 크기이고
는 빛의 속도입니다 (약
,이 도전에 대한 가까운 근사).
예를 들어, 한 물체가에 이동 v = 50,000 m/s
하고 다른 물체가에 이동하는 경우 다른 물체에 u = 60,000 m/s
대한 각 물체의 속도는 대략 s = 110,000 m/s
입니다. 이것이 갈릴리 언 상대성 (속도가 단순히 추가되는 곳)에서 기대할 수있는 것이다. 그러나, v = 50,000,000 m/s
그리고 u = 60,000,000 m/s
, 상대 속도는 약 것 106,451,613 m/s
댄 유의 한 차이 인 110,000,000 m/s
갈릴리 상대성 이론에 의해 예측했다.
도전
두 정수 주어 v
와 u
되도록 0 <= v,u < c
하여, 상기 식을 이용하여 상대 속도 첨가제를 계산 c = 300000000
. 출력은 10 진수 값이거나 분수를 줄여야합니다. 출력은 0.001
10 진수 값의 실제 값 내에 있거나 분수의 경우 정확해야합니다.
테스트 사례
체재: v, u -> exact fraction (float approximation)
50000, 60000 -> 3300000000000/30000001 (109999.99633333346)
50000000, 60000000 -> 3300000000/31 (106451612.90322581)
20, 30 -> 7500000000000000/150000000000001 (49.999999999999666)
0, 20051 -> 20051 (20051.0)
299999999, 299999999 -> 53999999820000000000000000/179999999400000001 (300000000.0)
20000, 2000000 -> 4545000000000/2250001 (2019999.1022226212)
2000000, 2000000 -> 90000000000/22501 (3999822.2301231055)
1, 500000 -> 90000180000000000/180000000001 (500000.9999972222)
1, 50000000 -> 90000001800000000/1800000001 (50000000.972222224)
200000000, 100000000 -> 2700000000/11 (245454545.45454547)
답변
MATL , 9 바이트
sG3e8/pQ/
s % Take array [u, v] implicitly. Compute its sum: u+v
G % Push [u, v] again
3e8 % Push 3e8
/ % Divide. Gives [u/c, v/c]
p % Product of array. Gives u*v/c^2
Q % Add 1
/ % Divide. Display implicitly
답변
매스 매 티카, 17 바이트
+##/(1+##/9*^16)&
명명되지 않은 함수는 두 정수를 취하고 정확한 분수를 반환합니다.
설명
이것은 인수 순서와 함께##
두 가지 멋진 트릭 을 사용하므로 개별 인수 u
를 v
개별적으로 참조하는 것을 피할 수 있습니다 . “unwrapped list”의 일종 인 모든 인수 시퀀스 로 ##
확장됩니다 . 다음은 간단한 예입니다.
{x, ##, y}&[u, v]
준다
{x, u, v, y}
임의의 함수 내에서 동일한 작업이 수행됩니다 (의 {...}
약어 이므로 List[...]
).
f[x, ##, y]&[u, v]
준다
f[x, u, v, y]
이제 우리는 ##
연산자에 손 을 댈 수 있습니다 . 연산자는 연산자에 관한 한 먼저 피연산자로 취급합니다. 그런 다음 연산자는 전체 형식으로 확장되고 f[...]
시퀀스 만 확장됩니다. 이 사건에서 +##
이다 Plus[##]
인 Plus[u, v]
, 우리가 원하는 분자를 즉.
반면에 분모에서의 ##
왼쪽 연산자로 나타납니다 /
. 이것이 배가 u
되고 v
오히려 미묘한 이유 입니다. /
다음과 같은 측면에서 구현됩니다 Times
.
FullForm[a/b]
(* Times[a, Power[b, -1]] *)
그래서 a
입니다 ##
, 그것은 나중에 확장됩니다 우리는 끝낼
Times[u, v, Power[9*^16, -1]]
여기서, *^
과학적 표기법 단지 티카의 연산자입니다.
답변
젤리, 9 바이트
÷3ȷ8P‘÷@S
온라인으로 사용해보십시오! 또는 분수를 선호하는 경우 M을 사용하여 동일한 코드를 실행할 수 있습니다 .
작동 원리
÷3ȷ8P‘÷@S Main link. Argument: [u, v]
÷3ȷ8 Divide u and v by 3e8.
P Take the product of the quotients, yielding uv ÷ 9e16.
‘ Increment, yielding 1 + uv ÷ 9e16.
S Sum; yield u + v.
÷@ Divide the result to the right by the result to the left.
답변
Python3, 55 31 29 바이트
파이썬은 각 입력이 필요할 때 입력을 얻는 것이 끔찍 int(input())
하지만 여기에 내 솔루션이 있습니다.
v, u = int (input ()), int (input ()); print ((v + u) / (1 + v * u / 9e16))
@Jakube 덕분에 실제로 전체 prgrame이 필요하지 않고 함수 만 필요합니다. 그 후:
lambda u,v:(v+u)/(1+v*u/9e16)
오히려 설명 이 필요없고 입력을 받고 계산합니다. 나는 c ^ 2를 사용했고 9e16이 (3e8 ** 2)보다 짧아 단순화했습니다.
Python2, 42 바이트
v,u=input(),input();print(v+u)/(1+v*u/9e16)
@muddyfish 감사합니다
답변
J, 13 11 바이트
+%1+9e16%~*
용법
>> f =: +%1+9e16%~*
>> 5e7 f 6e7
<< 1.06452e8
>>
STDIN은 어디에 있고 <<
STDOUT입니다.
답변
Matlab, 24 바이트
@(u,v)(u+v)/(1+v*u/9e16)
두 개의 입력을받는 익명 함수. 아무 것도 환상적이지 않고 완성을 위해 제출했습니다.
답변
CJam, 16 바이트
q~_:+\:*9.e16/)/
여기에 저장할 바이트가 여전히 있다고 확신합니다.