Perl6-ish表达式为整数位

时间:2016-12-06 18:48:32

标签: perl6

我一直试图通过观察一些高尔夫问题来锻炼我的Perl 6排骨。其中一个涉及提取整数的位。我无法用简洁的方式写出这样的表达方式。

我的“最佳”尝试到目前为止,使用2000作为数字。我不在乎最重要或最不重要的位是第一位的。

数字表达式:

map { $_ % 2 }, (2000, * div 2 ... * == 0)

递归匿名子程序:

{ $_ ?? ($_ % 2, |&?BLOCK($_ div 2)) !! () }(2000)

转换为字符串:

2000.fmt('%b') ~~ m:g/./

其中,第一个对我来说最干净,但能够在一个步骤中生成比特,而不是映射到中间列表上真的很不错。

使用单个表达式,是否有更简洁,更短和/或更惯用的方法来获取位? (也就是说,无需编写命名函数。)

3 个答案:

答案 0 :(得分:8)

最简单的方法是:

2000.base(2).comb

.base方法返回字符串表示形式,.comb将其拆分为字符 - 类似于第三种方法。

答案 1 :(得分:4)

一个必要的解决方案,至少是最重要的一点:

my $i = 2000; say (loop (; $i; $i +>= 1) { $i +& 1 })

在序列上使用hyperoperator重写同样的事情:

say (2000, * +> 1 ...^ !*) >>+&>> 1

答案 2 :(得分:4)

当您需要将基数更改为高于36的任何值时,更有用的替代方法是使用polymod和该基数的无限列表。

大部分时间你都不得不颠倒顺序。

say 2000.polymod(2 xx *);
# (0 0 0 0 1 0 1 1 1 1 1)
say 2000.polymod(2 xx *).reverse;
say [R,] 2000.polymod(2 xx*);
# (1 1 1 1 1 0 1 0 0 0 0)