59 lines
1.4 KiB
Factor
59 lines
1.4 KiB
Factor
|
IN: temporary
|
||
|
USING: compiler hashtables io kernel math math namespaces
|
||
|
sequences strings vectors words words ;
|
||
|
|
||
|
DEFER: trans-map
|
||
|
|
||
|
: add-translation \ trans-map get set-nth ;
|
||
|
|
||
|
[
|
||
|
256 0 <string> \ trans-map set
|
||
|
26 [ CHAR: A + dup add-translation ] each
|
||
|
26 [ dup CHAR: A + swap CHAR: a + add-translation ] each
|
||
|
|
||
|
"TGCAAKYRMBDHV"
|
||
|
"ACGTUMRYKVHDB"
|
||
|
2dup
|
||
|
[ add-translation ] 2each
|
||
|
[ ch>lower add-translation ] 2each
|
||
|
|
||
|
\ trans-map get
|
||
|
] with-scope
|
||
|
|
||
|
\ trans-map swap unit define-compound
|
||
|
\ trans-map t "inline" set-word-prop
|
||
|
|
||
|
: translate-seq ( seq -- sbuf )
|
||
|
[
|
||
|
30000000 <sbuf> building set
|
||
|
<reversed> [ <reversed> % ] each
|
||
|
building get dup [ trans-map nth ] inject
|
||
|
] with-scope ;
|
||
|
|
||
|
SYMBOL: out
|
||
|
|
||
|
: seg ( sbuf n -- str )
|
||
|
60 * dup 60 + pick length min rot <slice> >string ;
|
||
|
|
||
|
: show-seq ( seq -- )
|
||
|
translate-seq dup length 59 + 60 /i
|
||
|
[ seg out get stream-print ] each-with ;
|
||
|
|
||
|
: do-line ( seq line -- seq )
|
||
|
dup first ">;" memq? [
|
||
|
over show-seq out get stream-print dup delete-all
|
||
|
] [
|
||
|
over push
|
||
|
] if ;
|
||
|
|
||
|
: (reverse-complement) ( seq -- )
|
||
|
readln [ do-line (reverse-complement) ] [ show-seq ] if* ;
|
||
|
|
||
|
: reverse-complement ( infile outfile -- )
|
||
|
<file-writer> [
|
||
|
stdio get out set
|
||
|
<file-reader> [
|
||
|
500000 <vector> (reverse-complement)
|
||
|
] with-stream
|
||
|
] with-stream ;
|