Giriş
0 ile 1 arasındaki her rasyonel sayı, sonunda periyodik bir bit dizisi olarak temsil edilebilir. Örneğin, 11/40 ikili gösterimi
0.010 0011 0011 0011 ...
nerede 0011
parçası süresiz tekrarlar. Bu temsili bulmanın bir yolu şudur. İle başlayın r = 11/40 , daha sonra art arda değeri zaman 1'in üstünde gittiğinde kayıt bunu iki katına ve fraksiyonel katılmak r tekrarlar, size bir döngü girmiş biliyorum.
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.
İkili dizeden 11 / 40'a geri dönmek için formülü kullanabilirsiniz.
(int(prefix) + int(suffix)/(2^len(suffix) - 1)) / 2^len(prefix)
burada prefix
ilk parçası 010
, suffix
tekrar bir parçasıdır 0011
ve int
tamsayıya ikili bir dizi dönüştürür.
Bu tür iki gösterim verildiğinde, bunlar üzerinde bitsel XOR işlemini gerçekleştirebiliriz. Ortaya çıkan dizi de periyodik olacaktır, bu nedenle rasyonel bir sayıyı temsil eder.
Bazı rasyonel sayılar için iki ikili gösterim vardır.
1/4 = 0.010000000...
= 0.001111111...
Aralarındaki seçim, bitsel XOR'un sonucunu etkileyebilir. Bu durumlarda, sonsuz sayıda 0'a sahip olan eski temsili kullanıyoruz.
Görev
Girişleriniz yarı açık aralıkta iki rasyonel sayıdır [0,1). Çıktınız, rasyonel bir sayı olarak ifade edilen, girdilere uygulanan bitsel XOR işleminin sonucu olacaktır. Girişlerin hiçbiri olmasa da, çıkışın 1 olabileceğini unutmayın.
Girdi ve çıktının kesin formatları esnektir, ancak her bir rasyonel sayı, pay ve payda olmak üzere iki tamsayı ile temsil edilmelidir ( istenirse 0
ve 1
istendiği takdirde temsil edilebilen 0 ve 1 hariç ). Girdilerin en düşük terimlerle ifade edildiğini varsayabilirsiniz. Çıktı en düşük terimlerle ifade edilmelidir . Yerleşik bir rasyonel sayı türü, bu kısıtlamaları karşıladığı sürece kabul edilebilir bir biçimdir. Diliniz tarafından dayatılan tam sayılardaki sınırları göz ardı edebilirsiniz, ancak algoritmanız teorik olarak tüm rasyonel sayılar için çalışmalıdır.
En düşük bayt sayısı kazanır. Standart kod golf kuralları geçerlidir.
Misal
11/40 ve 3/7 girişlerini göz önünde bulundurun. Temsillerini üst üste yazıyoruz, tekrarlayan parçaları boru ile sınırlıyoruz |
. Daha sonra eşit uzunlukta tekrar eden parçaları çıkarırız ve onlara ve onlardan önceki kısımlara bitsel XOR uygularız.
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 ...
Elde edilen rasyonel sayı 89/520'dir.
Test senaryoları
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...
, bu durumlardasona eren temsili seçmemiz gerekir(algoritmayı birlikte kullanırsak elde ettiğimiz de budurr
). Örneğin,5/8, 1/3
alacağımızdurumda23/24
genişlemeyi seçtiğimiz0.101000...
için5/8
. Bunun yerine seçerseniz0.10011111...
olarak5/8
, XOR hale geldikten sonra sonuç19/24
, bu nedenle bu yanlış. İlgili Vikipedi: 0.999 ...
(a ^ b) ^ b == a
. Örn (19/24 ^ 1/3) ^ 1/3 != 19/24
. Bu bana bu konuda biraz heyecan kaybettirdi :(