Mathematica, 111 105 104 bayt
r=Floor[(1+Sqrt[(4#-1)/3])/2]&;t=Limit[Pi(#/(3x)+1-x),x->r@#]&;p=r@#*Exp[I*t@#]&;Round@Abs[p@#-p@#2]==1&
Açıklama:
r=Floor[(1+Sqrt[(4#-1)/3])/2]&
r
girdi alan #
ve hücreye 0 olan mesafeyi (hücre sayısında) hesaplayan bir işlevi tanımlar. Bunu her mesafenin / halkanın son hücrelerinde modelden yararlanarak yapar: 0 = 3 (0 ^ 2 + 0), 6 = 3 (1 ^ 2 + 1), 18 = 3 (2 ^ 2 + 2), 36 = 3 (3 ^ 2 + 3), ... ve bu kalıp için formülü ters çevirerek. Hücre 0 için, gerçekte 0 + 0 * i = 0 elde etmek için bileşen-bilgiyi hesaplayan (1/2) + i * (sqrt (3) / 6) tabanını aldığını unutmayın .
İle r
tanımlanan, r@#
hücre için halka olan #
(başka bir fonksiyon tanımlama içinde). #+3r@#-3(r@#)^2&
kodda tam olarak görünmüyor, ancak bir hücrenin sayısını alıyor ve bir sonraki iç halkadaki en yüksek hücrenin sayısını çıkartıyor, böylece “mevcut halkanın hangi hücresi bu?” sorusuna cevap veriyor. Örneğin, hücre 9, halka 2'nin 3. hücresidir, yani r[9]
2 çıktısı ve #+3r@#-3(r@#)^2&[9]
3 çıktısı olacaktır.
Yukarıdaki işlevle yapabileceğimiz şey , "açılı hücre 0, hücre 17, hücre 58" ışından söz konusu hücreye kadar kutupsal açıyı , saat yönünün tersine açıyı bulmak için kullanmaktır . Her halkanın son hücresi daima Pi / 6 açısındadır ve Pi / (3 * ring_number) artışlarıyla bir halkanın etrafında gideriz. Dolayısıyla teoride Pi / 6 + (which_cell_of_the_current_ring) * Pi / (3 * ring_number) gibi bir şey hesaplamamız gerekiyor. Bununla birlikte, resmin döndürülmesi hiçbir şeyi etkilemez, bu yüzden Pi / 6 bölümünü silebiliriz (6 bayt kurtarmak için). Bunu önceki formülle birleştirip sadeleştirerek,Pi(#/(3r@#)+1-r@#)&
Ne yazık ki, bu hücre 0 için tanımsızdır, çünkü halka numarası 0'dır, bu yüzden bunu aşmamız gerekir. Doğal bir çözüm gibi bir şey olurdu t=If[#==0,0,Pi(#/(3r@#)+1-r@#)]&
. Fakat 0 hücresi için açıyı umursamadığımızdan ve r@#
tekrar edildiğinden dolayı , aslında burada bir byte kaydedebiliriz.t=Limit[Pi(#/(3x)+1-x),x->r@#]&
Şimdi halka numarasına ve açısına sahip olduğumuza göre, bir hücrenin konumunu (merkez) bulabiliriz, böylece bitişikliği test edebiliriz. Gerçek pozisyonu bulmak can sıkıcıdır, çünkü halkalar altıgendir, ancak halkaları mükemmel daireler gibi gösterebiliriz, böylece halka numarasını hücre 0'ın merkezine kadar olan mesafe olarak değerlendirebiliriz. kapat. Karmaşık bir sayının kutup şeklini kullanarak, bu yaklaşık konumu karmaşık düzlemde basit bir işlevle temsil edebiliriz :p = r@#*Exp[I*t@#] &;
Kompleks düzlemdeki iki karmaşık sayı arasındaki mesafe , farklarının mutlak değeri ile verilir ve daha sonra, yaklaşmadaki herhangi bir hatayı gidermek için sonucu yuvarlayabiliriz ve bunun 1'e eşit olup olmadığını kontrol edebiliriz. bu eserin bir ismi yok mu, ama Round@Abs[p@#-p@#2]==1&
.
Şunları yapabilirsiniz çevrimiçi denemek içinde Wolfram Bulut kum havuzu :> "hücreyi değerlendirin" veya Shift + Enter isabet veya sayısal tuş takımı girin - Gear aşağıdaki gibi bir kodu yapıştırıp tıklayarak
r=Floor[(1+Sqrt[(4#-1)/3])/2]&;t=Limit[Pi(#/(3x)+1-x),x->r@#]&;p=r@#*Exp[I*t@#]&;Round@Abs[p@#-p@#2]==1&[24,45]
Veya tüm test durumları için:
r=Floor[(1+Sqrt[(4#-1)/3])/2]&;t=Limit[Pi(#/(3x)+1-x),x->r@#]&;p=r@#*Exp[I*t@#]&;Round@Abs[p@#-p@#2]==1&//MapThread[#,Transpose[{{0,1},{7,18},{8,22},{24,45},{40,64},{64,65},{6,57},{29,90},{21,38},{38,60},{40,63},{41,39},{40,40}}]]&