在Perl上用更少的代码行实现此算法
我想用Perl实现这个算法。 让我们接受这一点:在Perl上用更少的代码行实现此算法,perl,Perl,我想用Perl实现这个算法。 让我们接受这一点: DNA1=GACTAGGC DNA2=AGCTAGA DNA1的第一个元素是G,我们将发现DNA2处是否有G,并用一个点指向它。我们将其一直延续到最后,这样图像显示的每个元素的交点都与一个点相同 下一步是:连接点。要指向点,第一个点应该位于小正方形的左上角,另一个点应该位于右下角(我的意思是线应该有135度),如果严格度为2,这意味着拒绝从2点到小于2点出现的线(这意味着如果严格度为3,则图像上只有一条线) 最后一步是:字数。如果wordc
- DNA1=GACTAGGC
- DNA2=AGCTAGA
$infile1 = "DNA1.txt";
$infile2 = "DNA2.txt";
$outfile = "plot.txt";
$wordsize=0;
$stringency=0;
open inf, $infile1 or die "STOP! File $infile1 not found.\n";
$sequence1=<inf>;
chomp $sequence1;
@seq1=split //,$sequence1;
close inf;
open inf, $infile2 or die "STOP! File $infile2 not found.\n";
$sequence2=<inf>;
chomp $sequence2;
@seq2=split //,$sequence2;
close inf;
$Lseq1=$#seq1+1;
$Lseq2=$#seq2+1;
open ouf, ">$outfile";
for ($i=0;$i<$Lseq1;$i++){
print ouf "\n";
for ($j=0;$j<$Lseq2;$j++){
$match=0;
for ($w=0;$w<=$wordsize;$w++){
if($seq1[$i+$w] eq $seq2[$j+$w]){
$match++;
}
}
if($match > $stringency){
print ouf "1";
}
else{
print ouf "0";
}
}
}
编辑3:这里有一个更好的算法建议:
任何根据更好的算法改进代码的想法都是受欢迎的。首先,最内层的for循环完全没有必要。摆脱它将加快你的代码 其次,您的代码不适用于0以外的$stringency 修正: 你会得到这样的结果
01000110
10001002
00100000
00020000
10003001
02000410
01000150
00200000
顺便说一句,我们试图实现的目标与找到目标非常相似
更新从文件中获取$s1
和$s2
,一次一行
open(my $fh1, '<', ...) or die(...);
open(my $fh2, '<', ...) or die(...);
for (;;) {
my $s1 = <$fh1>;
my $s2 = <$fh2>;
die("Files have different length\n")
if defined($s1) && !defined($s2)
|| !defined($s1) && defined($s2);
last if !defined(($s1);
chomp($s1);
chomp($s2);
... code to generate graph ...
}
open(my$fh1),首先,最内层的for循环完全没有必要。去掉它会加快代码的速度
其次,您的代码不适用于0以外的$stringency
修正:
你会得到这样的结果
01000110
10001002
00100000
00020000
10003001
02000410
01000150
00200000
顺便说一句,我们试图实现的目标与找到目标非常相似
更新从文件中获取$s1
和$s2
,一次一行
open(my $fh1, '<', ...) or die(...);
open(my $fh2, '<', ...) or die(...);
for (;;) {
my $s1 = <$fh1>;
my $s2 = <$fh2>;
die("Files have different length\n")
if defined($s1) && !defined($s2)
|| !defined($s1) && defined($s2);
last if !defined(($s1);
chomp($s1);
chomp($s2);
... code to generate graph ...
}
打开(我的$fh1,'为什么代码要少一些,这已经很短了。事实上,如果我是你,我会添加一些代码,至少如果你把空格算为代码的话。如果可以的话,我想对它进行优化,例如在文件操作中,或者如果有,我也不确定代码是否有效。另外,这是我关于Perl问题的第三个主题所有这些评论都像是建议很短很好,但最后我只得到了一行答案。这就是为什么我想越来越多地优化它,因为它是Perl,我想知道是否有可能做更多的事情。这里有一些你应该添加的代码:使用严格;使用警告;
更短的代码esn不能运行得更快。这只是作者炫耀自己编写模糊的、难以维护的代码的能力的借口。对于sig文件和Perl golf来说,这种事情可能很有趣,但它在用于实际工作的脚本中没有一席之地。为什么代码要少一些,这已经很短了。事实上,如果我是你,我会添加一些代码,至少如果你同意的话t空格作为代码。我想优化它,如果我可以的话,比如在文件操作中,或者如果有,我也不确定代码是否有效。还有一个,这是我关于Perl问题的第三个主题,所有这些问题的注释都像是建议,非常简短,但是最后我得到了所有的答案一行。这就是为什么我想对它进行越来越多的优化,因为它是Perl,我想知道是否有可能做更多的事情。这里有一些你应该添加的代码:使用strict;使用warnings;
更短的代码不会运行得更快。这只是作者炫耀自己编写模糊、难以维护的代码的能力的借口n代码。对于sig文件和Perl golf来说,这种事情可能很有趣,但它在用于实际工作的脚本中没有位置。你能从文件中读取它们并在一行读取时拆分它们吗?@kamaci,当然你可以一次读取一行文件。我没有在我的脚本中包括,因为就问题而言,这是噪音。如果你你需要从文件中读取的帮助,我建议你创建另一个问题。我更改了从文件中读取的部分,但你的代码工作得很好,谢谢。你能从文件中读取它们并在一行读取时拆分它们吗?@kamaci,当然你可以一行一行地读取一个文件。我的脚本中没有包含这一问题,因为就我的问题而言,这是噪音如果你需要从文件中读取的帮助,我建议你创建另一个问题。我更改了从文件中读取的部分,但你的代码运行良好,谢谢。
print $L[$j];
01000110
10001002
00100000
00020000
10003001
02000410
01000150
00200000
open(my $fh1, '<', ...) or die(...);
open(my $fh2, '<', ...) or die(...);
for (;;) {
my $s1 = <$fh1>;
my $s2 = <$fh2>;
die("Files have different length\n")
if defined($s1) && !defined($s2)
|| !defined($s1) && defined($s2);
last if !defined(($s1);
chomp($s1);
chomp($s2);
... code to generate graph ...
}