[Shootout-list] New D rev-comp.
davejf@frontiernet.net
davejf@frontiernet.net
Thu, 24 Mar 2005 03:15:59 +0000
This message is in MIME format.
--=_2f73an1iufpc
Content-Type: text/plain; charset="ISO-8859-1"
Content-Disposition: inline
Content-Transfer-Encoding: 7bit
Please see attached.
Thanks,
- Dave
--=_2f73an1iufpc
Content-Type: text/plain; charset="ISO-8859-1"; name="revcomp.d"
Content-Disposition: attachment; filename="revcomp.d"
Content-Transfer-Encoding: 7bit
/* The Great Computer Language Shootout
http://shootout.alioth.debian.org/
Contributed by Dave Fladebo
compile: dmd -O -inline -release knucleotide.d
*/
import std.ctype, std.outbuffer, std.stdio, std.stream, std.string;
void main()
{
char[4096] bufr;
BufferedStream bsi = new BufferedStream(std.stream.stdin,bufr.length);
BufferedStream bso = new BufferedStream(std.stream.stdout);
int offset;
char[] desc,line,data,rc = new char[char.max];
for(char c = 0; c < char.max; c++) rc[c] = revComp(c);
data.length = bsi.size;
while(!bsi.eof())
{
line = bsi.readLine(bufr);
if(line.length)
{
if(line[0] == '>')
{
writeRC(desc,data[0..offset],line,rc,bso);
offset = 0;
}
else
{
int end = offset + line.length;
data[offset..end] = line;
offset += line.length;
}
}
}
writeRC(desc,data[0..offset],line,rc,bso);
bso.close();
}
void writeRC(inout char[] desc,char[] data,char[] line,char[] rc,BufferedStream bso)
{
if(desc.length)
{
const int lineLen = 60;
char[lineLen+1] lineOut;
int j,k;
bso.writefln(desc);
lineOut[lineLen] = '\n';
foreach(int i, inout char c; data.reverse)
{
lineOut[k] = c = rc[c];
k++;
if(k == lineLen)
{
bso.write(cast(ubyte[])lineOut);
j = i + 1;
k = 0;
}
}
if(k > 0) bso.writefln(data[j..data.length]);
}
desc = line.dup;
}
char revComp(char c)
{
c = std.ctype.toupper(c);
switch(c)
{
case 'A': c = 'T'; break;
case 'B': c = 'V'; break;
case 'C': c = 'G'; break;
case 'D': c = 'H'; break;
case 'G': c = 'C'; break;
case 'H': c = 'D'; break;
case 'K': c = 'M'; break;
case 'M': c = 'K'; break;
case 'R': c = 'Y'; break;
case 'T': c = 'A'; break;
case 'V': c = 'B'; break;
case 'Y': c = 'R'; break;
default : break;
}
return c;
}
--=_2f73an1iufpc--