2016-12-06 21 views
8

我一直试图通过查看一些高尔夫问题来锻炼我的Perl 6排。其中之一涉及提取一个整数的位。我一直没有想出一个简洁的方式来写这样的表达。Perl6-ish表达式的整数位

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

数值表达式:

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

递归匿名子:

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

转换为字符串:

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

其中,第一感觉干净给我,但能够在一个步骤中生成比特,而不是通过内部映射来真的很棒调解列表。

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

回答

8

最简单的方法是:

2000.base(2).comb 

.base方法返回一个字符串表示,和.comb分裂成字符 - 类似于您的第三种方法。

4

命令式的解决方案,至少最显著位:

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

使用上的一系列hyperoperators重写同样的事情:

say (2000, * +> 1 ...^ !*) >>+&>> 1 
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)