如何计算Perl 6中整数的交替和?

时间:2017-12-08 19:20:38

标签: perl6

  

如果数字的交替总和为11,则数字可被11整除   可被11整除。

所以,例如如果数字是1595+1 -5 +9 -5 == 0,那么1595可以被11整除。如何实现这样的总和?这是我的解决方案,但它过于复杂,只有在数字位数均匀的情况下才有效。

my $number = 1595;
say [+] $number.comb.map({$^a - $^b});

最好的方法是什么?

4 个答案:

答案 0 :(得分:6)

say [+] 1595.comb Z* (1, -1, 1 ... *)

要将其分解:.comb返回一个字符列表,Z *将该列表与RHS上的序列按元素相乘。

这个序列是一个几何序列,...系列算子可以从这三个元素中推导出来。由于zip运算符Z以最短的顺序停止,因此我们不必注意终止RHS上的序列。

另一种写同一件事的方法是:

say [+] 1595.comb Z* (1, -* ... *)

其中-*是前一个值的显式否定,应用于初始元素以生成下一个元素。

您也可以将其写为

say [+] 1595.comb Z* (1, &prefix:<-> ... *)

答案 1 :(得分:5)

Moritz使用的十字架很有趣(而且非常讨人喜欢),但你也可以拿一个列表的块。这与你最初尝试的很接近。我想你要走向rotor

my $number = 1595;
say  [+] $number.comb.rotor(2, :partial).map: { $^a.[0] - ($^a.[1] // 0) }

请注意,您的块有一个参数。这是列表。它有点难看,因为奇数位的情况会使$^a.[1] Nil发出警告。

现在我已经玩了这个,我用签名来处理它,所以我可以给$b一个默认值。这要好得多:

my $number = 1595;
say  [+] $number
    .comb
    .rotor(2, :partial)
    .map: -> ( $a, $b = 0 ) { $a - $b }

但是你甚至不需要rotor,因为map会根据需要获取尽可能多的位置参数(h / t到评论中的timotimo)。这意味着你真的很亲密,只是错过了签名:

my $number = 1595;
say  [+] $number
    .comb
    .map: -> ( $a, $b = 0 ) { $a - $b }

您在评论中提供的解决方案并不适用于奇数个数字的情况:

say [+] $number.comb.rotor(2, :partial).map({[-] $_});

而且,我知道这个问题并不是关于除数的问题,但我很高兴Perl 6有一个&#34;可以被&#34;&#34;&#34;&#34;运算符,%%

$ perl6
> 121 %% 11
True
> 122 %% 11
False
> 1595 %% 11
True
> 1596 %% 11
False

答案 2 :(得分:3)

say [+] 1595.comb >>*>> (1,-1)

与Z *版本类似,但在右侧使用超元运算符循环效果(如果左侧少于2位,则可以正常使用)。

答案 3 :(得分:2)

这是我的解决方案。

say [+] 15956.comb.kv.map( (-1) ** * * * ); # 6

更明确的版本。

say [+] 15956.comb.kv.map({ $^b * (-1) ** $^a }); # 6

UPD :又一种解决方案。

say - [+] 15956.comb(2)>>.comb.map({[R-] $_}); # 6