From 983639f8ce3388a7129abca0e8cc97fdb89bf279 Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Tue, 13 Mar 2018 11:57:33 -0400 Subject: [PATCH] cr --- crystal/hamming/README.md | 65 ++++++++++++++++++++++++++ crystal/hamming/spec/hamming_spec.cr | 30 ++++++++++++ crystal/hamming/src/hamming.cr | 7 +++ crystal/hello-world/src/hello_world.cr | 7 ++- 4 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 crystal/hamming/README.md create mode 100644 crystal/hamming/spec/hamming_spec.cr create mode 100644 crystal/hamming/src/hamming.cr diff --git a/crystal/hamming/README.md b/crystal/hamming/README.md new file mode 100644 index 0000000..a3672ac --- /dev/null +++ b/crystal/hamming/README.md @@ -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. diff --git a/crystal/hamming/spec/hamming_spec.cr b/crystal/hamming/spec/hamming_spec.cr new file mode 100644 index 0000000..c01241c --- /dev/null +++ b/crystal/hamming/spec/hamming_spec.cr @@ -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 diff --git a/crystal/hamming/src/hamming.cr b/crystal/hamming/src/hamming.cr new file mode 100644 index 0000000..0b50919 --- /dev/null +++ b/crystal/hamming/src/hamming.cr @@ -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 + diff --git a/crystal/hello-world/src/hello_world.cr b/crystal/hello-world/src/hello_world.cr index 8a10696..ea03dac 100644 --- a/crystal/hello-world/src/hello_world.cr +++ b/crystal/hello-world/src/hello_world.cr @@ -1,2 +1,7 @@ # Please implement your solution to hello-world in this file -puts "Hello, World!" +class HelloWorld + def self.hello + "Hello, World!" + end +end +