web-dev-qa-db-ja.com

rakuローターを最後から行うより良い方法は何ですか?

リストの最後のデータがより重要で、最初の順序を維持しながら:partialリストをリストの最初に残したい場合は、次のようにします。

> my @a = (0,1,2,3,4,5,6,7,8,9);
[0 1 2 3 4 5 6 7 8 9]
> say @a.rotor(4, :partial)
((0 1 2 3) (4 5 6 7) (8 9)) # not what I want; important data at end gets cut off;
> say @a.reverse.rotor(4, :partial).reverse.map({$_.reverse});
((0 1) (2 3 4 5) (6 7 8 9)) # this is what I want

3つの「逆」操作を回避する方法はありますか? :fromEnd副詞を追加することは可能ですか?

6
lisprogtor

:partialリストに残っている要素の数を計算できます。

@a.elems % 4

次に、それを必要なサイズの繰り返しシーケンスと組み合わせます。

4 xx *

あなたがそれらを組み合わせようとした場合、それは単に機能しません

@a.elems % 4, 4 xx *

上記は2つの要素のリストであるためです。最初はモジュラス演算の結果であり、2番目は無限シーケンスです。

flatを使用して、それらを単一のシーケンスにすることができます。

flat @a.elems % 4, 4 xx *

これが結果のコードです。

@a.rotor( flat @a.elems % 4, 4 xx * )
1
Brad Gilbert