line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package DNA; |
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
879
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
40
|
|
4
|
1
|
|
|
1
|
|
7
|
use vars qw($VERSION); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
3003
|
|
5
|
|
|
|
|
|
|
$VERSION = '0.03'; |
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
my $i = 0; |
8
|
|
|
|
|
|
|
my @Acids = qw(A T C G); |
9
|
|
|
|
|
|
|
my %Acids = map { $_ => $i++ } @Acids; |
10
|
|
|
|
|
|
|
open HOST, "$0" or die "Genetic resequencing failed: $!"; |
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
my($code, $pod, $shebang) = ('', '', ''); |
13
|
|
|
|
|
|
|
my($inpod) = 0; |
14
|
|
|
|
|
|
|
my $line; |
15
|
|
|
|
|
|
|
while(defined($line = )) { |
16
|
|
|
|
|
|
|
if( $. == 1 and $line =~ /^\#!/ ) { |
17
|
|
|
|
|
|
|
$shebang = $line; |
18
|
|
|
|
|
|
|
} |
19
|
|
|
|
|
|
|
elsif( $line =~ /^=cut/ ) { |
20
|
|
|
|
|
|
|
$inpod = 0; |
21
|
|
|
|
|
|
|
} |
22
|
|
|
|
|
|
|
elsif( $line =~ /^=\w+/ ) { |
23
|
|
|
|
|
|
|
$pod .= $line; |
24
|
|
|
|
|
|
|
$inpod = 1; |
25
|
|
|
|
|
|
|
} |
26
|
|
|
|
|
|
|
else { |
27
|
|
|
|
|
|
|
if( $inpod ) { |
28
|
|
|
|
|
|
|
$pod .= $line; |
29
|
|
|
|
|
|
|
} else { |
30
|
|
|
|
|
|
|
$code .= $line; |
31
|
|
|
|
|
|
|
} |
32
|
|
|
|
|
|
|
} |
33
|
|
|
|
|
|
|
} |
34
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
close HOST; |
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
sub mutate { |
38
|
847
|
|
|
847
|
0
|
3052
|
my $na = shift; |
39
|
847
|
100
|
|
|
|
4422
|
$na = join '', map $Acids[rand @Acids], 1..4 unless int rand 1000; |
40
|
847
|
|
|
|
|
3313
|
return $na; |
41
|
|
|
|
|
|
|
} |
42
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
sub ascii_to_na { |
44
|
389
|
|
|
389
|
0
|
748
|
my $ascii = ord shift; |
45
|
389
|
|
|
|
|
520
|
my $na = ''; |
46
|
|
|
|
|
|
|
|
47
|
389
|
|
|
|
|
499
|
for (1..4) { |
48
|
1556
|
|
|
|
|
2628
|
$na .= $Acids[$ascii % 4]; |
49
|
1556
|
|
|
|
|
2499
|
$ascii = $ascii >> 2; |
50
|
|
|
|
|
|
|
} |
51
|
|
|
|
|
|
|
|
52
|
389
|
|
|
|
|
1272
|
$na = mutate($na); |
53
|
|
|
|
|
|
|
|
54
|
389
|
|
|
|
|
3568
|
return $na; |
55
|
|
|
|
|
|
|
} |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
sub na_to_ascii { |
58
|
69
|
|
|
69
|
0
|
111
|
my $na = mutate(shift); |
59
|
69
|
|
|
|
|
83
|
my $ascii = 0; |
60
|
69
|
|
|
|
|
914
|
for my $chr (0..3) { |
61
|
276
|
|
|
|
|
509
|
$ascii += $Acids{ substr($na, $chr, 1) } * (4 ** $chr); |
62
|
|
|
|
|
|
|
} |
63
|
|
|
|
|
|
|
|
64
|
69
|
|
|
|
|
413
|
return chr $ascii; |
65
|
|
|
|
|
|
|
} |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
my $Acids = join '', @Acids; |
68
|
|
|
|
|
|
|
$Acids = "[$Acids]"; |
69
|
|
|
|
|
|
|
sub devolve { |
70
|
1
|
|
|
1
|
0
|
10
|
my $code = shift; |
71
|
1
|
|
|
|
|
3
|
my $idx = 0; |
72
|
1
|
|
|
|
|
2
|
my $perl = ''; |
73
|
1
|
|
|
|
|
29
|
while( $code =~ /($Acids{4})/g ) { |
74
|
389
|
|
|
|
|
500
|
my $segment = $idx++ % 96; |
75
|
389
|
100
|
|
|
|
4911
|
next if $segment >= 16; |
76
|
69
|
|
|
|
|
110
|
$perl .= na_to_ascii($1); |
77
|
|
|
|
|
|
|
} |
78
|
|
|
|
|
|
|
|
79
|
1
|
|
|
|
|
5
|
return $perl; |
80
|
|
|
|
|
|
|
} |
81
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
sub evolutionary_junk { |
83
|
20
|
|
|
20
|
0
|
38
|
my $junk = join ' ', map { ascii_to_na(int rand 256) } 0..(75/5); |
|
320
|
|
|
|
|
707
|
|
84
|
|
|
|
|
|
|
} |
85
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
sub evolve { |
87
|
1
|
|
|
1
|
0
|
3
|
my $code = shift; |
88
|
1
|
|
|
|
|
2
|
my $idx = 0; |
89
|
1
|
|
|
|
|
4
|
my $chromosome = ''; |
90
|
1
|
|
|
|
|
5
|
for my $idx (0..length($code) - 1) { |
91
|
69
|
|
|
|
|
95
|
my $chr = substr($code, $idx, 1); |
92
|
69
|
|
|
|
|
92
|
$chromosome .= ascii_to_na($chr). " "; |
93
|
69
|
100
|
|
|
|
234
|
unless( ($idx + 1) % (80 / 5) ) { |
94
|
4
|
|
|
|
|
6
|
chop $chromosome; |
95
|
4
|
|
|
|
|
5
|
$chromosome .= "\n"; |
96
|
4
|
|
|
|
|
8
|
for(1..5) { |
97
|
20
|
|
|
|
|
34
|
$chromosome .= evolutionary_junk()."\n"; |
98
|
|
|
|
|
|
|
} |
99
|
|
|
|
|
|
|
} |
100
|
|
|
|
|
|
|
} |
101
|
|
|
|
|
|
|
|
102
|
1
|
50
|
|
|
|
154
|
open HOST, ">$0" or |
103
|
|
|
|
|
|
|
die "Cannot complete genetic encoding! ". |
104
|
|
|
|
|
|
|
"Alert the Human Genome Project!\n"; |
105
|
|
|
|
|
|
|
|
106
|
1
|
50
|
|
|
|
7
|
print HOST "$shebang\n" if length $shebang; |
107
|
1
|
|
|
|
|
20
|
print HOST "use DNA;\n\n"; |
108
|
1
|
|
|
|
|
3
|
print HOST $chromosome, "\n\n"; |
109
|
1
|
|
|
|
|
4
|
print HOST $pod; |
110
|
1
|
|
|
|
|
66
|
close HOST; |
111
|
|
|
|
|
|
|
} |
112
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
if( $code =~ s/^use DNA;\n\n(?=[ATCG]{4})//sm ) { |
114
|
|
|
|
|
|
|
$code =~ s/($Acids{4})/mutate($1)/ge; |
115
|
|
|
|
|
|
|
my $perl = devolve($code); |
116
|
|
|
|
|
|
|
evolve($perl); |
117
|
|
|
|
|
|
|
eval $perl; |
118
|
|
|
|
|
|
|
} |
119
|
|
|
|
|
|
|
elsif( $code =~ s/(use|require)\s+DNA\s*;\n//sm ) { |
120
|
|
|
|
|
|
|
evolve($code); |
121
|
|
|
|
|
|
|
eval $code; |
122
|
|
|
|
|
|
|
} |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
exit; |
125
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
|
127
|
|
|
|
|
|
|
=head1 NAME |
128
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
DNA - Encodes your Perl program into an Nucleic Acid sequence |
130
|
|
|
|
|
|
|
|
131
|
|
|
|
|
|
|
=head1 SYNOPSIS |
132
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
use DNA; |
134
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
CCAA CCAA AAGT CAGT TCCT CGCT ATGT AACA CACA TCTT GGCT TTGT AACA GTGT TCCT AGCT |
136
|
|
|
|
|
|
|
CAGA TAGA ACGA TAGA TAGA CAGA TAGA CAGA CAGA CAGA TAGA CAGA CAGA CAGA TAGA ATGA |
137
|
|
|
|
|
|
|
TAGA TAGA GTGA CAGA TAGA CTGA CAGA TAGA CAGA CAGA CAGA TAGA TTGA CAGA TAGA CTGA |
138
|
|
|
|
|
|
|
TAGA CAGA CTGA TAGA TCGA CTGA ATGA TAGA TAGA TAGA CAGA TAGA ACGA TAGA ACGA TAGA |
139
|
|
|
|
|
|
|
TAGA TAGA TAGA TAGA TAGA TAGA CTGA CAGA CAGA TTGA TAGA CAGA ATGA CAGA TAGA TAGA |
140
|
|
|
|
|
|
|
GAGA TAGA GTGA CAGA CAGA GTGA TAGA TAGA TTGA TAGA CAGA TAGA CAGA TCGA TTGA CAGA |
141
|
|
|
|
|
|
|
AGCT AACA TACT AGCT AGCT AACA TTGT GAGT TTCT AACA GTTT TCCT CGCT ATCT GGCT GTGT |
142
|
|
|
|
|
|
|
CAGA CAGA TAGA TAGA GAGA TAGA TAGA GAGA TAGA CAGA TAGA GTGA GTGA TAGA GTGA GAGA |
143
|
|
|
|
|
|
|
ATGA TAGA TAGA CAGA TAGA TAGA CAGA TAGA TAGA CAGA TAGA CAGA TAGA CAGA TAGA TAGA |
144
|
|
|
|
|
|
|
TAGA CAGA CTGA GAGA CAGA TCGA GTGA TAGA ATGA TAGA TAGA CAGA ATGA TAGA TTGA TAGA |
145
|
|
|
|
|
|
|
CAGA TAGA TAGA TAGA CAGA CAGA TAGA TAGA ATGA CTGA TAGA ATGA TAGA ATGA ATGA TAGA |
146
|
|
|
|
|
|
|
TAGA TAGA TAGA TAGA CAGA TAGA CAGA TAGA TAGA CAGA TAGA ACGA ACGA TAGA CAGA TAGA |
147
|
|
|
|
|
|
|
GAGT TACA AGTT CGCT CACA GCGA CCAA CCAA |
148
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
=head1 DESCRIPTION |
151
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
So you say you're a rabid Perl programmer? You've got a Camel |
153
|
|
|
|
|
|
|
tattooed on your arm. You took your wife to TPC for your second |
154
|
|
|
|
|
|
|
honeymoon. But you're worried about your children, they might not be |
155
|
|
|
|
|
|
|
such devoted Perl addicts. How do you guarantee the continuation of |
156
|
|
|
|
|
|
|
the line? Until now, there was no solution (what, do you think they |
157
|
|
|
|
|
|
|
teach Perl in school?!) |
158
|
|
|
|
|
|
|
|
159
|
|
|
|
|
|
|
Through the magic of Gene Splicing, now you can encode your very genes |
160
|
|
|
|
|
|
|
with the essense of Perl! Simply take your best one-liner, encode it |
161
|
|
|
|
|
|
|
with this nifty DNA module and head on down to your local sperm bank |
162
|
|
|
|
|
|
|
and have them inject that sucker in. |
163
|
|
|
|
|
|
|
|
164
|
|
|
|
|
|
|
|
165
|
|
|
|
|
|
|
As the encoding of programs on bacterial DNA will soon revolutionize |
166
|
|
|
|
|
|
|
the data storage industry, I'm downloading the necessary forms from |
167
|
|
|
|
|
|
|
the US patent office as I write. Imagine, all of CPAN on an airborne |
168
|
|
|
|
|
|
|
bacteria. You can breathe Perl code! |
169
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
When you use the DNA module on your code, the first time through it |
172
|
|
|
|
|
|
|
will convert your code into a series of DNA sequences. Of course, |
173
|
|
|
|
|
|
|
most of the DNA is simply junk. We're not sure why... someone spilled |
174
|
|
|
|
|
|
|
coffee on the documentation. |
175
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
There's also a slight chance on each use that a mutation will |
177
|
|
|
|
|
|
|
occur... or maybe its a bug in perl, we're not sure. Of course, this |
178
|
|
|
|
|
|
|
means your code may suddenly fall over dead... but you made a few |
179
|
|
|
|
|
|
|
million copies, right? |
180
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
POD will, of course, be preserved. God made the mistake of not |
182
|
|
|
|
|
|
|
writing docs, and look at all the trouble we've had to go through to |
183
|
|
|
|
|
|
|
figure out his code! |
184
|
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
|
186
|
|
|
|
|
|
|
=head1 NOTES |
187
|
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
The tests are encoded in DNA! But it sometimes introduces bugs... oh |
189
|
|
|
|
|
|
|
dear. |
190
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
As Steve Lane pointed out, it would be better to group them into |
192
|
|
|
|
|
|
|
groups of three rather than four, as this makes a codon. However, |
193
|
|
|
|
|
|
|
that means I can only get 6 bits on one group, and God didn't have to |
194
|
|
|
|
|
|
|
work with high ASCII. |
195
|
|
|
|
|
|
|
|
196
|
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
=head1 BUGS |
198
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
There were only a few flipper babies. |
200
|
|
|
|
|
|
|
|
201
|
|
|
|
|
|
|
|
202
|
|
|
|
|
|
|
=head1 SEE ALSO |
203
|
|
|
|
|
|
|
|
204
|
|
|
|
|
|
|
L, L, L, L, a good psychiatrist. |
205
|
|
|
|
|
|
|
|
206
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
=head1 AUTHOR |
208
|
|
|
|
|
|
|
|
209
|
|
|
|
|
|
|
Michael G Schwern |
210
|
|
|
|
|
|
|
|
211
|
|
|
|
|
|
|
=cut |
212
|
|
|
|
|
|
|
|
213
|
|
|
|
|
|
|
1; |