2016-12-06 1 views
8

私はいくつかのゴルフ問題を見て自分のPerl 6チョップを行おうとしています。そのうちの1つは整数のビットを抽出することでした。私はそのような表現を書くための簡潔な方法を考え出すことができませんでした。整数のビットに対するPerl6-ish式

数値として2000を使用してこれまでのところ私の「ベスト」試行が続きます。私は、最上位ビットまたは最下位ビットが最初に来るかどうかは気にしません。

数値表現:

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

再帰的な匿名のサブルーチン:

文字列に変換する
{ $_ ?? ($_ % 2, |&?BLOCK($_ div 2)) !!() }(2000) 

:これらの

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

、最初は私にきれいな感じが、それは、1つのステップでビットを生成することができればうれしいでしょう。リストを仲介する。

単一の式を使用して、ビットを取得するクリーナー、より短い、および/またはより慣用な方法がありますか? (。それはという名前の関数を記述することなく、ある)

答えて

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) 
関連する問題