2016-12-06 2 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) 
Смежные вопросы