घुमावदार संख्या की गणना करें


15

घुमावदार संख्या शुद्ध वामावर्त क्रांतियों एक पर्यवेक्षक किसी दिए गए बंद मार्ग का अनुसरण करने छोड़ी होगी की पूर्णांक संख्या है। ध्यान दें कि किसी भी दक्षिणावर्त क्रांतियाँ घुमावदार संख्या के प्रति ऋणात्मक होती हैं। पथ को आत्म-प्रतिच्छेद की अनुमति है।

कुछ उदाहरण (बेशर्मी से विकिपीडिया से लिए गए) नीचे दिए गए हैं:

यहां छवि विवरण दर्ज करें

आपका लक्ष्य किसी दिए गए मार्ग के लिए घुमावदार संख्या की गणना करना है।

इनपुट

प्रेक्षक को मूल माना जाता है (0,0)

इनपुट किसी भी वांछित इनपुट स्रोत से बिंदुओं (जोड़ी-पूर्णांक संख्याओं के समान) का एक परिमित अनुक्रम है जो टुकड़ा-वार रैखिक पथ का वर्णन करता है। आप चाहें तो पूर्णांक संख्याओं के 1D अनुक्रम में इसे समतल कर सकते हैं, और सभी y निर्देशांक / vise-versa से पहले सभी x निर्देशांक लेने के लिए इनपुट को स्वाइल भी कर सकते हैं। आप इनपुट को एक जटिल संख्या के रूप में भी ले सकते हैंa+b i । पथ आत्म-प्रतिच्छेद कर सकता है और इसमें शून्य-लंबाई खंड हो सकते हैं। पहला बिंदु पथ की शुरुआत है और सकारात्मक एक्स अक्ष पर कहीं झूठ बोलने के लिए माना जाता है।

पथ का कोई भी हिस्सा मूल को नहीं काटेगा। मार्ग हमेशा बंद रहेगा (यानी पहला और खोया बिंदु समान हैं)। आपका कोड या तो अंतिम बिंदु को लागू कर सकता है या इसे शामिल करने की आवश्यकता हो सकती है।

उदाहरण के लिए, आपकी प्राथमिकता के आधार पर दोनों इनपुट समान वर्ग निर्दिष्ट करते हैं:

निहित अंत बिंदु

1,0
1,1
-1,1
-1,-1
1,-1

स्पष्ट अंत बिंदु

1,0
1,1
-1,1
-1,-1
1,-1
1,0

उत्पादन

आउटपुट घुमावदार संख्या के लिए एक पूर्णांक है। यह किसी भी स्रोत (रिटर्न मान, स्टडआउट, फ़ाइल, आदि) के लिए हो सकता है।

उदाहरण

सभी उदाहरणों में अंत बिंदु स्पष्ट रूप से परिभाषित है और x, y जोड़े के रूप में दिए गए हैं। संयोग से, आपको इन उदाहरणों को सीधे किसी भी कोड में फ़ीड करने में सक्षम होना चाहिए, जो कि स्पष्ट रूप से परिभाषित अंत बिंदु हैं और आउटपुट समान होना चाहिए।

1. मूल परीक्षण

1,0
1,1
-1,1
-1,-1
1,-1
1,0

उत्पादन

1

2. दोहराया बिंदु परीक्षण

1,0
1,0
1,1
1,1
-1,1
-1,1
-1,-1
-1,-1
1,-1
1,-1
1,0

उत्पादन

1

3. दक्षिणावर्त परीक्षण

1,0
1,-1
-1,-1
-1,1
1,1
1,0

उत्पादन

-1

4. बाहर का परीक्षण

1,0
1,1
2,1
1,0

उत्पादन

0

5. मिश्रित घुमावदार

1,0
1,1
-1,1
-1,-1
1,-1
1,0
1,-1
-1,-1
-1,1
1,1
1,0
1,1
-1,1
-1,-1
1,-1
1,0
1,1
-1,1
-1,-1
1,-1
1,0

उत्पादन

2

स्कोरिंग

यह कोड गोल्फ है; सबसे छोटा कोड जीतता है। मानक खामियां लागू होती हैं। आप किसी भी अंतर्निहित कार्यों का उपयोग तब तक कर सकते हैं जब तक कि वे विशेष रूप से घुमावदार संख्या की गणना करने के लिए डिज़ाइन नहीं किए गए थे।


2
क्या इनपुट को जटिल संख्याओं (या उनमें से एक स्ट्रिंग प्रतिनिधित्व, जैसे "1-i"या "1-1i"?) के रूप में लिया जा सकता है
लेवल रिवर सेंट

हां, किसी भी प्रकार की जोड़ी की अनुमति है।
helloworld922

जवाबों:


10

ईएस 6, 83 बाइट्स

a=>a.map(([x,y])=>r+=Math.atan2(y*b-x*c,y*c+x*b,b=x,c=y),b=c=r=0)&&r/Math.PI/2

इनपुट के रूप में बिंदुओं के जोड़े की एक सरणी होती है जिसे जटिल संख्या के रूप में व्याख्या की जाती है। प्रत्येक बिंदु को एक कोण में परिवर्तित करने के बजाय, बिंदुओं को पिछले बिंदु से विभाजित किया जाता है, जिसे Math.atan2 तब-an और ts के बीच के कोण में परिवर्तित करता है, इस प्रकार स्वचालित रूप से यह निर्धारित करता है कि रास्ता किस मार्ग से घुमावदार है। कोणों का योग तो घुमावदार संख्या से 2π गुना अधिक है।

चूंकि Math.atan2 अपने तर्कों के पैमाने की परवाह नहीं करता है, इसलिए मैं वास्तव में पूर्ण विभाजन नहीं करता हूं z / w = (z * w*) / (w * w*) करता हूं इसके बजाय मैं पिछले बिंदु के जटिल संयुग्म द्वारा प्रत्येक बिंदु को गुणा करता हूं।

संपादित करें: सहेजे गए 4 बाइट @ edc65 के लिए धन्यवाद।


अच्छा और तेज। और मैं आपके गणित को नहीं समझता। लेकिन reduceलगभग हमेशा एक बुरा विकल्प है।
edc65

a=>a.map(([x,y])=>r+=Math.atan2(y*b-x*c,y*c+x*b,b=x,c=y),b=c=r=0)&&r/Math.PI/2इसके बजाय मानचित्र का उपयोग करना या कम करना। मेरे पास वैसे भी मेरा वोट है
edc65

@ edc65 धन्यवाद; मैंने इस्तेमाल किया reduceक्योंकि मुझे एहसास नहीं था कि Math.atan2 (0,0) 0. है (खैर, यह इस बात पर निर्भर करता है कि क्या आपका 0s वास्तव में -0 है।) गणित जटिल विभाजन पर आधारित है, जिसे सामान्य रूप से गणना की जाती है। z / w = z * w* / |w|², लेकिन मैं परिमाण के बारे में परवाह नहीं करता, इसलिए यह जटिल संयुग्म द्वारा गुणा है। इसके अलावा थोड़ा भ्रमित करना Math.atan2 स्वीकार करता है (y, x) तर्क।
नील

मैं मानता हूं कि मैं कोड को नहीं समझता, लेकिन यदि आपका विवरण सटीक है, तो मेरा मानना ​​है कि आपका उत्तर गलत है। वास्तव में, यदि आप इस पथ से अंक प्राप्त करते हैं (मैं अधिक स्पष्टता के लिए एक चित्र दे रहा हूं) तो घुमावदार संख्या 1 है, जबकि आपकी समस्या 2 आउटपुट होगी
वोजूव

@Wojowu क्षमा करें, मेरा मतलब है कि बहुभुज के बाहरी कोणों के बजाय मूल से मापे गए बिंदुओं के बीच का कोण, इसलिए आपकी तस्वीर के लिए, मेरे कोड को वास्तव में उत्तर की गणना 1 के रूप में करनी चाहिए
Neil

3

Matl , 11 बाइट्स

X/Z/0)2/YP/

इनपुट अंतिम बिंदु सहित जटिल संख्याओं का एक क्रम है।

इसे ऑनलाइन आज़माएं!

व्याख्या

अधिकांश Z/कार्य फ़ंक्शन ( unwrap) द्वारा किया जाता है , जो अपने 2 * पीआई पूरक के लिए पीआई के बराबर या उससे अधिक पूर्ण छलांग लगाकर रेडियन में कोणों को खोल देता है।

X/       % compute angle of each complex number
Z/       % unwrap angles
0)       % pick last value. Total change of angle will be a multiple of 2*pi because 
         % the path is closed. Total change of angle coincides with last unwrapped
         % angle because the first angle is always 0
2/       % divide by 2
YP/      % divide by pi

1
MATL और जेली ने हाल ही में अधिकांश मैथी चुनौतियों को बांधा है। मैं प्रभावित हूँ, आपने लगभग मेटा-गोल्फ वाली डेनिस की भाषा ...
ETHproductions

@ETHproductions आपके अच्छे शब्दों के लिए धन्यवाद! हां, उन्हें हाल की कुछ चुनौतियों से जोड़ा गया है। दूसरी ओर, मैंने काफी कुछ समस्याओं को देखा है जहाँ जेली की बाइट गिनती लगभग आधी है क्योंकि MATL :-D
लुइस

2

जेली, 11 बाइट्स

æAI÷ØPæ%1SH

यह इनपुट को y- निर्देशांक की सूची और x-निर्देशांक की सूची के रूप में लेता है।

इसे यहाँ आज़माएँ ।


1

अजगर, 111

अब तक का सबसे लंबा जवाब। मेरी प्रेरणाएँ 1 हैं) अजगर सीखें और 2) संभवतः इसे अजगर तक पहुंचा दें।

from cmath import *
q=input()
print reduce(lambda x,y:x+y,map(lambda (x,y):phase(x/y)/pi/2,zip(q[1:]+q[:1],q)))

इनपुट को जटिल संख्याओं की सूची के रूप में दिया गया है।

Ideone।

मुझे लगता है कि दृष्टिकोण ES6 उत्तर के समान है।

जब 2 जटिल संख्याओं को गुणा किया जाता है, तो उत्पाद का तर्क या चरण दो संख्याओं के तर्क या चरण का योग होता है। इस प्रकार जब एक जटिल संख्या को दूसरे से विभाजित किया जाता है, तो भागफल का चरण अंश और भाजक के चरणों के बीच का अंतर होता है। इस प्रकार हम प्रत्येक बिंदु और अगले बिंदु के माध्यम से आरेखित कोण की गणना कर सकते हैं। इन कोणों को विभाजित करें और 2π से भाग दें, आवश्यक घुमावदार संख्या देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.