Skip to content

Instantly share code, notes, and snippets.

@mcelaney
Created December 15, 2015 19:12
Show Gist options
  • Save mcelaney/6574081806dac6552680 to your computer and use it in GitHub Desktop.
Save mcelaney/6574081806dac6552680 to your computer and use it in GitHub Desktop.
# `Coding Test : Hamming Distance
# Write a program that can calculate the Hamming distance between two DNA
# strands.
#
# A mutation is simply a mistake that occurs during the creation or copying of a
# nucleic acid, in particular DNA. Because nucleic acids are vital to cellular
# functions, mutations tend to cause a ripple effect throughout the cell.
# Although mutations are technically mistakes, a very rare mutation may equip
# the cell with a beneficial attribute. In fact, the macro effects of
# evolution are attributable by the accumulated result of beneficial
# microscopic mutations over many generations.
#
# The simplest and most common type of nucleic acid mutation is a point
# mutation, which replaces one base with another at a single nucleotide.
#
# By counting the number of differences between two homologous DNA strands taken
# from different genomes with a common ancestor, we get a measure of the
# minimum number of point mutations that could have occurred on the
# evolutionary path between the two strands.
#
# This is called the “Hamming Distance”.
#
# GAGCCTACTAACGGGAT
# CATCGTAATGACGGCCT
# ^ ^ ^ ^ ^ ^^
#
# The Hamming distance between these two DNA strands is 7.`
#
#
class HammingDistance
def self.hammit(left, right)
fail 'lengths don\'t match' if different_lengths?(left, right)
(0..compare_length(left, right)).map { |index|
left[index] == right[index]
}.select { |result| result == false }.count
end
def self.compare_length(left, _)
left.size
end
def self.different_lengths?(left, right)
left.size != right.size
end
end
left = 'GAGCCTACTAACGGGAT'
right = 'CATCGTAATGACGGCCT'
HammingDistance.hammit(left, right) == 7
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment