如果数字的交替总和为11,则数字可被11整除 可被11整除。
所以,例如如果数字是1595
,+1 -5 +9 -5 == 0
,那么1595可以被11整除。如何实现这样的总和?这是我的解决方案,但它过于复杂,只有在数字位数均匀的情况下才有效。
my $number = 1595;
say [+] $number.comb.map({$^a - $^b});
最好的方法是什么?
答案 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