ruby - nucleotide-count
This commit is contained in:
parent
4d0cebcbff
commit
166d394ed3
43
ruby/nucleotide-count/README.md
Normal file
43
ruby/nucleotide-count/README.md
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# Nucleotide Count
|
||||||
|
|
||||||
|
Given a single stranded DNA string, compute how many times each nucleotide occurs in the string.
|
||||||
|
|
||||||
|
The genetic language of every living thing on the planet is DNA.
|
||||||
|
DNA is a large molecule that is built from an extremely long sequence of individual elements called nucleotides.
|
||||||
|
4 types exist in DNA and these differ only slightly and can be represented as the following symbols: 'A' for adenine, 'C' for cytosine, 'G' for guanine, and 'T' thymine.
|
||||||
|
|
||||||
|
Here is an analogy:
|
||||||
|
- twigs are to birds nests as
|
||||||
|
- nucleotides are to DNA as
|
||||||
|
- legos are to lego houses as
|
||||||
|
- words are to sentences as...
|
||||||
|
|
||||||
|
* * * *
|
||||||
|
|
||||||
|
For installation and learning resources, refer to the
|
||||||
|
[Ruby resources page](http://exercism.io/languages/ruby/resources).
|
||||||
|
|
||||||
|
For running the tests provided, you will need the Minitest gem. Open a
|
||||||
|
terminal window and run the following command to install minitest:
|
||||||
|
|
||||||
|
gem install minitest
|
||||||
|
|
||||||
|
If you would like color output, you can `require 'minitest/pride'` in
|
||||||
|
the test file, or note the alternative instruction, below, for running
|
||||||
|
the test file.
|
||||||
|
|
||||||
|
Run the tests from the exercise directory using the following command:
|
||||||
|
|
||||||
|
ruby nucleotide_count_test.rb
|
||||||
|
|
||||||
|
To include color from the command line:
|
||||||
|
|
||||||
|
ruby -r minitest/pride nucleotide_count_test.rb
|
||||||
|
|
||||||
|
|
||||||
|
## Source
|
||||||
|
|
||||||
|
The Calculating DNA Nucleotides_problem at Rosalind [http://rosalind.info/problems/dna/](http://rosalind.info/problems/dna/)
|
||||||
|
|
||||||
|
## Submitting Incomplete Solutions
|
||||||
|
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
26
ruby/nucleotide-count/nucleotide_count.rb
Normal file
26
ruby/nucleotide-count/nucleotide_count.rb
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# Nucleotide class
|
||||||
|
class Nucleotide
|
||||||
|
attr_accessor :histogram
|
||||||
|
|
||||||
|
def initialize(strand)
|
||||||
|
@strand = strand
|
||||||
|
@histogram = { 'A' => 0, 'T' => 0, 'C' => 0, 'G' => 0 }
|
||||||
|
count_all
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.from_dna(strand)
|
||||||
|
raise ArgumentError if strand =~ /[^ATCG]/
|
||||||
|
|
||||||
|
new(strand)
|
||||||
|
end
|
||||||
|
|
||||||
|
def count(nucleotide)
|
||||||
|
@histogram[nucleotide]
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def count_all
|
||||||
|
@histogram.each { |n, _| @histogram[n] = @strand.chars.count(n) }
|
||||||
|
end
|
||||||
|
end
|
53
ruby/nucleotide-count/nucleotide_count_test.rb
Normal file
53
ruby/nucleotide-count/nucleotide_count_test.rb
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
require 'minitest/autorun'
|
||||||
|
require_relative 'nucleotide_count'
|
||||||
|
|
||||||
|
class NucleotideTest < Minitest::Test
|
||||||
|
def test_empty_dna_strand_has_no_adenosine
|
||||||
|
assert_equal 0, Nucleotide.from_dna('').count('A')
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_repetitive_cytidine_gets_counted
|
||||||
|
# skip
|
||||||
|
assert_equal 5, Nucleotide.from_dna('CCCCC').count('C')
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_counts_only_thymidine
|
||||||
|
# skip
|
||||||
|
assert_equal 1, Nucleotide.from_dna('GGGGGTAACCCGG').count('T')
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_counts_a_nucleotide_only_once
|
||||||
|
# skip
|
||||||
|
dna = Nucleotide.from_dna('CGATTGGG')
|
||||||
|
dna.count('T')
|
||||||
|
dna.count('T')
|
||||||
|
assert_equal 2, dna.count('T')
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_empty_dna_strand_has_no_nucleotides
|
||||||
|
# skip
|
||||||
|
expected = { 'A' => 0, 'T' => 0, 'C' => 0, 'G' => 0 }
|
||||||
|
assert_equal expected, Nucleotide.from_dna('').histogram
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_repetitive_sequence_has_only_guanosine
|
||||||
|
# skip
|
||||||
|
expected = { 'A' => 0, 'T' => 0, 'C' => 0, 'G' => 8 }
|
||||||
|
assert_equal expected, Nucleotide.from_dna('GGGGGGGG').histogram
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_counts_all_nucleotides
|
||||||
|
# skip
|
||||||
|
s = 'AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC'
|
||||||
|
dna = Nucleotide.from_dna(s)
|
||||||
|
expected = { 'A' => 20, 'T' => 21, 'G' => 17, 'C' => 12 }
|
||||||
|
assert_equal expected, dna.histogram
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_validates_dna
|
||||||
|
# skip
|
||||||
|
assert_raises ArgumentError do
|
||||||
|
Nucleotide.from_dna('JOHNNYAPPLESEED')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
x
Reference in New Issue
Block a user