knucleotide.scala-2.scala
来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 107 行
SCALA
107 行
/* The Computer Language Shootout http://shootout.alioth.debian.org/ contributed by Isaac Gouy*/import java.io._import scala.collection.mutable.HashMapimport scala.Consoleobject knucleotide { var sequence: String = _ def main(args: Array[String]) = { val r = new BufferedReader(new InputStreamReader(System.in)) findSequence(">THREE", r) sequence = nextSequence(r) r.close writeFrequencies(1) writeFrequencies(2) writeCount("GGT") writeCount("GGTA") writeCount("GGTATT") writeCount("GGTATTTTAATT") writeCount("GGTATTTTAATTTATAGT") } def findSequence(id: String, r: BufferedReader): Unit = { var line = r.readLine while (line != null) { val c = line.charAt(0) if (c == '>' && line.startsWith(id)) return line = r.readLine } } def nextSequence(r: BufferedReader): String = { val b = new StringBuffer() var line = r.readLine while (line != null) { val c = line.charAt(0) if (c == '>') { return b.toString } else { if (c != ';') b.append(line.toUpperCase) } line = r.readLine } b.toString } class Counter(_value: int){ var value = _value def ++() = { value = value + 1 } } def generateFrequencies(length: int) = { val d: HashMap[String,Counter] = new HashMap() def kFrequency(offset: int, j: int) = { val n = sequence.length - j + 1 var i = offset while (i < n){ val k = sequence.substring(i,i+j) d.get(k) match { case None => d += (k -> new Counter(1)) case Some(c) => c++ } i = i + j } } for (val o <- Iterator.range(0,length)) kFrequency(o,length) d } def writeFrequencies(j: int) = { val d = generateFrequencies(j) val n = sequence.length - j + 1.0 val sortedValues = d.toList.sort( (a,b) => if (a._2.value == b._2.value) a._1 > b._1 else a._2.value > b._2.value ) for (val a <- sortedValues) Console.printf("%s %.3f\n", a._1, a._2.value / n * 100.0) Console.println } def writeCount(fragment: String) = { val d = generateFrequencies(fragment.length) val count = if (d.contains(fragment)) d(fragment).value else 0 Console.println(count + "\t" + fragment) }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?