Hamming

Hamming

आसान

परिचय

आपका शरीर ऐसी कोशिकाओं से बना है जिनमें DNA होता है। ये कोशिकाएँ नियमित रूप से घिस जाती हैं और उन्हें बदलने की ज़रूरत पड़ती है। वे संतान कोशिकाओं में विभाजित होकर यह काम करती हैं। वास्तव में, एक औसत मानव शरीर में जीवनभर में लगभग 10 क्वाड्रिलियन कोशिका विभाजन होते हैं!

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

हैमिंग दूरी केवल जीव विज्ञान ही नहीं, विज्ञान के कई क्षेत्रों में काम आती है। इसलिए इस शब्द से परिचित होना अच्छा है :)

निर्देश

दो DNA स्ट्रैंड के बीच हैमिंग दूरी की गणना कीजिए।

हम DNA को C, A, G और T अक्षरों की मदद से पढ़ते हैं। दो स्ट्रैंड कुछ ऐसे दिख सकते हैं:

GAGCCTACTAACGGGAT
CATCGTAATGACGGCCT
^ ^ ^  ^ ^    ^^

इनमें 7 अंतर हैं, इसलिए हैमिंग दूरी 7 है।

कार्यान्वयन नोट्स

हैमिंग दूरी केवल समान लंबाई वाले अनुक्रमों के लिए परिभाषित है, इसलिए अलग-अलग लंबाई वाले अनुक्रमों के बीच इसकी गणना करने की कोशिश काम नहीं करेगी।

Option का उपयोग ऐसी गणना दिखाने के लिए किया जाता है जिसका शायद कोई उपयोगी परिणाम न निकले (जैसे किसी एरर या गलत इनपुट की वजह से)। अगर आप Option से परिचित नहीं हैं, तो आप यह ट्यूटोरियल पढ़ सकते हैं। Option एक तरह का मोनैड है, जो गणना के एक पहलू को समेटता है; यहाँ यह पहलू वैल्यू का संभवतः मौजूद न होना है। मोनैड का सही उपयोग बहुत संक्षिप्त, फिर भी सुंदर और पढ़ने में आसान कोड दे सकता है। गलत उपयोग से उलटा नतीजा आसानी से मिल सकता है। और जानने के लिए यह वीडियो देखिए।

आम गलतियाँ जिनसे आपको बचना चाहिए

Option के लिए कुछ आम नियम हैं:

  1. जहाँ इसकी ज़रूरत नहीं है, वहाँ इसका उपयोग न कीजिए। इसके बजाय
def add1(x: Int): Option[Int] = Some(x + 1)

यह लिखना बेहतर है

def add1(x: Int): Int = x + 1

(Option.map ऐसे सरल फंक्शन लगाने के लिए मौजूद है, इसलिए आपको उन्हें Option से उलझाने की ज़रूरत नहीं)। 2. जब सचमुच ज़रूरत न हो, तो "unwrap" न कीजिए। अक्सर आपके काम के लिए पहले से बने फंक्शन मौजूद होते हैं। समय से पहले unwrap करने के संकेत हैं isDefined/isEmpty या पैटर्न मैचिंग। इसके बजाय

val x: Option[Int] = ...

if (x.isDefined) x.get + 1 else 0
// or
x match {
  case Some(n) => n + 1
  case None => 0
}

यह लिखना बेहतर है

x map (_ + 1) getOrElse 0
  1. फोर-कॉम्प्रिहेंशन के अंदर मोनैड इस्तेमाल किए जा सकते हैं, और यह बहुत बढ़िया तरीका है। यह तब अच्छा रहता है जब आप कई Option इंस्टेंस आपस में जोड़ना चाहते हैं। इसके बजाय
val xo: Option[Int] = ...
val yo: Option[Int] = ...
val zo: Option[Int] = ...

xo.flatMap(x =>
  yo.flatMap(y =>
    zo.map(z =>
	  x + y + z)))

यह लिखना बेहतर है

for {
  x <- xo
  y <- yo
  z <- zo
} yield x + y + z
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Scala Exercism

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

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