2016-12-06 6 views
8

Ich habe versucht, meine Perl 6 Chops auszuüben, indem ich auf einige Golfprobleme schaue. Eine davon beinhaltete das Extrahieren der Bits einer ganzen Zahl. Ich bin nicht in der Lage gewesen, einen prägnanten Weg zu finden, einen solchen Ausdruck zu schreiben.Perl6-ish Ausdruck für die Bits einer ganzen Zahl

Meine "besten" Versuche folgen bisher, mit 2000 als die Nummer. Es ist mir egal, ob das meiste oder das am wenigsten signifikante Bit zuerst kommt.

Ein numerischer Ausdruck:

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

Eine rekursive anonyme Unterprogramm:

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

Konvertierung in einen String:

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

Davon fühlt sich der erste mir sauberste, aber es wäre wirklich schön, die Bits in einem einzigen Schritt erzeugen zu können, anstatt sie über ein Inter abzubilden vermitteln Liste.

Gibt es einen saubereren, kürzeren und/oder idiomatischen Weg, um die Bits zu erhalten, mit einem einzigen Ausdruck? (Das heißt, ohne eine benannte Funktion zu schreiben.)

Antwort

8

Der einfachste Weg wäre:

2000.base(2).comb 

Die .base Methode eine String-Darstellung zurück, und .comb spaltet es in Zeichen - ähnlich wie Ihre dritte Methode.

4

eine zwingende Lösung, gelinde höchstwertigen Bits:

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

Das gleiche neu geschrieben hyperoperators auf einer Sequenz mit:

say (2000, * +> 1 ...^ !*) >>+&>> 1 
4

Eine Alternative, die mehr nützlich ist, wenn Sie ändern müssen Die Basis für alles über 36 ist, polymod mit einer unendlichen Liste dieser Basis zu verwenden.

Die meiste Zeit müssen Sie jedoch die Reihenfolge umkehren.

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) 
Verwandte Themen