USING: io io.files io.streams.duplex kernel sequences sequences.private strings vectors words memoize splitting grouping hints unicode.case continuations io.encodings.ascii ; IN: benchmark.reverse-complement MEMO: trans-map ( -- str ) 256 >string "TGCAAKYRMBDHV" "ACGTUMRYKVHDB" [ pick set-nth ] 2each ; : do-trans-map ( str -- ) [ ch>upper trans-map nth ] change-each ; HINTS: do-trans-map string ; : translate-seq ( seq -- str ) concat dup reverse-here dup do-trans-map ; : show-seq ( seq -- ) translate-seq 60 [ print ] each ; : do-line ( seq line -- seq ) dup first ">;" memq? [ over show-seq print dup delete-all ] [ over push ] if ; HINTS: do-line vector string ; : (reverse-complement) ( seq -- ) readln [ do-line (reverse-complement) ] [ show-seq ] if* ; : reverse-complement ( infile outfile -- ) ascii [ ascii [ 500000 (reverse-complement) ] with-file-reader ] with-file-writer ; : reverse-complement-in ( -- path ) "reverse-complement-in.txt" temp-file ; : reverse-complement-out ( -- path ) "reverse-complement-out.txt" temp-file ; : reverse-complement-main ( -- ) reverse-complement-in reverse-complement-out reverse-complement ; MAIN: reverse-complement-main