我是perl的新手,如何让它变得更好更快?(SPOJ任务(
until($i>99){
$a=<>;
if($a%5==0){
if($a%3==0){
print"SPOKOKOKOn";
}else{
print"SPOKOn";
}
}elsif($a%3==0){
print"KOKOn";
}else{
print"$a";
}
$i++;
}
可以被5整除的东西可以被15整除,所以你的逻辑更直接…
- 可除以15
- 可除以5
- 可除以3
- 不能被5或3整除
我也会利用say
。
我也会用for
代替尴尬的until
,而不必为$I而烦恼。
避免使用$a和$b,因为它们是sort
使用的特殊变量。
打开"严格"one_answers"警告"。
去掉$a的换行符。从技术上讲,如果你要把它用作一个数字,这是不必要的,但如果你不打印它,它会有一个额外的换行符。
一个非数字%
,任何东西都是0。除非我们验证输入,否则如果您不输入任何内容或";香蕉";你会得到SPOKOKOKO
。我们可以用Scalar::Util::looks_like_number检查输入是否看起来像Perl认为的数字。如果它不是一个数字,则抛出一个异常;函数的工作不是弄清楚如何处理非数字。Perl实际上没有异常,但我们可以使用die
和eval
来接近它。
并将逻辑放入子程序中。这将输入和输出的细节从逻辑中分离出来。现在可以对逻辑进行命名、记录、测试和重用。这也避免了冗余的CCD_ 9。
use strict;
use warnings;
use Scalar::Util qw(looks_like_number);
use v5.10;
sub whatever_this_is_doing {
my $num = shift;
# Validate input early to keep the rest of the logic simple.
if( !looks_like_number($num) ) {
die "'$num' is not a number";
}
if($num % 15 == 0) {
"SPOKOKOKO";
}
elsif($num % 5 == 0) {
"SPOKO";
}
elsif($num % 3 == 0) {
"KOKO";
}
else {
$num; # Note there's no need to quote a single variable.
}
}
for(1..99) {
my $num = <>;
chomp($num);
eval {
say whatever_this_is_doing($num);
} or say "'$num' is not a number.";
}
我相信有一些非常聪明的数学方法可以减少对%
的调用次数,但%
不太可能成为瓶颈,尤其是在Perl中,所以我不做它。
100行?这将是如此之快,以至于我不明白你为什么要求优化。然而
最大的两个成本是读取100行和写入100行。
然后是if和模检验——每一个都是无关紧要的。
需要考虑的一件事是把它翻过来。我建议1个循环内表达混乱的print
print ( ($a%5 == 0) ?
( ($a%3 == 0) ? "SPOKOKOKOn" : "SPOKOn" ) :
( ($a%3 == 0) ? "KOKOn" : $a );
更少的线路(3对10(;可能更容易阅读(尤其是在列对齐的情况下(也许更快。
更容易消化。(我没有注意到%3
是一样的。(哦,现在很明显,n
在最后一个案例中缺失了;也许是个虫子?
也许可以删除一些括号,但我不相信Perl会对?:
的嵌套做正确的事情。