From e7afdb12d1286dde009dbd04949063ea216db6d4 Mon Sep 17 00:00:00 2001 From: Eoin Houlihan Date: Mon, 16 Oct 2017 22:02:16 +0100 Subject: [PATCH 1/2] Add RNA Transcription exercise --- config.json | 10 ++++ exercises/rna-transcription/README.md | 25 ++++++++++ exercises/rna-transcription/bower.json | 26 ++++++++++ .../examples/src/RNATranscription.purs | 22 +++++++++ .../src/RNATranscription.purs | 3 ++ exercises/rna-transcription/test/Main.purs | 48 +++++++++++++++++++ 6 files changed, 134 insertions(+) create mode 100644 exercises/rna-transcription/README.md create mode 100644 exercises/rna-transcription/bower.json create mode 100644 exercises/rna-transcription/examples/src/RNATranscription.purs create mode 100644 exercises/rna-transcription/src/RNATranscription.purs create mode 100644 exercises/rna-transcription/test/Main.purs diff --git a/config.json b/config.json index 784f340..c47e15e 100644 --- a/config.json +++ b/config.json @@ -250,6 +250,16 @@ "topics": [ "arrays" ] + }, + { + "uuid": "8ebcfe11-0a42-e980-d120-fb3fd581e426e9e237e", + "slug": "rna-transcription", + "core": false, + "unlocked_by": null, + "difficulty": 1, + "topics": [ + "strings" + ] } ], "foregone": [ diff --git a/exercises/rna-transcription/README.md b/exercises/rna-transcription/README.md new file mode 100644 index 0000000..3f2c612 --- /dev/null +++ b/exercises/rna-transcription/README.md @@ -0,0 +1,25 @@ +# Rna Transcription + +Given a DNA strand, return its RNA complement (per RNA transcription). + +Both DNA and RNA strands are a sequence of nucleotides. + +The four nucleotides found in DNA are adenine (**A**), cytosine (**C**), +guanine (**G**) and thymine (**T**). + +The four nucleotides found in RNA are adenine (**A**), cytosine (**C**), +guanine (**G**) and uracil (**U**). + +Given a DNA strand, its transcribed RNA strand is formed by replacing +each nucleotide with its complement: + +* `G` -> `C` +* `C` -> `G` +* `T` -> `A` +* `A` -> `U` +## Source + +Rosalind [http://rosalind.info/problems/rna](http://rosalind.info/problems/rna) + +## Submitting Incomplete Solutions +It's possible to submit an incomplete solution so you can see how others have completed the exercise. diff --git a/exercises/rna-transcription/bower.json b/exercises/rna-transcription/bower.json new file mode 100644 index 0000000..de4ddb8 --- /dev/null +++ b/exercises/rna-transcription/bower.json @@ -0,0 +1,26 @@ +{ + "name": "rna-transcription", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "output" + ], + "dependencies": { + "purescript-console": "^3.0.0", + "purescript-datetime": "^3.4.0", + "purescript-either": "^3.1.0", + "purescript-enums": "^3.2.1", + "purescript-integers": "^3.1.0", + "purescript-lists": "^4.10.0", + "purescript-maps": "^3.5.2", + "purescript-prelude": "^3.1.0", + "purescript-sets": "^3.0.0", + "purescript-strings": "^3.3.1", + "purescript-unicode": "^3.0.1" + }, + "devDependencies": { + "purescript-psci-support": "^3.0.0", + "purescript-test-unit": "^13.0.0" + } +} diff --git a/exercises/rna-transcription/examples/src/RNATranscription.purs b/exercises/rna-transcription/examples/src/RNATranscription.purs new file mode 100644 index 0000000..084faa1 --- /dev/null +++ b/exercises/rna-transcription/examples/src/RNATranscription.purs @@ -0,0 +1,22 @@ +module RNATranscription + ( toRNA + ) where + +import Prelude +import Data.Array (zip) +import Data.Map (Map, fromFoldable, lookup) +import Data.Maybe (Maybe) +import Data.String (fromCharArray, toCharArray) +import Data.Traversable (traverse) + +toRNA :: String -> Maybe String +toRNA s = fromCharArray <$> traverse (_ `lookup` rnaMap) (toCharArray s) + +dna :: Array Char +dna = toCharArray "CGAT" + +rna :: Array Char +rna = toCharArray "GCUA" + +rnaMap :: Map Char Char +rnaMap = fromFoldable $ zip dna rna diff --git a/exercises/rna-transcription/src/RNATranscription.purs b/exercises/rna-transcription/src/RNATranscription.purs new file mode 100644 index 0000000..602d0b5 --- /dev/null +++ b/exercises/rna-transcription/src/RNATranscription.purs @@ -0,0 +1,3 @@ +module RNATranscription + ( toRNA + ) where diff --git a/exercises/rna-transcription/test/Main.purs b/exercises/rna-transcription/test/Main.purs new file mode 100644 index 0000000..e84a459 --- /dev/null +++ b/exercises/rna-transcription/test/Main.purs @@ -0,0 +1,48 @@ +module Test.Main where + +import Prelude +import Control.Monad.Eff (Eff) +import Control.Monad.Eff.AVar (AVAR) +import Control.Monad.Eff.Console (CONSOLE) +import Data.Maybe (Maybe(..)) +import Test.Unit (TestSuite, suite, test) +import Test.Unit.Assert as Assert +import Test.Unit.Console (TESTOUTPUT) +import Test.Unit.Main (runTest) +import RNATranscription (toRNA) + +main :: forall eff + . Eff ( avar :: AVAR + , console :: CONSOLE + , testOutput :: TESTOUTPUT + | eff + ) + Unit +main = runTest suites + +suites :: forall e. TestSuite e +suites = + suite "RNATranscription.toRNA" do + test "RNA complement of cytosine is guanine" $ + Assert.equal (Just "G") (toRNA "C") + + test "RNA complement of guanine is cytosine" $ + Assert.equal (Just "C") (toRNA "G") + + test "RNA complement of thymine is adenine" $ + Assert.equal (Just "A") (toRNA "T") + + test "RNA complement of adenine is uracil" $ + Assert.equal (Just "U") (toRNA "A") + + test "RNA complement" $ + Assert.equal (Just "UGCACCAGAAUU") (toRNA "ACGTGGTCTTAA") + + test "correctly handles invalid input (RNA instead of DNA)" $ + Assert.equal Nothing (toRNA "U") + + test "correctly handles completely invalid DNA input" $ + Assert.equal Nothing (toRNA "XXX") + + test "correctly handles partially invalid DNA input" $ + Assert.equal Nothing (toRNA "ACGTXXXCTTAA") From 6e8a3b135468d448b5d8ee8c6d2047acbdbed6ca Mon Sep 17 00:00:00 2001 From: Eoin Houlihan Date: Thu, 19 Oct 2017 20:25:54 +0100 Subject: [PATCH 2/2] Simplify example solution --- .../examples/src/RNATranscription.purs | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/exercises/rna-transcription/examples/src/RNATranscription.purs b/exercises/rna-transcription/examples/src/RNATranscription.purs index 084faa1..796dfbe 100644 --- a/exercises/rna-transcription/examples/src/RNATranscription.purs +++ b/exercises/rna-transcription/examples/src/RNATranscription.purs @@ -3,20 +3,16 @@ module RNATranscription ) where import Prelude -import Data.Array (zip) -import Data.Map (Map, fromFoldable, lookup) -import Data.Maybe (Maybe) +import Data.Maybe (Maybe(..)) import Data.String (fromCharArray, toCharArray) import Data.Traversable (traverse) toRNA :: String -> Maybe String -toRNA s = fromCharArray <$> traverse (_ `lookup` rnaMap) (toCharArray s) +toRNA dna = fromCharArray <$> traverse complement (toCharArray dna) -dna :: Array Char -dna = toCharArray "CGAT" - -rna :: Array Char -rna = toCharArray "GCUA" - -rnaMap :: Map Char Char -rnaMap = fromFoldable $ zip dna rna +complement :: Char -> Maybe Char +complement 'C' = Just 'G' +complement 'G' = Just 'C' +complement 'A' = Just 'U' +complement 'T' = Just 'A' +complement _ = Nothing