FatalError'ın harika cevabına ek olarak, satır return f(b)^f(a-1);daha iyi açıklanabilir. Kısacası, bunun nedeni XOR'un şu harika özelliklere sahip olmasıdır:
- Bu var çağrışımlı - Yer parantez nereye istersen
- Bu var değişmeli - vasıta etrafında operatörleri taşıyabilirsiniz (onlar "gidip")
İşte her ikisi de iş başında:
(a ^ b ^ c) ^ (d ^ e ^ f) = (f ^ e) ^ (d ^ a ^ b) ^ c
Bunun gibi:
a ^ b = c
c ^ a = b
Topla ve çarp, diğer ilişkilendirmeli / değişmeli operatörlere iki örnektir, ancak kendilerini tersine çevirmezler. Tamam, peki, bu özellikler neden önemli? Pekala, basit bir yol, onu gerçekte ne olduğu konusunda genişletmektir ve sonra bu özellikleri işte görebilirsiniz.
Önce ne istediğimizi tanımlayalım ve n diyelim:
n = (a ^ a+1 ^ a+2 .. ^ b)
Eğer yardımı olacaksa, XOR (^) 'u bir toplamaymış gibi düşünün.
İşlevi de tanımlayalım:
f(b) = 0 ^ 1 ^ 2 ^ 3 ^ 4 .. ^ b
bdeğerinden büyüktür a, bu yüzden birkaç ekstra parantez içine güvenli bir şekilde bırakarak (bunu ilişkilendirebiliriz çünkü yapabiliriz), şunu da söyleyebiliriz:
f(b) = ( 0 ^ 1 ^ 2 ^ 3 ^ 4 .. ^ (a-1) ) ^ (a ^ a+1 ^ a+2 .. ^ b)
Aşağıdakileri basitleştirir:
f(b) = f(a-1) ^ (a ^ a+1 ^ a+2 .. ^ b)
f(b) = f(a-1) ^ n
Sonra, bize sihirli çizgiyi vermek için bu ters özelliği ve değişme özelliğini kullanıyoruz:
n = f(b) ^ f(a-1)
XOR'u bir toplama gibi düşünüyor olsaydınız, orada bir çıkarmaya düşerdiniz. XOR, XOR için ne eklenecekse!
Bunu kendim nasıl bulabilirim?
Mantıksal operatörlerin özelliklerini hatırlayın. Onlarla neredeyse bir toplama veya çarpma gibi çalışın. (&), Xor (^) ve veya (|) çağrışımsal olmaları alışılmadık geliyor ama onlar!
İlk önce saf uygulamayı çalıştırın, çıktıdaki kalıpları arayın, ardından modelin doğru olduğunu onaylayan kuralları bulmaya başlayın. Uygulamanızı daha da basitleştirin ve tekrarlayın. Muhtemelen orijinal yaratıcının izlediği yol budur ve tamamen optimal olmadığı gerçeğiyle vurgulanır (yani bir dizi yerine bir anahtar ifadesi kullanın).