summaryrefslogtreecommitdiff
path: root/test/pending/shootout/revcomp.scala-2.scala
blob: 03fb25af1bc4c2dae433e69c9c1d19c8ef1984ee (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/* The Computer Language Shootout
   http://shootout.alioth.debian.org/
   contributed by Isaac Gouy
*/

import java.io._
import scala.collection.mutable.Stack

object revcomp {

   val IUB = IUBCodeComplements

   def IUBCodeComplements() = {
      val code = "ABCDGHKMNRSTVWYabcdghkmnrstvwy".getBytes
      val comp = "TVGHCDMKNYSABWRTVGHCDMKNYSABWR".getBytes
      val a: Array[Byte] = new Array( 'z'.toByte )

      for (indexValue <- code zip comp)
         indexValue match { case (i,v) => a(i) = v }

      a
   }


   type LineStack = Stack[Array[Byte]]

   def main(args: Array[String]) = {
      val r = new BufferedReader(new InputStreamReader(System.in))
      val w = new BufferedOutputStream(System.out)

      var lines: LineStack = new Stack
      var desc = ""

      var line = r.readLine
      while (line != null) {
         val c = line.charAt(0)
         if (c == '>'){
            if (desc.length > 0){
               complementReverseWrite(desc, lines, w)
               lines = new Stack
            }
            desc = line
         } else {
            if (c != ';') lines += line.getBytes
         }
         line = r.readLine
      }
      r.close

      if (desc.length > 0) complementReverseWrite(desc, lines, w)
      w.close
   }


   def complementReverseWrite(desc: String, lines: LineStack,
         w: BufferedOutputStream) = {

      def inplaceComplementReverse(b: Array[Byte]) = {
         var i = 0
         var j = b.length - 1
         while (i < j){
            val swap = b(i)
            b(i) = IUB( b(j) )
            b(j) = IUB( swap )
            i = i + 1
            j = j - 1
         }
         if (i == j) b(i) = IUB( b(i) )
      }

      val nl = '\n'.toByte
      w.write(desc.getBytes); w.write(nl)

      val n = 60
      val k = if (lines.isEmpty) 0 else lines.top.length
      val isSplitLine = k < n
      var isFirstLine = true

      while (!lines.isEmpty) {
        val line = lines.pop
        inplaceComplementReverse(line)

        if (isSplitLine){
           if (isFirstLine){ w.write(line); isFirstLine = false }
           else { w.write(line,0,n-k); w.write(nl); w.write(line,n-k,k) }
        }
        else { w.write(line); w.write(nl) }
      }
      if (isSplitLine && !isFirstLine) w.write(nl)
   }

}