गणितज्ञ, 111 105 104 बाइट्स
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&
स्पष्टीकरण:
r=Floor[(1+Sqrt[(4#-1)/3])/2]&
एक फ़ंक्शन को परिभाषित करता है r
जो इनपुट लेता है #
और सेल के लिए दूरी (कोशिकाओं की संख्या) में गणना करता है। यह प्रत्येक दूरी / अंगूठी के अंतिम कोशिकाओं में पैटर्न का शोषण करके ऐसा करता है: 0 = 3 (0 ^ 2 + 0), 6 = 3 (1 ^ 2 + 1), 18 = 3 (2 ^ 2 + 2), 36 = 3 (3 ^ 2 + 3), ... और उस पैटर्न के सूत्र को सम्मिलित करते हुए। ध्यान दें कि सेल 0 के लिए, यह वास्तव में (1/2) + i * (sqrt (3) / 6) की मंजिल लेता है , जिसे यह 0 + 0 * i = 0 प्राप्त करने के लिए घटक-वार की गणना करता है ।
r
परिभाषित के साथ , r@#
सेल के लिए रिंग है #
(किसी अन्य फ़ंक्शन की परिभाषा के अंदर)। #+3r@#-3(r@#)^2&
कोड में बिल्कुल दिखाई नहीं देता है, लेकिन यह एक सेल की संख्या लेता है और अगले इनर रिंग में सबसे अधिक सेल को घटाता है, जिससे यह प्रश्न का उत्तर देता है "वर्तमान रिंग का कौन सा सेल है?" उदाहरण के लिए, सेल 9 रिंग 2 की तीसरी सेल है, इसलिए r[9]
2 और आउटपुट होगा#+3r@#-3(r@#)^2&[9]
आउटपुट 3 होगा।
ऊपर के फ़ंक्शन के साथ हम क्या कर सकते हैं इसका उपयोग ध्रुवीय कोण खोजने के लिए किया जाता है , काउंटर-क्लॉकवाइज कोण "सेल 0, सेल 17, सेल 58" किरण से सेल में प्रश्न पूछने के लिए किया जाता है। हर रिंग की आखिरी सेल हमेशा कोण Pi / 6 पर होती है, और हम Pi / / (3 * ring_number) की वृद्धि में एक अंगूठी के चारों ओर जाते हैं। तो, सिद्धांत रूप में, हमें पाई / 6 + (who_cell_of_the_current_ring) * Pi / (3 * ring_number) जैसी किसी चीज़ की गणना करने की आवश्यकता है। हालाँकि, चित्र का घूमना कुछ भी प्रभावित नहीं करता है, इसलिए हम Pi / 6 भाग (6 बाइट्स को बचाने के लिए) को त्याग सकते हैं। पिछले सूत्र के साथ इसे जोड़कर और सरल करते हुए, हम प्राप्त करते हैंPi(#/(3r@#)+1-r@#)&
दुर्भाग्य से, यह सेल 0 के लिए अपरिभाषित है क्योंकि इसकी रिंग संख्या 0 है, इसलिए हमें इसके चारों ओर जाने की आवश्यकता है। एक प्राकृतिक समाधान कुछ इस तरह होगा t=If[#==0,0,Pi(#/(3r@#)+1-r@#)]&
। लेकिन जब से हम सेल 0 के लिए कोण के बारे में परवाह नहीं करते हैं और क्योंकि r@#
दोहराया जाता है, हम वास्तव में यहां एक बाइट बचा सकते हैंt=Limit[Pi(#/(3x)+1-x),x->r@#]&
अब जब हमारे पास रिंग नंबर और कोण है, तो हम एक सेल (केंद्र) की स्थिति का पता लगा सकते हैं ताकि हम आसन्नता के लिए परीक्षण कर सकें। वास्तविक स्थिति का पता लगाना कष्टप्रद है क्योंकि रिंग्स हेक्सागोनल हैं, लेकिन हम केवल यह कह सकते हैं कि रिंग्स सही सर्कल हैं ताकि हम रिंग नंबर को सेल के केंद्र की दूरी के रूप में मानें। 0. यह एक समस्या नहीं होगी क्योंकि सन्निकटन सुंदर है बंद करे। एक जटिल संख्या के ध्रुवीय रूप का उपयोग करते हुए , हम एक साधारण फ़ंक्शन के साथ जटिल विमान में इस अनुमानित स्थिति का प्रतिनिधित्व कर सकते हैं :p = r@#*Exp[I*t@#] &;
जटिल विमान पर दो जटिल संख्याओं के बीच की दूरी उनके अंतर के निरपेक्ष मान द्वारा दी गई है , और फिर हम सन्निकटन से किसी भी त्रुटि का ध्यान रखने के लिए परिणाम को गोल कर सकते हैं, और जांच सकते हैं कि यह 1 के बराबर है। अंत में फ़ंक्शन क्या इस काम में नाम नहीं है, लेकिन है Round@Abs[p@#-p@#2]==1&
।
आप निम्न और क्लिक गियर की तरह कोड चिपकाकर वुल्फराम क्लाउड सैंडबॉक्स में इसे ऑनलाइन आज़मा सकते हैं -> "सेल का मूल्यांकन करें" या Shift + Enter या numpad को दबाकर दर्ज करें:
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]
या सभी परीक्षण मामलों के लिए:
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}}]]&