जे , 40 बाइट्स
2%~[:+/^:_]<:[:+/&.:*:"1[:-"1/~#~#:i.@^~
इसे ऑनलाइन आज़माएं!
यदि आप विस्तारित परिशुद्धता ( 5x
इसके बजाय 5
) का उपयोग करते हैं, तो 5 के लिए TIO पर समय निकालेंगे । मैं अपने कंप्यूटर पर 6 के साथ कोशिश करने के लिए परेशान नहीं जा रहा हूँ क्योंकि इससे कोई संदेह नहीं कि दुभाषिया दुर्घटनाग्रस्त हो जाएगा।
गोल्फिंग पर सलाह की तलाश, विशेष रूप से निर्देशांक की पीढ़ी के अतीत का हिस्सा। मुझे लगता है कि कुछ कैप को हटाने का एक तरीका होना चाहिए।
]<:[:+/&.:*:"1
इसकी तुलना अनिवार्य रूप से की जा सकती है *:<:[:+/"1[:*:
।
व्याख्या
यह स्पष्टीकरण आरईपीएल पर किया गया है (तीन रिक्त स्थान एक कमांड का संकेत देते हैं, कोई रिक्त स्थान आउटपुट का संकेत नहीं देता है)। मैं जवाब के लिए निर्माण किया जाएगा।
निर्देशांक उत्पन्न करना
#~ #: i.@^~
सभी निर्देशांक जिन्हें हम जाली पर ध्यान देते हैं।
^~
अपने आप में एक संख्या है, और i.
वह सीमा देता है [0, n) जहां n इसका इनपुट है। @
उन कार्यों को बनाता है।
i.@^~ 2
0 1 2 3
#~
अपने आप से एक संख्या की प्रतिलिपि बनाता है, जैसे
#~ 3
3 3 3
#:
अपने दाएं तर्क को उसके बाएं तर्क के रूप में दिए गए सरणी द्वारा निर्दिष्ट आधार पर धर्मान्तरित करता है। सरणी में अंकों की संख्या उस आधार आउटपुट में अंकों की संख्या से मेल खाती है (और आपके पास मिश्रित आधार हो सकता है) उदाहरण के लिए
3 3 3 #: 0
0 0 0
5 5 #: 120
4 0
NB. If you want 120 base 5 use #.inv
#.inv 120
4 4 0
इसलिए, सभी एक साथ, यह सभी मानों के माध्यम से गणना करते हैं आधार n (जहां n इनपुट है) तक n ^ n, प्रभावी रूप से हमें हमारे निर्देशांक दे रहा है।
(#~ #: i.@^~) 2
0 0
0 1
1 0
1 1
प्रत्येक जोड़ी के बीच दूरी प्राप्त करना
पहले हम प्रत्येक युग्म का उपयोग कर दूसरों के सभी के साथ समन्वय का अंतर ले /
-table और ~
-reflexive। ध्यान दें कि यह इस तथ्य के लिए जिम्मेदार नहीं है कि जोड़े के लिए आदेश मायने नहीं रखता है: यह डुप्लिकेट दूरी उत्पन्न करता है।
NB. 2 {. takes the first two elements (I'm omitting the rest).
2 {. -"1/~ (#~ #: i.@^~) 2
0 0
0 _1
_1 0
_1 _1
0 1
0 0
_1 1
_1 0
फिर हम इस क्रिया का +/&.:*:
प्रत्येक समन्वय (पर "1
, उर्फ रैंक एक) पर उपयोग करते हैं। यह क्रिया योग है ( +/
) के तहत ( &.:
) वर्ग ( *:
)। के तहत सही क्रिया (वर्ग) को लागू करता है और फिर इसके परिणाम एकत्र करता है और इसे बाएं क्रिया (योग) के तर्क के रूप में देता है। यह फिर सही क्रिया के व्युत्क्रम को लागू करता है (जो वर्गमूल होगा)।
+/&.:*: 3 4
5
+/&.:*:"1 ([: -"1/~ #~ #: i.@^~) 2
0 1 1 1.41421
1 0 1.41421 1
1 1.41421 0 1
1.41421 1 1 0
अप्रत्याशित रूप से, कई दूरियां समान हैं।
इनपुट से अधिक या उसके बराबर दूरी की गणना करना
अंतिम भाग यह देख रहा है कि दूरी इनपुट के उपयोग से अधिक या बराबर है या नहीं ]<:
। तब सभी परिणामों का उपयोग करके सारांशित किया जाता है +/^:_
(योग जब तक अभिसरण), सत्य मूल्यों की संख्या की गिनती। फिर इस मान को 2 से विभाजित किया जाता है ( मतलब 2%~
, यहां ~
दिए गए तर्कों के क्रम को स्वैप करें %
)। हम 2 से विभाजित कर सकते हैं इसका कारण यह है कि प्रत्येक सत्य जोड़ी के लिए, युग्मित को छोड़कर फ़्लिप किए गए आदेश के लिए एक और एक होगा जो स्वयं के साथ एक समन्वय है। हालांकि, यह ठीक है, क्योंकि उन लोगों के परिणामस्वरूप 0 की दूरी होगी।