소개
0과 1 사이의 모든 합리적인 숫자는 결국주기적인 비트 시퀀스로 표현 될 수 있습니다. 예를 들어 11/40의 이진 표현은
0.010 0011 0011 0011 ...
여기서 0011
부분 무한 반복된다. 이 표현을 찾는 한 가지 방법은 다음과 같습니다. 시작 R = 40분의 11 , 다음 반복의 값 때 1 위가 될 때 기록을 두 배로 소수 부분을 R의 반복, 당신은 당신이 루프를 입력 알고있다.
1. r = 11/40
2. 2*r = 11/20 < 1 -> next bit is 0, r = 11/20
3. 2*r = 11/10 >= 1 -> next bit is 1, r = 2*r - 1 = 1/10
4. 2*r = 1/5 < 1 -> next bit is 0, r = 1/5
5. 2*r = 2/5 < 1 -> next bit is 0, r = 2/5
6. 2*r = 4/5 < 1 -> next bit is 0, r = 4/5
7. 2*r = 8/5 >= 1 -> next bit is 1, r = 2*r - 1 = 3/5
8. 2*r = 6/5 >= 1 -> next bit is 1, r = 2*r - 1 = 1/5, same as in 4.
The loop 5. -> 6. -> 7. -> 8. now repeats.
이진 문자열에서 11/40으로 돌아가려면 수식을 사용할 수 있습니다
(int(prefix) + int(suffix)/(2^len(suffix) - 1)) / 2^len(prefix)
여기서 prefix
초기 부분은 010
, suffix
반복 부분 0011
및 int
정수 이진 스트링을 변환한다.
그러한 두 가지 표현이 주어지면 비트 XOR 연산을 수행 할 수 있습니다. 결과 시퀀스도 주기적이므로 합리적인 숫자를 나타냅니다.
일부 합리적인 숫자의 경우 두 가지 이진 표현이 있습니다.
1/4 = 0.010000000...
= 0.001111111...
이들 사이의 선택은 비트 XOR의 결과에 영향을 줄 수 있습니다. 이 경우 무한히 많은 0을 가진 이전 표현을 사용합니다.
작업
입력 값은 반 개방 간격 [0,1)에서 두 개의 유리수입니다. 출력은 입력에 적용된 비트 XOR 연산의 결과이며 합리적인 숫자로 표시됩니다. 입력이 모두 없더라도 출력은 1이 될 수 있습니다.
입력 및 출력의 정확한 형식은 유연하지만 각 합리적인 숫자는 분자와 분모의 두 정수로 표시되어야합니다 (0과 1은 제외 0
하고 1
원하는 경우 표시 할 수 있음 ). 입력이 가장 낮은 용어로 표현되었다고 가정 할 수 있습니다. 출력 은 가장 낮은 용어로 표현 되어야합니다 . 내장 된 유리수 유형은 이러한 제한을 만족하는 한 허용되는 형식입니다. 언어에 의해 부과 된 정수의 경계는 무시할 수 있지만 이론적으로 모든 합리적인 숫자에 대해 알고리즘이 작동해야합니다.
가장 낮은 바이트 수가 이깁니다. 표준 코드 골프 규칙이 적용됩니다.
예
입력 11/40 및 3/7을 고려하십시오. 파이프로 반복되는 부분을 구분하여 표현을 다른 것 위에 씁니다 |
. 그런 다음 동일한 길이의 반복 부분을 추출하고 비트 XOR을 그 부분과 그 앞 부분에 적용합니다.
11/40 = 0. 0 1 0|0 0 1 1|0 0 1 1|0 0 1 1|0 0 1 1|0 0 1 1|0 0 1 1|0 0 1 ...
3/7 = 0.|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|0 1 1|...
-> 0. 0 0 1|0 1 0 1 1 1 1 0 1 0 0 0|0 1 0 1 1 1 1 0 1 0 0 0|0 1 0 ...
결과 합리적인 숫자는 89/520입니다.
테스트 사례
0 0 -> 0
1/2 1/2 -> 0
1/2 1/4 -> 3/4
1/3 2/3 -> 1
1/2 3/4 -> 1/4
5/8 1/3 -> 23/24
1/3 1/5 -> 2/5
15/16 3/19 -> 257/304
15/16 257/304 -> 3/19
3/7 11/40 -> 89/520
5/32 17/24 -> 59/96
16/29 16/39 -> 621001733121535520/696556744961512799
000...
이 경우에끝나는 표현을 선택해야한다는 것을 암시합니다(또한 알고리즘을와 함께 사용하면 얻을 수 있음r
). 예를 들어에대한 확장을선택했기 때문에5/8, 1/3
얻을 수23/24
있습니다. 대신을선택하면XOR 이후의 결과가되므로 잘못되었습니다. 관련 위키 백과 : 0.999 ...0.101000...
5/8
0.10011111...
5/8
19/24
(a ^ b) ^ b == a
보유하지 않는다는 것을 의미합니다 . 예 (19/24 ^ 1/3) ^ 1/3 != 19/24
. 그로 인해 나는 이것에 대해 약간의 흥분을 잃었습니다. (