我一直试图通过观察一些高尔夫问题来锻炼我的Perl 6排骨。其中一个涉及提取整数的位。我无法用简洁的方式写出这样的表达方式。
我的“最佳”尝试到目前为止,使用2000
作为数字。我不在乎最重要或最不重要的位是第一位的。
数字表达式:
map { $_ % 2 }, (2000, * div 2 ... * == 0)
递归匿名子程序:
{ $_ ?? ($_ % 2, |&?BLOCK($_ div 2)) !! () }(2000)
转换为字符串:
2000.fmt('%b') ~~ m:g/./
其中,第一个对我来说最干净,但能够在一个步骤中生成比特,而不是映射到中间列表上真的很不错。
使用单个表达式,是否有更简洁,更短和/或更惯用的方法来获取位? (也就是说,无需编写命名函数。)
答案 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)