我试图解决一个代码高尔夫练习,包括采取输入的测试用例的数量,然后在每行每个测试用例的整数.
在我寻求最短的解决方案的过程中,我遇到了这个解决方案:
#!perl -lp
use bigint;$_=???<>+1:bnok{2*$_}$_
Run Code Online (Sandbox Code Playgroud)
我是非常新的perl,因此我没有得到这段代码实际上是如何工作的.如果有人帮我解决这个问题,我将不胜感激.
有一些工具可以找出Perl高尔夫球.一个是perlsecret,它记录了许多Perl高尔夫球手使用的"秘密操作员"和技巧.
对于这个特殊的代码,它也是重要的是要了解什么-p呢.它将代码包装在一堆其他代码中,然后可以将其用于高尔夫目的.
最后,解开 Perl高尔夫球的终极工具是B :: Deparse.这转换了Perl如何将代码理解为具有缩进等的人类可读Perl.-p选项使B :: Deparse添加括号,即使它们不是必需的,这有助于阐明优先级.-d选项可以更准确地表示对象.什么对象?观察.
$ perl -MO=Deparse,-p,-d
#!perl -lp
use bigint;$_=???<>+1:bnok{2*$_}$_
Use of ?PATTERN? without explicit operator is deprecated at - line 2.
BEGIN { $/ = "\n"; $\ = "\n"; }
use bigint;
LINE: while (defined(($_ = <ARGV>))) {
chomp($_);
BEGIN {
$^H{'bigint'} = '1';
$^H{'binary'} = 'CODE(0x7fc88ba3d580)';
$^H{'float'} = 'CODE(0x7fc88ba3d478)';
$^H{'integer'} = 'CODE(0x7fc88b298428)';
}
($_ = (?? ? (<ARGV> + bless( {"sign" => "+","value" => [1]}, 'Math::BigInt' )) : (bnok {
(bless( {"sign" => "+","value" => [2]}, 'Math::BigInt' ) * $_)
} $_)));
}
continue {
(print($_) or die("-p destination: $!\n"));
}
- syntax OK
Run Code Online (Sandbox Code Playgroud)
这揭示了一些更深奥的东西......
?PATTERN?运营商加?:三元运营商.具体来说,??是三元的条件.??工作就像,//但它只会匹配一次,直到reset被调用.因为在此程序中永远不会调用reset,所以它只对该程序匹配一次. //将匹配任何东西.use bigint 将所有整数转换为Math :: BigInt对象.bnok是Math :: BigInt的二项式系数方法.bnok被用作对整数的间接方法调用(实际上是Math :: BigInt对象).间接方法调用的形式是method $object @args这样bnok{2*$_}$_实际上(2*$_)->bnok($_)它是中央二项式系数.通过一些缩进和垂直空白,可以更容易地理解程序的内容.一个具有良好匹配的编辑器就是您需要完成的工作.
(
$_ =
(?? ? (<ARGV> + bless( {"sign" => "+","value" => [1]}, 'Math::BigInt' ))
: (bnok {(bless( {"sign" => "+","value" => [2]}, 'Math::BigInt' ) * $_) } $_)
)
);
Run Code Online (Sandbox Code Playgroud)
??整个程序只匹配一次,所以它用于跳过第一行,即测试次数.??将为false,这将触发bnok计算.有一个细节我还没有解决.为什么<>+1不<>呢?它似乎压制了一个空白行,但我不知道为什么.
| 归档时间: |
|
| 查看次数: |
136 次 |
| 最近记录: |