From b63cd2deb6d148db96bb29caedfddad4cd00d334 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 20 Oct 2012 06:18:26 -0500 Subject: another solution --- ORF.pl | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 ORF.pl diff --git a/ORF.pl b/ORF.pl new file mode 100644 index 0000000..517a05b --- /dev/null +++ b/ORF.pl @@ -0,0 +1,48 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use 5.016; + +my %map = qw( + UUU F CUU L AUU I GUU V + UUC F CUC L AUC I GUC V + UUA L CUA L AUA I GUA V + UUG L CUG L AUG M GUG V + UCU S CCU P ACU T GCU A + UCC S CCC P ACC T GCC A + UCA S CCA P ACA T GCA A + UCG S CCG P ACG T GCG A + UAU Y CAU H AAU N GAU D + UAC Y CAC H AAC N GAC D + UAA Stop CAA Q AAA K GAA E + UAG Stop CAG Q AAG K GAG E + UGU C CGU R AGU S GGU G + UGC C CGC R AGC S GGC G + UGA Stop CGA R AGA R GGA G + UGG W CGG R AGG R GGG G +); + +my $rna = <> =~ tr/T/U/r; +my @proteins; + +for my $string ($rna, scalar(reverse($rna =~ tr/ACGU/UGCA/r))) { + my $start = 0; + while ((my $pos = index($string, 'AUG', $start)) != -1) { + my $orf = substr($string, $pos); + my $protein; + my $stop; + for my $amino (map { $map{$_} } $orf =~ /.../g) { + if ($amino eq 'Stop') { + $stop = 1; + last; + } + $protein .= $amino; + } + push @proteins, $protein + if $stop; + $start = $pos + 1; + } +} + +my %seen; +say for grep { !$seen{$_}++ } @proteins; -- cgit v1.2.3