整数位的 Perl6-ish 表达式

Perl6-ish expression for the bits of an integer

我一直在尝试通过查看一些打高尔夫球的问题来锻炼我的 Perl 6 技能。其中之一涉及提取整数的位。我还没想出一个简洁的方法来写这样的表达式。

我的 "best" 尝试到目前为止,使用 2000 作为数字。我不在乎最高有效位还是最低有效位在前。

一个数值表达式:

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

递归匿名子程序:

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

正在转换为字符串:

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

其中,第一个对我来说感觉最干净,但如果能够一步生成位而不是映射到中间列表,那将是非常好的。

有没有更简洁、更短、and/or 更惯用的方式来获取位,使用单个表达式? (即,不编写命名函数。)

最简单的方法是:

2000.base(2).comb

.base 方法 returns 字符串表示,.comb 将其拆分为字符 - 类似于您的第三种方法。

命令式解决方案,从最低位到最高位:

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

在一个序列上使用超级运算符重写了同样的东西:

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

当您需要将基数更改为 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)