Julio Biason
12 months ago
7 changed files with 256 additions and 0 deletions
@ -0,0 +1,25 @@
|
||||
{ |
||||
"authors": [], |
||||
"contributors": [ |
||||
"alexanderific", |
||||
"amscotti", |
||||
"Dispader", |
||||
"ikhadykin", |
||||
"kytrinyx", |
||||
"sjwarner-bp" |
||||
], |
||||
"files": { |
||||
"solution": [ |
||||
"src/main/groovy/Hamming.groovy" |
||||
], |
||||
"test": [ |
||||
"src/test/groovy/HammingSpec.groovy" |
||||
], |
||||
"example": [ |
||||
".meta/src/reference/groovy/Hamming.groovy" |
||||
] |
||||
}, |
||||
"blurb": "Calculate the Hamming difference between two DNA strands.", |
||||
"source": "The Calculating Point Mutations problem at Rosalind", |
||||
"source_url": "https://rosalind.info/problems/hamm/" |
||||
} |
@ -0,0 +1 @@
|
||||
{"track":"groovy","exercise":"hamming","id":"4c068a639a254bbba7c9136ad8c97948","url":"https://exercism.org/tracks/groovy/exercises/hamming","handle":"JBiason","is_requester":true,"auto_approve":false} |
@ -0,0 +1,48 @@
|
||||
# Help |
||||
|
||||
## Running the tests |
||||
|
||||
On MacOS/Linux, please run: |
||||
|
||||
```sh |
||||
$ chmod +x gradlew |
||||
``` |
||||
|
||||
Execute the tests with: |
||||
|
||||
```sh |
||||
$ ./gradlew test |
||||
``` |
||||
|
||||
> Use `gradlew.bat` if you're on Windows |
||||
|
||||
## Skipped tests |
||||
|
||||
After the first test(s) pass, continue by commenting out or removing the `@Ignore` annotations prepending other tests. |
||||
|
||||
## Submitting your solution |
||||
|
||||
You can submit your solution using the `exercism submit src/main/groovy/Hamming.groovy` command. |
||||
This command will upload your solution to the Exercism website and print the solution page's URL. |
||||
|
||||
It's possible to submit an incomplete solution which allows you to: |
||||
|
||||
- See how others have completed the exercise |
||||
- Request help from a mentor |
||||
|
||||
## Need to get help? |
||||
|
||||
If you'd like help solving the exercise, check the following pages: |
||||
|
||||
- The [Groovy track's documentation](https://exercism.org/docs/tracks/groovy) |
||||
- [Exercism's programming category on the forum](https://forum.exercism.org/c/programming/5) |
||||
- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs) |
||||
|
||||
Should those resources not suffice, you could submit your (incomplete) solution to request mentoring. |
||||
|
||||
To get help if you're having trouble, you can use one of the following resources: |
||||
|
||||
- The [Groovy Language Documentation](http://docs.groovy-lang.org/docs/latest/html/documentation/) |
||||
- The [Groovy Community](http://www.groovy-lang.org/community.html) entry of the Groovy Language Documentation |
||||
- [/r/groovy](https://www.reddit.com/r/groovy) is the Groovy subreddit. |
||||
- [StackOverflow](http://stackoverflow.com/questions/tagged/groovy) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions. |
@ -0,0 +1,47 @@
|
||||
# Hamming |
||||
|
||||
Welcome to Hamming on Exercism's Groovy Track. |
||||
If you need help running the tests or submitting your code, check out `HELP.md`. |
||||
|
||||
## 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. |
||||
|
||||
## Source |
||||
|
||||
### Contributed to by |
||||
|
||||
- @alexanderific |
||||
- @amscotti |
||||
- @Dispader |
||||
- @ikhadykin |
||||
- @kytrinyx |
||||
- @sjwarner-bp |
||||
|
||||
### Based on |
||||
|
||||
The Calculating Point Mutations problem at Rosalind - https://rosalind.info/problems/hamm/ |
@ -0,0 +1,18 @@
|
||||
apply plugin: "groovy" |
||||
|
||||
repositories { |
||||
mavenCentral() |
||||
} |
||||
|
||||
dependencies { |
||||
testImplementation "org.spockframework:spock-core:2.0-M2-groovy-3.0" |
||||
implementation "org.codehaus.groovy:groovy-all:3.0.2" |
||||
} |
||||
|
||||
test { |
||||
useJUnitPlatform() |
||||
testLogging { |
||||
exceptionFormat = 'full' |
||||
events = ["passed", "failed", "skipped"] |
||||
} |
||||
} |
@ -0,0 +1,16 @@
|
||||
class Hamming { |
||||
|
||||
def distance(strand1, strand2) { |
||||
if (strand1.empty && strand2.empty) { |
||||
0 |
||||
} else if (strand1.size() != strand2.size()) { |
||||
throw new ArithmeticException() |
||||
} else { |
||||
[strand1.chars, strand2.chars] |
||||
.transpose() |
||||
.collect { record -> record[0] == record[1]? 0: 1 } |
||||
.sum() |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,101 @@
|
||||
import spock.lang.* |
||||
|
||||
class HammingSpec extends Specification { |
||||
|
||||
@Shared |
||||
def hamming = new Hamming() |
||||
|
||||
def "Empty strands"() { |
||||
expect: |
||||
hamming.distance(strand1, strand2) == expected |
||||
|
||||
where: |
||||
strand1 | strand2 || expected |
||||
'' | '' || 0 |
||||
} |
||||
|
||||
def "Single letter identical strands"() { |
||||
expect: |
||||
hamming.distance(strand1, strand2) == expected |
||||
|
||||
where: |
||||
strand1 | strand2 || expected |
||||
'A' | 'A' || 0 |
||||
} |
||||
|
||||
def "Single letter different strands"() { |
||||
expect: |
||||
hamming.distance(strand1, strand2) == expected |
||||
|
||||
where: |
||||
strand1 | strand2 || expected |
||||
'G' | 'T' || 1 |
||||
} |
||||
|
||||
def "Long identical strands"() { |
||||
expect: |
||||
hamming.distance(strand1, strand2) == expected |
||||
|
||||
where: |
||||
strand1 | strand2 || expected |
||||
'GGACTGAAATCTG' | 'GGACTGAAATCTG' || 0 |
||||
} |
||||
|
||||
def "Long different strands"() { |
||||
expect: |
||||
hamming.distance(strand1, strand2) == expected |
||||
|
||||
where: |
||||
strand1 | strand2 || expected |
||||
'GGACGGATTCTG' | 'AGGACGGATTCT' || 9 |
||||
} |
||||
|
||||
def "Disallow first strand longer"() { |
||||
when: |
||||
hamming.distance(strand1, strand2) |
||||
|
||||
then: |
||||
thrown(ArithmeticException) |
||||
|
||||
where: |
||||
strand1 | strand2 |
||||
'AATG' | 'AAA' |
||||
} |
||||
|
||||
def "Disallow second strand longer"() { |
||||
when: |
||||
hamming.distance(strand1, strand2) |
||||
|
||||
then: |
||||
thrown(ArithmeticException) |
||||
|
||||
where: |
||||
strand1 | strand2 |
||||
'ATA' | 'AGTG' |
||||
} |
||||
|
||||
def "Disallow left empty strand"() { |
||||
when: |
||||
hamming.distance(strand1, strand2) |
||||
|
||||
then: |
||||
thrown(ArithmeticException) |
||||
|
||||
where: |
||||
strand1 | strand2 |
||||
'' | 'G' |
||||
} |
||||
|
||||
def "Disallow right empty strand"() { |
||||
when: |
||||
hamming.distance(strand1, strand2) |
||||
|
||||
then: |
||||
thrown(ArithmeticException) |
||||
|
||||
where: |
||||
strand1 | strand2 |
||||
'G' | '' |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue