加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 了解这个perl解决方案

发布时间:2020-12-14 05:37:27 所属栏目:百科 来源:网络整理
导读:我正在尝试解决代码高尔夫练习,其中包括输入测试用例的数量,然后在每个测试用例的每一行中输入一个整数. 在我寻求最短的解决方案的过程中,我遇到了this解决方案: #!perl -lpuse bigint;$_=???+1:bnok{2*$_}$_ 我是非常新的perl,因此我没有得到这段代码实际
我正在尝试解决代码高尔夫练习,其中包括输入测试用例的数量,然后在每个测试用例的每一行中输入一个整数.

在我寻求最短的解决方案的过程中,我遇到了this解决方案:

#!perl -lp
use bigint;$_=???<>+1:bnok{2*$_}$_

我是非常新的perl,因此我没有得到这段代码实际上是如何工作的.如果有人帮我解决这个问题,我将不胜感激.

PS:Asked and closed at codegolf.stackexhange.

解决方法

有一些工具可以找出Perl高尔夫球.一个是 perlsecret,记录了许多Perl高尔夫球手使用的“秘密运算符”和技巧.

对于这个特定的代码,理解什么是-p does也很重要.它将代码包装在一堆其他代码中,然后可以将其用于高尔夫目的.

最后,打开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

这揭示了一些更深奥的东西……

> ???是?PATTERN?运算符加上?:三元运算符.具体来说,??是三元的条件.
> ??就像//一样工作但它只会匹配一次,直到调用reset.因为在此程序中永远不会调用reset,所以它只对该程序匹配一次. //将匹配任何东西.
>使用bigint将所有整数转换为Math :: BigInt对象.
> bnok是从Math::BigInt开始的二项式系数法.
> bnok被用作对整数的间接方法调用(实际上是Math :: BigInt对象).间接方法调用的形式是方法$object @args所以bnok {2 * $_} $_实际上是(2 * $_) – > bnok($_),这是central binomial coefficient.

通过一些缩进和垂直空白,可以更容易地理解程序的内容.一个具有良好匹配的编辑器就是您需要完成的工作.

(
    $_ =
      (?? ? (<ARGV> + bless( {"sign" => "+",'Math::BigInt' ))
          : (bnok {(bless( {"sign" => "+",'Math::BigInt' ) * $_) } $_)
      )
);

>因为??对于整个程序只会匹配一次,它用于跳过第一行,即测试次数.
>第一行之后,??将为false将触发bnok计算.

有一个细节我还没有解决.为什么<> 1而不是<>?它似乎压制了一个空白行,但我不知道为什么.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读