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)
}
}
|