Hamming

Hamming

Einfach

Einführung

Dein Körper besteht aus Zellen, die DNA enthalten. Diese Zellen nutzen sich regelmäßig ab und müssen ersetzt werden, was sie schaffen, indem sie sich in Tochterzellen teilen. Tatsächlich erlebt der menschliche Körper im Laufe eines Lebens durchschnittlich etwa 10 Billiarden Zellteilungen!

Wenn sich Zellen teilen, wird auch ihre DNA repliziert. Manchmal passieren bei diesem Vorgang Fehler, und einzelne Stücke der DNA werden mit falschen Informationen kodiert. Wenn wir zwei DNA-Stränge vergleichen und die Unterschiede zwischen ihnen zählen, sehen wir, wie viele Fehler aufgetreten sind. Das nennt man die „Hamming-Distanz“.

Die Hamming-Distanz ist in vielen Bereichen der Wissenschaft nützlich, nicht nur in der Biologie. Es lohnt sich also, den Begriff zu kennen :)

Anleitung

Berechne die Hamming-Distanz zwischen zwei DNA-Strängen.

Wir lesen DNA mit den Buchstaben C, A, G und T. Zwei Stränge könnten so aussehen:

GAGCCTACTAACGGGAT
CATCGTAATGACGGCCT
^ ^ ^  ^ ^    ^^

Sie haben 7 Unterschiede, und daher ist die Hamming-Distanz 7.

Implementierungshinweise

Die Hamming-Distanz ist nur für Sequenzen gleicher Länge definiert. Ein Versuch, sie zwischen unterschiedlich langen Sequenzen zu berechnen, sollte daher nicht funktionieren.

Option wird verwendet, um eine Berechnung auszudrücken, die möglicherweise kein brauchbares Ergebnis hat (zum Beispiel aufgrund eines Fehlers oder einer ungültigen Eingabe). Wenn du mit Option nicht vertraut bist, kannst du dieses Tutorial lesen. Option ist eine sogenannte Monade, die einen „rechnerischen Aspekt“ abdeckt, in diesem Fall das mögliche Fehlen eines Werts. Der richtige Umgang mit Monaden kann zu sehr prägnantem und dennoch elegantem und lesbarem Code führen. Falscher Umgang kann leicht das Gegenteil bewirken. Schau dir dieses Video an, um mehr zu erfahren.

Häufige Fallstricke, die du vermeiden solltest

Es gibt ein paar Faustregeln für Option:

  1. Wenn du sie nicht brauchst, verwende sie nicht. Statt
def add1(x: Int): Option[Int] = Some(x + 1)

besser so

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

(es gibt Option.map, um solche einfachen Funktionen anzuwenden, damit du sie nicht mit Option überladen musst).

  1. Packe nichts aus, wenn du es nicht wirklich musst. Oft gibt es eingebaute Funktionen für deinen Zweck. Anzeichen für vorzeitiges Auspacken sind isDefined/isEmpty oder Pattern Matching. Statt
val x: Option[Int] = ...

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

besser so

x map (_ + 1) getOrElse 0
  1. Monaden kannst du in einer for-Comprehension verwenden. Das ist ein echter Gewinn. Das ist ratsam, wenn du mehrere Option-Instanzen „zusammensetzen“ willst. Statt
val xo: Option[Int] = ...
val yo: Option[Int] = ...
val zo: Option[Int] = ...

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

besser so

for {
  x <- xo
  y <- yo
  z <- zo
} yield x + y + z
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Scala Exercism

Bereit, mit Hamming zu starten?

Melde dich bei Exercism an, um Scala mit 95 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.