consolidated go and scala repos into this repo as well
This commit is contained in:
parent
af2ce045ec
commit
8d4cc2b83c
5
go/README.md
Normal file
5
go/README.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# go-rosalind
|
||||||
|
|
||||||
|
go-rosalind is a command-line utility for running solutions to [Rosalind.info](rosalind.info) problems that were written in go.
|
||||||
|
|
||||||
|
This is mostly just used by me to consolidate some repeated code and practice writing stuff in Go.
|
19
go/cmd/cons.go
Normal file
19
go/cmd/cons.go
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"gitlab.com/fizzizist/go-rosalind/pkg/solutions"
|
||||||
|
)
|
||||||
|
|
||||||
|
var consCmd = &cobra.Command{
|
||||||
|
Use: "cons",
|
||||||
|
Short: "Finds a Motif in input DNA",
|
||||||
|
Args: cobra.MinimumNArgs(1),
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
solutions.Cons(args[0])
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
rootCmd.AddCommand(consCmd)
|
||||||
|
}
|
12
go/cmd/root.go
Normal file
12
go/cmd/root.go
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package cmd
|
||||||
|
|
||||||
|
import "github.com/spf13/cobra"
|
||||||
|
|
||||||
|
var rootCmd = &cobra.Command{
|
||||||
|
Use: "go-rosalind",
|
||||||
|
Short: "An app for running Rosalind solutions",
|
||||||
|
}
|
||||||
|
|
||||||
|
func Execute() error {
|
||||||
|
return rootCmd.Execute()
|
||||||
|
}
|
19
go/cmd/subs.go
Normal file
19
go/cmd/subs.go
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"gitlab.com/fizzizist/go-rosalind/pkg/solutions"
|
||||||
|
)
|
||||||
|
|
||||||
|
var dnaMotifsCmd = &cobra.Command{
|
||||||
|
Use: "subs",
|
||||||
|
Short: "Finds a Motif in input DNA",
|
||||||
|
Args: cobra.MinimumNArgs(1),
|
||||||
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
solutions.FindMotifs(args[0])
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
rootCmd.AddCommand(dnaMotifsCmd)
|
||||||
|
}
|
15
go/main.go
Normal file
15
go/main.go
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"gitlab.com/fizzizist/go-rosalind/cmd"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
if err := cmd.Execute(); err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
86
go/pkg/io/file_tools.go
Normal file
86
go/pkg/io/file_tools.go
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
package io
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func FileToStringArray(filename string) ([]string, error) {
|
||||||
|
file, err := os.Open(filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
scanner.Split(bufio.ScanLines)
|
||||||
|
|
||||||
|
var fileLines []string
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
fileLines = append(fileLines, scanner.Text())
|
||||||
|
}
|
||||||
|
if err := scanner.Err(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
file.Close()
|
||||||
|
|
||||||
|
return fileLines, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func WriteStringsToFile(content []string, filepath string) error {
|
||||||
|
file, err := os.Create(filepath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
w := bufio.NewWriter(file)
|
||||||
|
|
||||||
|
for _, line := range content {
|
||||||
|
_, err = fmt.Fprintln(w, line)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = w.Flush(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err = file.Close(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ParseFasta parses a .fasta formatted file returning a list of labels and a list of
|
||||||
|
// content in separate string arrays.
|
||||||
|
func ParseFasta(filename string) ([]string, []string, error) {
|
||||||
|
lines, err := FileToStringArray(filename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var labels []string
|
||||||
|
var content []string
|
||||||
|
var currString []string
|
||||||
|
for _, line := range lines {
|
||||||
|
if line[0] == '>' {
|
||||||
|
labels = append(labels, line)
|
||||||
|
if len(currString) > 0 {
|
||||||
|
content = append(content, strings.Join(currString, ""))
|
||||||
|
currString = []string{}
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
currString = append(currString, line)
|
||||||
|
}
|
||||||
|
if len(currString) > 0 {
|
||||||
|
content = append(content, strings.Join(currString, ""))
|
||||||
|
}
|
||||||
|
|
||||||
|
return labels, content, nil
|
||||||
|
}
|
76
go/pkg/solutions/cons.go
Normal file
76
go/pkg/solutions/cons.go
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
package solutions
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"gitlab.com/fizzizist/go-rosalind/pkg/io"
|
||||||
|
)
|
||||||
|
|
||||||
|
func CompileOutput(consensus string, profile [][]int) []string {
|
||||||
|
output := []string{consensus}
|
||||||
|
idxMap := []string{"A", "C", "G", "T"}
|
||||||
|
|
||||||
|
for i, val := range profile {
|
||||||
|
var strProf []string
|
||||||
|
for _, inVal := range val {
|
||||||
|
strProf = append(strProf, strconv.Itoa(inVal))
|
||||||
|
}
|
||||||
|
output = append(output, fmt.Sprintf("%s: %s", idxMap[i], strings.Join(strProf, " ")))
|
||||||
|
}
|
||||||
|
|
||||||
|
return output
|
||||||
|
}
|
||||||
|
|
||||||
|
func Cons(filename string) {
|
||||||
|
_, lines, err := io.ParseFasta(filename)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed to read file: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
profile := make([][]int, 4) // 1 for each codon
|
||||||
|
for i := range profile {
|
||||||
|
profile[i] = make([]int, len(lines[1]))
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, value := range lines {
|
||||||
|
for j, s := range value {
|
||||||
|
switch {
|
||||||
|
case s == 'A':
|
||||||
|
profile[0][j]++
|
||||||
|
case s == 'C':
|
||||||
|
profile[1][j]++
|
||||||
|
case s == 'G':
|
||||||
|
profile[2][j]++
|
||||||
|
case s == 'T':
|
||||||
|
profile[3][j]++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var consensus []string
|
||||||
|
idxMap := []string{"A", "C", "G", "T"}
|
||||||
|
for i := range profile[0] {
|
||||||
|
maxCons := "A"
|
||||||
|
maxVal := 0
|
||||||
|
for j, s := range idxMap {
|
||||||
|
if profile[j][i] > maxVal {
|
||||||
|
maxCons = s
|
||||||
|
maxVal = profile[j][i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
consensus = append(consensus, maxCons)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Writing output file...")
|
||||||
|
err = io.WriteStringsToFile(
|
||||||
|
CompileOutput(strings.Join(consensus, ""), profile),
|
||||||
|
"results/cons.txt",
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed writing output file: %s", err)
|
||||||
|
}
|
||||||
|
fmt.Println("Done.")
|
||||||
|
}
|
33
go/pkg/solutions/subs.go
Normal file
33
go/pkg/solutions/subs.go
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
package solutions
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"gitlab.com/fizzizist/go-rosalind/pkg/io"
|
||||||
|
)
|
||||||
|
|
||||||
|
func FindMotifs(filename string) {
|
||||||
|
lines, err := io.FileToStringArray(filename)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed to read file: %s", err)
|
||||||
|
}
|
||||||
|
if len(lines) != 2 {
|
||||||
|
log.Fatalf("Input file should have exactly 2 lines, a DNA string and a motif")
|
||||||
|
}
|
||||||
|
|
||||||
|
dna := lines[0]
|
||||||
|
motif := lines[1]
|
||||||
|
motLen := len(motif)
|
||||||
|
var positions []string
|
||||||
|
|
||||||
|
for i := 0; i <= len(dna)-motLen; i++ {
|
||||||
|
if motif == dna[i:i+motLen] {
|
||||||
|
positions = append(positions, strconv.Itoa(i+1))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(strings.Join(positions, " "))
|
||||||
|
|
||||||
|
}
|
14
go/testing/cons.fasta
Normal file
14
go/testing/cons.fasta
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
>Rosalind_1
|
||||||
|
ATCCAGCT
|
||||||
|
>Rosalind_2
|
||||||
|
GGGCAACT
|
||||||
|
>Rosalind_3
|
||||||
|
ATGGATCT
|
||||||
|
>Rosalind_4
|
||||||
|
AAGCAACC
|
||||||
|
>Rosalind_5
|
||||||
|
TTGGAACT
|
||||||
|
>Rosalind_6
|
||||||
|
ATGCCATT
|
||||||
|
>Rosalind_7
|
||||||
|
ATGGCACT
|
2
go/testing/subs.txt
Normal file
2
go/testing/subs.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
GATATATGCATATACTT
|
||||||
|
ATAT
|
5
scala/project/Dependencies.scala
Normal file
5
scala/project/Dependencies.scala
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import sbt._
|
||||||
|
|
||||||
|
object Dependencies {
|
||||||
|
lazy val scalaTest = "org.scalatest" %% "scalatest" % "3.0.5"
|
||||||
|
}
|
14
scala/src/main/scala/dna/dna.scala
Normal file
14
scala/src/main/scala/dna/dna.scala
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package dna
|
||||||
|
|
||||||
|
import scala.io.Source
|
||||||
|
|
||||||
|
object DNA {
|
||||||
|
def main(args: Array[String]) = {
|
||||||
|
val filename = "DNA.txt"
|
||||||
|
val dnaStr = Source.fromFile(filename).getLines.mkString
|
||||||
|
val acgt = Array(0, 0, 0, 0)
|
||||||
|
val acgtMap = Map('A' -> 0, 'C' -> 1, 'G' -> 2, 'T' -> 3)
|
||||||
|
for (c <- dnaStr) acgt(acgtMap(c)) += 1
|
||||||
|
println("%d %d %d %d".format(acgt(0), acgt(1), acgt(2), acgt(3)))
|
||||||
|
}
|
||||||
|
}
|
21
scala/src/main/scala/fib/fib.scala
Normal file
21
scala/src/main/scala/fib/fib.scala
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package fib
|
||||||
|
|
||||||
|
import scala.io.Source
|
||||||
|
|
||||||
|
object FIB {
|
||||||
|
def main(args: Array[String]) = {
|
||||||
|
val n = args(0).toInt
|
||||||
|
val k = args(1).toInt
|
||||||
|
var b = BigInt(0)
|
||||||
|
var a = BigInt(1)
|
||||||
|
var newA = BigInt(0)
|
||||||
|
var i = 0
|
||||||
|
for (i <- 2 until n) {
|
||||||
|
a += newA
|
||||||
|
newA = b
|
||||||
|
b = a*k
|
||||||
|
}
|
||||||
|
val res = a + b + newA
|
||||||
|
println(res.toString)
|
||||||
|
}
|
||||||
|
}
|
48
scala/src/main/scala/gc/gc.scala
Normal file
48
scala/src/main/scala/gc/gc.scala
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
package gc
|
||||||
|
|
||||||
|
import scala.io.Source
|
||||||
|
import java.io._
|
||||||
|
|
||||||
|
|
||||||
|
class GCCalculator() {
|
||||||
|
var dnaStr = ""
|
||||||
|
var topContent = 0.0
|
||||||
|
var topDNA = ""
|
||||||
|
var currentDNA = ""
|
||||||
|
|
||||||
|
def checkCurrDNA() {
|
||||||
|
val gcCheck = (c: Char) => (c == 'G' || c == 'C')
|
||||||
|
val gcContent = dnaStr.filter(gcCheck).length
|
||||||
|
val contentPerc = (gcContent.toFloat / dnaStr.length.toFloat) * 100.0
|
||||||
|
if (contentPerc > topContent) {
|
||||||
|
topContent = contentPerc
|
||||||
|
topDNA = currentDNA
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def printTopGC() {
|
||||||
|
val filename = "GC.txt"
|
||||||
|
for (line <- Source.fromFile(filename).getLines) {
|
||||||
|
if (line.startsWith(">")) {
|
||||||
|
if (dnaStr.length > 0) {
|
||||||
|
checkCurrDNA
|
||||||
|
}
|
||||||
|
currentDNA = line
|
||||||
|
dnaStr = ""
|
||||||
|
} else {
|
||||||
|
dnaStr += line
|
||||||
|
}
|
||||||
|
}
|
||||||
|
checkCurrDNA
|
||||||
|
println(topDNA)
|
||||||
|
println(f"$topContent%.6f")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
object GC {
|
||||||
|
def main(args: Array[String]) = {
|
||||||
|
val gcCalc = new GCCalculator
|
||||||
|
gcCalc.printTopGC
|
||||||
|
}
|
||||||
|
}
|
18
scala/src/main/scala/hamm/hamm.scala
Normal file
18
scala/src/main/scala/hamm/hamm.scala
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package hamm
|
||||||
|
|
||||||
|
import scala.io.Source
|
||||||
|
import java.io._
|
||||||
|
|
||||||
|
object HAMM {
|
||||||
|
def main(args: Array[String]) = {
|
||||||
|
val filename = "HAMM.txt"
|
||||||
|
val dna = Source.fromFile(filename).getLines.toList
|
||||||
|
var count = 0
|
||||||
|
for ((i, j) <- (dna(0), dna(1)).zipped) {
|
||||||
|
if (i != j) {
|
||||||
|
count += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println(count)
|
||||||
|
}
|
||||||
|
}
|
24
scala/src/main/scala/iprb/iprb.scala
Normal file
24
scala/src/main/scala/iprb/iprb.scala
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package rna
|
||||||
|
|
||||||
|
import scala.io.Source
|
||||||
|
|
||||||
|
object IPRB {
|
||||||
|
def main(args: Array[String]) = {
|
||||||
|
val popul = args.map(_.toDouble)
|
||||||
|
// algorithm just assumes the following inputs
|
||||||
|
// popul(0) = homozygous dominant
|
||||||
|
// popul(1) = heterozygous
|
||||||
|
// popul(2) = homozygous recessive
|
||||||
|
val total = popul.sum
|
||||||
|
// case of both homozygous recessive
|
||||||
|
var probabTotal = (popul(2) / total) * ((popul(2) - 1) / (total - 1))
|
||||||
|
// case of heterozygous and homozygous recessive mix
|
||||||
|
probabTotal += ((popul(2) / total) * (popul(1) / (total - 1))) * 0.5
|
||||||
|
// case of homozygous recessive and heterozygous mix
|
||||||
|
probabTotal += ((popul(1) / total) * (popul(2) / (total - 1))) * 0.5
|
||||||
|
// case of both heterozygous
|
||||||
|
probabTotal += ((popul(1) / total) * ((popul(1) - 1) / (total - 1))) * 0.25
|
||||||
|
probabTotal = 1 - probabTotal
|
||||||
|
println(f"$probabTotal%.5f")
|
||||||
|
}
|
||||||
|
}
|
84
scala/src/main/scala/prot/prot.scala
Normal file
84
scala/src/main/scala/prot/prot.scala
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
package prot
|
||||||
|
|
||||||
|
import scala.io.Source
|
||||||
|
import java.io._
|
||||||
|
|
||||||
|
object PROT {
|
||||||
|
def main(args: Array[String]) = {
|
||||||
|
val filename = "PROT.txt"
|
||||||
|
val rnaStr = Source.fromFile(filename).getLines.mkString
|
||||||
|
val transMap = Map(
|
||||||
|
"UUU" -> "F",
|
||||||
|
"CUU" -> "L",
|
||||||
|
"AUU" -> "I",
|
||||||
|
"GUU" -> "V",
|
||||||
|
"UUC" -> "F",
|
||||||
|
"CUC" -> "L",
|
||||||
|
"AUC" -> "I",
|
||||||
|
"GUC" -> "V",
|
||||||
|
"UUA" -> "L",
|
||||||
|
"CUA" -> "L",
|
||||||
|
"AUA" -> "I",
|
||||||
|
"GUA" -> "V",
|
||||||
|
"UUG" -> "L",
|
||||||
|
"CUG" -> "L",
|
||||||
|
"AUG" -> "M",
|
||||||
|
"GUG" -> "V",
|
||||||
|
"UCU" -> "S",
|
||||||
|
"CCU" -> "P",
|
||||||
|
"ACU" -> "T",
|
||||||
|
"GCU" -> "A",
|
||||||
|
"UCC" -> "S",
|
||||||
|
"CCC" -> "P",
|
||||||
|
"ACC" -> "T",
|
||||||
|
"GCC" -> "A",
|
||||||
|
"UCA" -> "S",
|
||||||
|
"CCA" -> "P",
|
||||||
|
"ACA" -> "T",
|
||||||
|
"GCA" -> "A",
|
||||||
|
"UCG" -> "S",
|
||||||
|
"CCG" -> "P",
|
||||||
|
"ACG" -> "T",
|
||||||
|
"GCG" -> "A",
|
||||||
|
"UAU" -> "Y",
|
||||||
|
"CAU" -> "H",
|
||||||
|
"AAU" -> "N",
|
||||||
|
"GAU" -> "D",
|
||||||
|
"UAC" -> "Y",
|
||||||
|
"CAC" -> "H",
|
||||||
|
"AAC" -> "N",
|
||||||
|
"GAC" -> "D",
|
||||||
|
"UAA" -> "Stop",
|
||||||
|
"CAA" -> "Q",
|
||||||
|
"AAA" -> "K",
|
||||||
|
"GAA" -> "E",
|
||||||
|
"UAG" -> "Stop",
|
||||||
|
"CAG" -> "Q",
|
||||||
|
"AAG" -> "K",
|
||||||
|
"GAG" -> "E",
|
||||||
|
"UGU" -> "C",
|
||||||
|
"CGU" -> "R",
|
||||||
|
"AGU" -> "S",
|
||||||
|
"GGU" -> "G",
|
||||||
|
"UGC" -> "C",
|
||||||
|
"CGC" -> "R",
|
||||||
|
"AGC" -> "S",
|
||||||
|
"GGC" -> "G",
|
||||||
|
"UGA" -> "Stop",
|
||||||
|
"CGA" -> "R",
|
||||||
|
"AGA" -> "R",
|
||||||
|
"GGA" -> "G",
|
||||||
|
"UGG" -> "W",
|
||||||
|
"CGG" -> "R",
|
||||||
|
"AGG" -> "R",
|
||||||
|
"GGG" -> "G",
|
||||||
|
)
|
||||||
|
val rnaSegs = rnaStr.grouped(3).toList
|
||||||
|
var protStr = ""
|
||||||
|
rnaSegs.iterator.takeWhile(transMap(_) != "Stop").foreach(protStr += transMap(_))
|
||||||
|
println(protStr)
|
||||||
|
val pw = new PrintWriter(new File("PROTOut.txt"))
|
||||||
|
pw.write(protStr)
|
||||||
|
pw.close()
|
||||||
|
}
|
||||||
|
}
|
16
scala/src/main/scala/revc/revc.scala
Normal file
16
scala/src/main/scala/revc/revc.scala
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package rna
|
||||||
|
|
||||||
|
import scala.io.Source
|
||||||
|
import java.io._
|
||||||
|
|
||||||
|
object RNA {
|
||||||
|
def main(args: Array[String]) = {
|
||||||
|
val filename = "REVC.txt"
|
||||||
|
val dnaStr = Source.fromFile(filename).getLines.mkString
|
||||||
|
val compMap = Map('A' -> 'T', 'T' -> 'A', 'C' -> 'G', 'G' -> 'C')
|
||||||
|
val comp = dnaStr.reverse.map(compMap(_))
|
||||||
|
val pw = new PrintWriter(new File("REVCOut.txt"))
|
||||||
|
pw.write(comp)
|
||||||
|
pw.close()
|
||||||
|
}
|
||||||
|
}
|
15
scala/src/main/scala/rna/rna.scala
Normal file
15
scala/src/main/scala/rna/rna.scala
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
package rna
|
||||||
|
|
||||||
|
import scala.io.Source
|
||||||
|
import java.io._
|
||||||
|
|
||||||
|
object RNA {
|
||||||
|
def main(args: Array[String]) = {
|
||||||
|
val filename = "RNA.txt"
|
||||||
|
val dnaStr = Source.fromFile(filename).getLines.mkString
|
||||||
|
val rnaStr = dnaStr.replace('T', 'U')
|
||||||
|
val pw = new PrintWriter(new File("RNAOut.txt"))
|
||||||
|
pw.write(rnaStr)
|
||||||
|
pw.close()
|
||||||
|
}
|
||||||
|
}
|
9
scala/src/test/scala/example/HelloSpec.scala
Normal file
9
scala/src/test/scala/example/HelloSpec.scala
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
import org.scalatest._
|
||||||
|
|
||||||
|
class HelloSpec extends FlatSpec with Matchers {
|
||||||
|
"The Hello object" should "say hello" in {
|
||||||
|
Hello.greeting shouldEqual "hello"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user