[PDD] Add docs for the Parrot_PMC_push_* and Parrot_PMC_pop_* functions
[parrot.git] / examples / shootout / knucleotide.pir
blob5976cec06a57ae9a99754a4675966565adc9a86e
1 # Copyright (C) 2005-2009, Parrot Foundation.
2 # $Id$
4 .sub main :main
5         .local pmc stdin
6         .local string line
7         stdin = getstdin
8         # Skip to block THREE
9 beginwhile_1:
10         line = readline stdin
11         $S0 = chopn line, -6
12         if $S0 != ">THREE" goto beginwhile_1
13         line = ''
14         .local string seq
15 beginwhile_2:
16         chopn line, 1
17         seq .= line
18         line = readline stdin
19         $I0 = length line
20         unless $I0 goto endwhile_2
21         $S0 = chopn line, -1
22         if $S0 != ">" goto beginwhile_2
23 endwhile_2:
24         upcase seq
25         sort_seq(seq, 1)
26         sort_seq(seq, 2)
27         find_seq(seq, "GGT")
28         find_seq(seq, "GGTA")
29         find_seq(seq, "GGTATT")
30         find_seq(seq, "GGTATTTTAATT")
31         find_seq(seq, "GGTATTTTAATTTATAGT")
32 .end
34 .sub sort_seq
35         .param string seq
36         .param int len
37         .local int i, seqend
38         .local pmc table
39         table = new 'Hash'
40         i = 0
41         seqend = length seq
42 beginfor:
43         unless i < seqend goto endfor
44         $S0 = substr seq, i, len
45         $I1 = length $S0
46         if $I1 < len goto endfor
47         $I0 = table[$S0]
48         inc $I0
49         table[$S0] = $I0
50         inc i
51         goto beginfor
52 endfor:
53         sort_n_print(table, i)
54         print "\n"
55 .end
57 .include "iterator.pasm"
58 .sub sort_n_print
59         .param pmc table
60         .param int seqlen
61         .local int i
63         .local pmc array
64         array = new 'FixedPMCArray'
65         $I0 = elements table
66         array = $I0
68         .local pmc it
69     it = iter table
70         set it, .ITERATE_FROM_START
71         i = 0
72 iter_loop_1:
73         unless it goto iter_end_1
74         $S0 = shift it
75         $I0 = table[$S0]
76         $P0 = new 'FixedPMCArray'
77         $P0 = 2
78         array[i] = $P0
79         array[i;0] = $S0
80         array[i;1] = $I0
81         inc i
82         goto iter_loop_1
83 iter_end_1:
85         $P0 = get_global "sort"
86         array."sort"($P0)
88         $I0 = array
89         i = 0
90 beginfor:
91         unless i < $I0 goto endfor
92         $S0 = array[i;0]
93         $N0 = array[i;1]
94         print $S0
95         print " "
96         $P0 = new 'FixedFloatArray'
97         $P0 = 1
98         $N1 = seqlen
99         $N0 /= $N1
100         $N0 *= 100
101         $P0[0] = $N0
102         $S0 = sprintf "%.3f\n", $P0
103         print $S0
104         inc i
105         goto beginfor
106 endfor:
107 .end
109 .sub sort
110         .param pmc a
111         .param pmc b
112         $I0 = a[1]
113         $I1 = b[1]
114         $I2 = cmp $I1, $I0
115         .return($I2)
116 .end
118 .sub find_seq
119         .param string seq
120         .param string s
121         .local int i
122         i = 0
123         $I0 = 0
124 beginwhile:
125         $I2 = $I0 + 1
126         $I0 = index seq, s, $I2
127         if $I0 == -1 goto endwhile
128         inc i
129         goto beginwhile
130 endwhile:
131         print i
132         print "\t"
133         print s
134         print "\n"
135 .end
138 # Local Variables:
139 #   mode: pir
140 #   fill-column: 100
141 # End:
142 # vim: expandtab shiftwidth=4 ft=pir: