Hamming

Hamming

Εύκολο

Εισαγωγή

Το σώμα σου αποτελείται από κύτταρα που περιέχουν DNA. Αυτά τα κύτταρα φθείρονται τακτικά και χρειάζεται να αντικατασταθούν, κάτι που το καταφέρνουν διαιρούμενα σε θυγατρικά κύτταρα. Στην πραγματικότητα, το μέσο ανθρώπινο σώμα βιώνει περίπου 10 τετράκις εκατομμύρια κυτταρικές διαιρέσεις σε όλη τη διάρκεια της ζωής του!

Όταν τα κύτταρα διαιρούνται, αντιγράφεται και το DNA τους. Μερικές φορές, κατά τη διάρκεια αυτής της διαδικασίας, γίνονται λάθη και μεμονωμένα τμήματα DNA κωδικοποιούνται με λανθασμένες πληροφορίες. Αν συγκρίνουμε δύο κλώνους DNA και μετρήσουμε τις διαφορές μεταξύ τους, μπορούμε να δούμε πόσα λάθη συνέβησαν. Αυτό είναι γνωστό ως "Hamming distance".

Η "Hamming distance" είναι χρήσιμη σε πολλούς τομείς της επιστήμης, όχι μόνο στη βιολογία, οπότε είναι μια ωραία φράση για να την ξέρεις :)

Οδηγίες

Υπολόγισε την απόσταση Hamming ανάμεσα σε δύο κλώνους DNA.

Διαβάζουμε το DNA χρησιμοποιώντας τα γράμματα C, A, G και T. Δύο κλώνοι μπορεί να μοιάζουν κάπως έτσι:

GAGCCTACTAACGGGAT
CATCGTAATGACGGCCT
^ ^ ^  ^ ^    ^^

Έχουν 7 διαφορές, και επομένως η απόσταση Hamming είναι 7.

Σημειώσεις υλοποίησης

Η απόσταση Hamming ορίζεται μόνο για ακολουθίες ίσου μήκους, οπότε μια προσπάθεια υπολογισμού της ανάμεσα σε ακολουθίες διαφορετικού μήκους δε θα πρέπει να λειτουργεί.

Το Option χρησιμοποιείται για να δηλώσει έναν υπολογισμό που μπορεί να μην έχει κάποιο χρήσιμο αποτέλεσμα (για παράδειγμα, λόγω κάποιου σφάλματος ή μη έγκυρης εισόδου). Αν δεν είσαι εξοικειωμένος με το Option, μπορείς να διαβάσεις αυτό το σεμινάριο. Το Option είναι ένα λεγόμενο Monad που καλύπτει μια "υπολογιστική πτυχή", στην περίπτωση αυτή την πιθανή απουσία μιας τιμής. Η σωστή χρήση των Monads μπορεί να οδηγήσει σε πολύ συνοπτικό αλλά κομψό και ευανάγνωστο κώδικα. Η ακατάλληλη χρήση μπορεί εύκολα να έχει το αντίθετο αποτέλεσμα. Δες αυτό το βίντεο για να μάθεις περισσότερα.

Συνήθεις παγίδες που πρέπει να αποφύγεις

Υπάρχουν μερικοί εμπειρικοί κανόνες για το Option:

  1. Αν δεν το χρειάζεσαι, μη το χρησιμοποιείς. Αντί για
def add1(x: Int): Option[Int] = Some(x + 1)

καλύτερα να έχεις

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

(υπάρχει το Option.map για να εφαρμόζεις τέτοιες απλές συναρτήσεις, οπότε δε χρειάζεται να τις γεμίζεις με Option). 2. Μην κάνεις "unwrap" αν δεν το χρειάζεσαι πραγματικά. Συχνά υπάρχουν έτοιμες συναρτήσεις για τον σκοπό σου. Ενδείξεις πρόωρου unwrapping είναι τα isDefined/isEmpty ή το pattern matching. Αντί για

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. Τα Monads μπορούν να χρησιμοποιηθούν μέσα σε ένα for-comprehension FTW. Αυτό συνιστάται όταν θέλεις να "συνθέσεις" πολλαπλά στιγμιότυπα του 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 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.