diff --git a/config.json b/config.json index 87a05ba..e088c22 100644 --- a/config.json +++ b/config.json @@ -43,6 +43,14 @@ "prerequisites": [], "difficulty": 1 }, + { + "slug": "hamming", + "name": "Hamming", + "uuid": "b3fab986-831a-4fb6-ba6b-5ad1ce8b8e43", + "practices": [], + "prerequisites": [], + "difficulty": 1 + }, { "slug": "resistor-color-duo", "name": "Resistor Color Duo", diff --git a/exercises/practice/hamming/.docs/instructions.md b/exercises/practice/hamming/.docs/instructions.md new file mode 100644 index 0000000..020fdd0 --- /dev/null +++ b/exercises/practice/hamming/.docs/instructions.md @@ -0,0 +1,27 @@ +# Instructions + +Calculate the Hamming Distance between two DNA strands. + +Your body is made up of cells that contain DNA. +Those cells regularly wear out and need replacing, which they achieve by dividing into daughter cells. +In fact, the average human body experiences about 10 quadrillion cell divisions in a lifetime! + +When cells divide, their DNA replicates too. +Sometimes during this process mistakes happen and single pieces of DNA get encoded with the incorrect information. +If we compare two strands of DNA and count the differences between them we can see how many mistakes occurred. +This is known as the "Hamming Distance". + +We read DNA using the letters C,A,G and T. +Two strands might look like this: + + GAGCCTACTAACGGGAT + CATCGTAATGACGGCCT + ^ ^ ^ ^ ^ ^^ + +They have 7 differences, and therefore the Hamming Distance is 7. + +The Hamming Distance is useful for lots of things in science, not just biology, so it's a nice phrase to be familiar with :) + +## Implementation notes + +The Hamming distance is only defined for sequences of equal length, so an attempt to calculate it between sequences of different lengths should not work. diff --git a/exercises/practice/hamming/.meta/config.json b/exercises/practice/hamming/.meta/config.json new file mode 100644 index 0000000..f911a7d --- /dev/null +++ b/exercises/practice/hamming/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "glaxxie" + ], + "files": { + "solution": [ + "hamming.gd" + ], + "test": [ + "hamming_test.gd" + ], + "example": [ + ".meta/example.gd" + ] + }, + "blurb": "Calculate the Hamming difference between two DNA strands.", + "source": "The Calculating Point Mutations problem at Rosalind", + "source_url": "https://rosalind.info/problems/hamm/" +} diff --git a/exercises/practice/hamming/.meta/example.gd b/exercises/practice/hamming/.meta/example.gd new file mode 100644 index 0000000..7c8d000 --- /dev/null +++ b/exercises/practice/hamming/.meta/example.gd @@ -0,0 +1,6 @@ +func distance(strand_1, strand_2): + var dist = 0 + for i in range(len(strand_1)): + if strand_1[i] != strand_2[i]: + dist += 1 + return dist diff --git a/exercises/practice/hamming/.meta/tests.toml b/exercises/practice/hamming/.meta/tests.toml new file mode 100644 index 0000000..5dc17ed --- /dev/null +++ b/exercises/practice/hamming/.meta/tests.toml @@ -0,0 +1,67 @@ +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. + +[f6dcb64f-03b0-4b60-81b1-3c9dbf47e887] +description = "empty strands" + +[54681314-eee2-439a-9db0-b0636c656156] +description = "single letter identical strands" + +[294479a3-a4c8-478f-8d63-6209815a827b] +description = "single letter different strands" + +[9aed5f34-5693-4344-9b31-40c692fb5592] +description = "long identical strands" + +[cd2273a5-c576-46c8-a52b-dee251c3e6e5] +description = "long different strands" + +[919f8ef0-b767-4d1b-8516-6379d07fcb28] +description = "disallow first strand longer" +include = false + +[b9228bb1-465f-4141-b40f-1f99812de5a8] +description = "disallow first strand longer" +reimplements = "919f8ef0-b767-4d1b-8516-6379d07fcb28" + +[8a2d4ed0-ead5-4fdd-924d-27c4cf56e60e] +description = "disallow second strand longer" +include = false + +[dab38838-26bb-4fff-acbe-3b0a9bfeba2d] +description = "disallow second strand longer" +reimplements = "8a2d4ed0-ead5-4fdd-924d-27c4cf56e60e" + +[5dce058b-28d4-4ca7-aa64-adfe4e17784c] +description = "disallow left empty strand" +include = false + +[db92e77e-7c72-499d-8fe6-9354d2bfd504] +description = "disallow left empty strand" +include = false +reimplements = "5dce058b-28d4-4ca7-aa64-adfe4e17784c" + +[b764d47c-83ff-4de2-ab10-6cfe4b15c0f3] +description = "disallow empty first strand" +reimplements = "db92e77e-7c72-499d-8fe6-9354d2bfd504" + +[38826d4b-16fb-4639-ac3e-ba027dec8b5f] +description = "disallow right empty strand" +include = false + +[920cd6e3-18f4-4143-b6b8-74270bb8f8a3] +description = "disallow right empty strand" +include = false +reimplements = "38826d4b-16fb-4639-ac3e-ba027dec8b5f" + +[9ab9262f-3521-4191-81f5-0ed184a5aa89] +description = "disallow empty second strand" +reimplements = "920cd6e3-18f4-4143-b6b8-74270bb8f8a3" diff --git a/exercises/practice/hamming/hamming.gd b/exercises/practice/hamming/hamming.gd new file mode 100644 index 0000000..1f4e5ee --- /dev/null +++ b/exercises/practice/hamming/hamming.gd @@ -0,0 +1,2 @@ +func distance(strand_1, strand_2): + pass diff --git a/exercises/practice/hamming/hamming_test.gd b/exercises/practice/hamming/hamming_test.gd new file mode 100644 index 0000000..3888900 --- /dev/null +++ b/exercises/practice/hamming/hamming_test.gd @@ -0,0 +1,30 @@ +func test_empty_strands(solution_script): + var values = ["", ""] + var expected = 0 + return [solution_script.distance(values[0], values[1]), expected] + + +func test_single_letter_identical_strands(solution_script): + var values = ["A", "A"] + var expected = 0 + return [solution_script.distance(values[0], values[1]), expected] + + +func test_single_letter_different_strands(solution_script): + var values = ["G", "T"] + var expected = 1 + return [solution_script.distance(values[0], values[1]), expected] + + +func test_long_identical_strands(solution_script): + var values = ["GGACTGAAATCTG", "GGACTGAAATCTG"] + var expected = 0 + return [solution_script.distance(values[0], values[1]), expected] + + +func test_long_different_strands(solution_script): + var values = ["GGACGGATTCTG", "AGGACGGATTCT"] + var expected = 9 + return [solution_script.distance(values[0], values[1]), expected] + +