code for Computer Language Shootout

Michael Spencer mahs at telcopartners.com
Wed Mar 16 02:21:02 EST 2005


Jacob Lee wrote:
> On Tue, 15 Mar 2005 21:38:48 -0800, Michael Spencer wrote:
> 
> 
>>string.translate is a good idea.  Note you can handle upper-casing and
>>translation in one operation by adding a mapping from lower case to the
>>complement i.e.,
>>
>>table = string.maketrans('ACBDGHK\nMNSRUTWVYacbdghkmnsrutwvy',
>>                          'TGVHCDM\nKNSYAAWBRTGVHCDMKNSYAAWBR')
>>
> 
> Good call.
> 
> 
>>This looks unwieldy - especially writing to sys.stdout oe character at a
>>time. I may not have understood the spec exactly, but isn't this the
>>same as:
>>
>>for line in sys.stdin:
>>     if line and (line[0] == ">" or line[0] == ";"):
>>         print line
>>     else:
>>         print line.translate(table)
>>
>>
> 
> That's the immediately obvious solution, but it doesn't actually fulfill
> the problem requirements. What if your last line is less than 60
> characters long? You no longer will be displaying the input in reverse
> order. Otherwise you'd be right - my solution would be unnecessarily
> unwieldy (and the problem would be much simpler...) .
> 
yes it would be, wouldn't it ;-)

How about this then:

basetable = string.maketrans('ACBDGHKMNSRUTWVYacbdghkmnsrutwvy',
                              'TGVHCDMKNSYAAWBRTGVHCDMKNSYAAWBR')

from collections import deque
from itertools import islice

def output(seq, linelength = 60):
     if seq:
         iterseq = iter(seq)
         while iterseq:
             print "".join(islice(iterseq,linelength))

def revcomp(input = sys.stdin):
     seqlines = deque()
     for line in input:
         if line[0] in ">;":
             output(seqlines)
             print line,
             seqlines.clear()
         else:
             seqlines.extendleft(line.translate(basetable, "\n\r"))
     output(seqlines)


It would be nice to inline the output function, and re-arrange the iteration so 
that EOF triggers the same suite as line[0] in ">;"

Michael




More information about the Python-list mailing list