ट्रैक
/
R
R
/
अभ्यास
/
कौवा कैब
कौवा कैब

कौवा कैब

सीखने का अभ्यास

परिचय

Complex numbers मुश्किल नहीं हैं। इन्हें बस एक कम डरावने नाम की ज़रूरत है।

कॉम्प्लेक्स संख्याएँ इतनी उपयोगी हैं, खास तौर पर इंजीनियरिंग और विज्ञान में, कि R इन्हें integer, double, logical, character और raw जैसे मानक एटॉमिक टाइप के साथ शामिल करता है।

बुनियादी बातें

R में एक complex संख्या एक अकेली वैल्यू होती है। लेकिन इस्तेमाल करते समय इसे दो संख्याओं के एक जोड़े की तरह देखा जा सकता है। ऐतिहासिक कारणों से इन्हें "वास्तविक" और "काल्पनिक" भाग कहा जाता है, जो बदकिस्मती है। फिर भी, बेहतर यही होगा कि आप इन अजीब नामों के बजाय इसकी मूल सादगी पर ध्यान दें।

दो वास्तविक संख्याओं से कॉम्प्लेक्स संख्याएँ बनाने के लिए काल्पनिक भाग के आगे बस i लगा दीजिए।

2+3i
#> [1] 2+3i

typeof(2+3i)
#> [1] "complex"

वास्तविक वेरिएबलो से कॉम्प्लेक्स संख्या बनाने के लिए ऊपर दिया गया सिंटैक्स काम नहीं करेगा। r + imi लिखने पर पार्सर को लगता है कि imi कोई वेरिएबल नाम है, हालाँकि ऐसा कोई वेरिएबल है ही नहीं।

या तो काल्पनिक भाग को 1i से गुणा कीजिए, या [complex()][ref-complex] फंक्शन का इस्तेमाल कीजिए:

r <- 2
im <- 3

r + im * 1i
#> [1] 2+3i

# must include the `real` and `imaginary` keywords
complex(real = r, imaginary = im)
#> [1] 2+3i

आप सोच सकते हैं कि j की जगह i क्यों?

ज़्यादातर इंजीनियर j को पसंद करते हैं। ज़्यादातर वैज्ञानिक और गणितज्ञ काल्पनिक के लिए गणितीय संकेतन i पसंद करते हैं, लेकिन यह संकेतन इलेक्ट्रिकल इंजीनियरिंग में धारा के अर्थ में i के इस्तेमाल से टकराता है।

R ने i चुना, Python ने j चुना, और Julia ने im चुनकर इस विवाद को टाल दिया। [STEM][wiki-STEM] प्रोग्रामिंग भाषाओं के बीच आते-जाते समय सावधान रहिए।

कॉम्प्लेक्स संख्या के भागों को अलग-अलग निकालने के लिए:

z <- 2+3i

Re(z)  # real part
#> [1] 2

Im(z)  # imaginary part
#> [1] 3

कोई भी भाग शून्य हो सकता है, और ऐसी स्थिति में गणितज्ञ उस संख्या को "पूरी तरह वास्तविक" या "पूरी तरह काल्पनिक" कह सकते हैं। लेकिन R में यह फिर भी एक कॉम्प्लेक्स संख्या ही रहती है।

1.2 + 0i
#> [1] 1.2+0i

typeof(1.2 + 0i)
#> [1] "complex"

2i
#> [1] 0+2i

typeof(2i)
#> [1] "complex"

आपने यह सुना होगा कि "i (या j) -1 का वर्गमूल है"।

फिलहाल, इसका मतलब बस इतना है कि काल्पनिक भाग परिभाषा से नीचे दी गई समानता को संतुष्ट करता है:

1i * 1i == -1  # more precisely, 1i * 1i == -1 + 0i
#> [1] TRUE

यह एक सरल विचार है, लेकिन इसके दिलचस्प परिणाम सामने आते हैं।

अंकगणित

दशमलव संख्याओं और पूर्णांकों के साथ इस्तेमाल होने वाले ज़्यादातर ऑपरेटर कॉम्प्लेक्स संख्याओं के साथ भी काम करते हैं:

z1 = 1.5 + 2i
z2 = 2 + 1.5i

z1 + z2  # addition
#> [1] 3.5+3.5i

z1 * z2  # multiplication
#> [1] 0+6.25i

z1 / z2  # division
#> [1] 0.96+0.28i

z1^2  # exponentiation
#> [1] -1.75+6i

2^z1  # another exponentiation
#> [1] 0.518895+2.780422i

फंक्शन

ज़्यादातर गणितीय फंक्शन कॉम्प्लेक्स इनपुट के साथ काम करते हैं।

Re() और Im() के अलावा कुछ और फंक्शन भी हैं, जो कॉम्प्लेक्स संख्याओं के लिए खास तौर पर काम के हैं।

  • Conj() कॉम्प्लेक्स संख्या के काल्पनिक भाग का चिह्न बस उलट देता है (+ से - या इसके उलट)।
    • कॉम्प्लेक्स गुणा जिस तरह काम करता है, उस हिसाब से यह आपकी सोच से कहीं ज़्यादा उपयोगी है।
  • abs(<complex number>) हमेशा एक वास्तविक संख्या लौटाता है जिसका कोई काल्पनिक भाग नहीं होता (इसका "मापांक"), और Mod(<complex number>) इसका समानार्थी है।
  • Arg(<complex number>) रेडियन में फेज़ कोण लौटाता है।
z1
#> [1] 1.5+2i

abs(z1)
#> [1] 2.5

Mod(z1)  # same as previous
#> [1] 2.5

Conj(z1)  # flip sign
#> [1] 1.5-2i

Arg(z1)
#> [1] 0.9272952

निर्देश

आपको अभी-अभी एक नई कैब सेवा में नौकरी मिली है, जो पहले से भरे हुए बाज़ार में दूसरी सेवाओं से अपनी अलग पहचान बनाने की कोशिश कर रही है। इसके लिए CEO ने तय किया है कि मैनहट्टन में एक बेहद शानदार सेवा शुरू की जाएगी, जिसमें हर चौराहे पर अटेंडेंट होंगे, जो ग्राहकों की मदद उनकी सवारी से पहले और बाद में करेंगे। अब आपको कुछ कोड लिखना है, जो इस सेवा के संचालन में मदद करेगा।

1. सरल सम्मिश्र संख्या

आपके CEO का मानना है कि चूँकि मैनहट्टन की सड़कें मुख्य रूप से ग्रिड जैसी बनी हैं, इसलिए सड़कों के चौराहों को दर्शाने का एक सुविधाजनक तरीका सम्मिश्र संख्या है। इसमें धनात्मक और ऋणात्मक वास्तविक संख्याएँ क्रमशः पूर्व और पश्चिम को दर्शाती हैं, और धनात्मक तथा ऋणात्मक काल्पनिक संख्याएँ उत्तर और दक्षिण को।

चूँकि R में सम्मिश्र संख्या बनाना थोड़ा, एर... अलग तरह का काम है, इसलिए आपको निर्देश दिया गया है कि एक सरल सम्मिश्र संख्या फंक्शन बनाइए।

simplex(a, b) फंक्शन बनाइए, जो पूर्णांक a और b लेता है। सम्मिश्र संख्या a+bi लौटाइए।

simplex(1, 1)
#> 1+1i

simplex(-3, 4)
#> -3+4i

2. ड्राइवर की दिशाएँ निकालिए

जब कोई ग्राहक मंज़िल का चौराहा बताता है, तो आपके ड्राइवरों को वहाँ पहुँचने की दिशाएँ मिल जाती हैं। ये दिशाएँ सम्मिश्र संख्या के रूप में मिलती हैं, जिसमें वास्तविक भाग बताता है कि उत्तर/दक्षिण में कितने ब्लॉक जाना है, और काल्पनिक भाग पूर्व/पश्चिम की दूरी बताता है। मानक कम्पास से मेल बैठाने के लिए आपके प्रोजेक्ट मैनेजर ने तय किया है कि उत्तर धनात्मक काल्पनिक दिशा में होगा और दक्षिण ऋणात्मक काल्पनिक दिशा में। इसी तरह पूर्व धनात्मक वास्तविक दिशा में है और पश्चिम ऋणात्मक वास्तविक दिशा में।

driver_directions(start, end) फंक्शन बनाइए, जो start वाले चौराहे के निर्देशांक और end मंज़िल के निर्देशांक लेता है। एक सम्मिश्र संख्या लौटाइए, जो बताती है कि ड्राइवर को पूर्व/पश्चिम + उत्तर/दक्षिण में कितने ब्लॉक जाना है।

driver_directions(0+0i, 7+5i)
#> 7+5i

driver_directions(-2+3i, 4-5i)
#> 6-8i

3. मैनहट्टन दूरी निकालिए

ग्राहक से उस दूरी का शुल्क लिया जाता है, जितनी कैब को तय करनी होती है। चूँकि मैनहट्टन की सड़कें ग्रिड जैसी बनी हैं, टैक्सियाँ सिर्फ इन्हीं मार्गों पर चल सकती हैं। इस बनावट के कारण दूरी नापने का एक ऐसा तरीका बनता है, जो ग्रिड की रेखाओं के साथ चलने तक सीमित है। यह दूरी या तो तय की गई रेखाओं की संख्या जोड़कर निकाली जा सकती है, या उन चौराहों की संख्या जोड़कर, जहाँ पहुँचा गया (यानी शुरुआती चौराहे को छोड़कर)। इस माप को आम तौर पर मैनहट्टन दूरी या L1 नॉर्म कहा जाता है।

manhattan(start, end) फंक्शन बनाइए, जो start और end चौराहे लेता है। start और end चौराहों के बीच की मैनहट्टन दूरी लौटाइए।

manhattan(0+0i, 3+4i)
#> 7

manhattan(-2-3i, -1+1i)
#> 5

4. "कौए के उड़ने की दूरी" निकालिए

CEO निवेश बैंकों को इस बात पर राज़ी कर पाए कि यह सेवा बेहद शानदार होने के साथ-साथ पर्यावरण के अनुकूल भी है, क्योंकि इसमें प्रशिक्षित कौओं से चौराहों पर तैनात अटेंडेंटों के बीच संदेश पहुँचाए जाएँगे (जो सवारी से जुड़ी जानकारी आगे भेजते हैं, ताकि हर ग्राहक को निजी अनुभव मिल सके)। लगता है कि निवेश बैंकरों में से किसी ने भी यह पता करने की कोशिश नहीं की कि यह सेवा वास्तव में पर्यावरण के अनुकूल कैसे है, या वह किस तरह का CEO है जिसे खाली समय में कौए प्रशिक्षित करने में आनंद आता है। हालाँकि निवेश का पैसा लगातार आ रहा है।

इस सेवा का शुल्क भी तय की गई दूरी के हिसाब से लिया जाता है। लेकिन चूँकि कौए उड़ सकते हैं, उन्हें सड़कों के ग्रिड पर चलने की ज़रूरत नहीं होती और वे सबसे छोटा रास्ता ले सकते हैं। यह हर जगह सच नहीं होगा: जहाँ बहुत ऊँची गगनचुंबी इमारतें हों, वहाँ कौओं के लिए सीधा रास्ता लेना कठिन हो सकता है। लेकिन CEO यह सेवा मैनहट्टन, कैनसस (जिसे "द लिटल ऐपल" कहा जाता है) में शुरू कर रहे हैं, जहाँ कौए आसानी से कम ऊँचाई की इमारतों के ऊपर से उड़ सकते हैं। मैनहट्टन, कैनसस में ऐसी सेवा की कितनी माँग हो सकती है, और वहाँ के पैदल चलने वालों को इतने सारे पक्षियों का ऊपर से उड़ना कैसा लगेगा, यह किसी और दिन की बात है।

as_crow_flies(start, end) फंक्शन बनाइए, जो start और end चौराहे लेता है। दोनों के बीच की कौए के उड़ने की दूरी लौटाइए।

as_crow_flies(0+0i, 3+4i)
#> 5

5. कौओं की दिशाएँ निकालिए

आपके CEO ने कौओं को ड्राइवरों जैसी दिशाएँ मानने का प्रशिक्षण दिया है। लेकिन CEO को दक्षिणी गोलार्ध से बहुत लगाव है, और उन्होंने कौओं को उस कम्पास से अलग कम्पास पर प्रशिक्षित किया है, जिसका इस्तेमाल आपके प्रोजेक्ट मैनेजर बाकी पूरे सिस्टम में करते हैं। आपके CEO वाकई काफी अजीब इंसान निकल रहे हैं। CEO के कम्पास में उत्तर ऋणात्मक काल्पनिक दिशा में है और दक्षिण धनात्मक काल्पनिक दिशा में। यह ड्राइवरों की उत्तर/दक्षिण दिशाओं के बिल्कुल उलट है, जबकि पूर्व/पश्चिम वैसे ही रहते हैं।

crows_directions(start, end) फंक्शन बनाइए, जो start और end चौराहे लेता है। ड्राइवर की दिशाओं जैसी ही सम्मिश्र संख्या लौटाइए, लेकिन उत्तर/दक्षिण उलटा हुआ।

driver_directions(0+0i, 7+5i)
#> 7-5i

driver_directions(-2+3i, 4-5i)
#> 6+8i
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
R Exercism

कौवा कैब शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और R को 21 कॉन्सेप्ट111 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।