This commit is contained in:
parent
f42732013a
commit
983639f8ce
|
@ -0,0 +1,65 @@
|
||||||
|
# Hamming
|
||||||
|
|
||||||
|
Calculate the Hamming difference 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'.
|
||||||
|
|
||||||
|
It is found by comparing two DNA strands and counting how many of the
|
||||||
|
nucleotides are different from their equivalent in the other string.
|
||||||
|
|
||||||
|
GAGCCTACTAACGGGAT
|
||||||
|
CATCGTAATGACGGCCT
|
||||||
|
^ ^ ^ ^ ^ ^^
|
||||||
|
|
||||||
|
The Hamming distance between these two DNA strands is 7.
|
||||||
|
|
||||||
|
# Implementation notes
|
||||||
|
|
||||||
|
The Hamming distance is only defined for sequences of equal length. This means
|
||||||
|
that based on the definition, each language could deal with getting sequences
|
||||||
|
of equal length differently.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
Follow the setup instructions for Crystal here:
|
||||||
|
|
||||||
|
http://exercism.io/languages/crystal
|
||||||
|
|
||||||
|
More help installing can be found here:
|
||||||
|
|
||||||
|
http://crystal-lang.org/docs/installation/index.html
|
||||||
|
|
||||||
|
## Making the Test Suit Pass
|
||||||
|
|
||||||
|
Execute the tests with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ crystal spec
|
||||||
|
```
|
||||||
|
|
||||||
|
In each test suite all but the first test have been skipped.
|
||||||
|
|
||||||
|
Once you get a test passing, you can unskip the next one by changing `pending` to `it`.
|
||||||
|
|
||||||
|
## Source
|
||||||
|
|
||||||
|
The Calculating Point Mutations problem at Rosalind [http://rosalind.info/problems/hamm/](http://rosalind.info/problems/hamm/)
|
||||||
|
|
||||||
|
## Submitting Incomplete Solutions
|
||||||
|
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
|
@ -0,0 +1,30 @@
|
||||||
|
require "spec"
|
||||||
|
require "../src/*"
|
||||||
|
|
||||||
|
describe "Hamming" do
|
||||||
|
describe "#compute" do
|
||||||
|
it "computes no difference for identical single nucleotide strands" do
|
||||||
|
Hamming.compute("A", "A").should eq 0
|
||||||
|
end
|
||||||
|
|
||||||
|
pending "computes a distance for single nucleotide strands" do
|
||||||
|
Hamming.compute("A", "G").should eq 1
|
||||||
|
end
|
||||||
|
|
||||||
|
pending "computes a distance for small strands" do
|
||||||
|
Hamming.compute("AG", "CT").should eq 2
|
||||||
|
end
|
||||||
|
|
||||||
|
pending "computes a distance for medium strands" do
|
||||||
|
Hamming.compute("GGACG", "GGTCG").should eq 1
|
||||||
|
end
|
||||||
|
|
||||||
|
pending "computes a distance for large strands" do
|
||||||
|
Hamming.compute("GGACGGATTCTG", "AGGACGGATTCT").should eq 9
|
||||||
|
end
|
||||||
|
|
||||||
|
pending "raises an exception when strands aren't of equal length" do
|
||||||
|
expect_raises(ArgumentError) { Hamming.compute("GCC", "A") }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,7 @@
|
||||||
|
module Hamming
|
||||||
|
def self.compute(a, b)
|
||||||
|
raise ArgumentError unless a.size == b.size
|
||||||
|
(0..a.size).count {|i| a[i] != b[i]}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -1,2 +1,7 @@
|
||||||
# Please implement your solution to hello-world in this file
|
# Please implement your solution to hello-world in this file
|
||||||
puts "Hello, World!"
|
class HelloWorld
|
||||||
|
def self.hello
|
||||||
|
"Hello, World!"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue