整数位的 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)
我一直在尝试通过查看一些打高尔夫球的问题来锻炼我的 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)