2017-12-21 17 views
1

私は、重複のない座標のランダムなリストを印刷する方法を見つけようとしていましたが、両方の次元の最小値と最大値を指定しました。Perl6:座標のペアを選択する

「X」と「>>」を理解するのは苦労していますが、正確には意味します。誰でもこれを説明できる?

my $a=3; 
my $b=3; 

for (^$a X ^$b)>>.Array.pick(*) -> [$a,$b] 
{ 
    print "($a, $b)"; 
} 

出力(例):

(1,1)(0,1)(0,2)(1,2)(0,0)(2,2)(2,1)(1,0)(2,0) 
+0

''配列 'は完全には不要です。 –

答えて

1

Documentation on X
Documentation on >>
この場合は>>.Arrayは必要ありませんが、Bradは既に指摘しています。

my $a = 3; 
my $b = 3; 
my $number = 5; # must be less than $a * $b 
for (($a.rand.Int,$b.rand.Int) xx *).unique(:as(*.Str)).head($number) { 
    .gist.print 
} 

($a.rand.Int,$b.rand.Int) xx *が無限Seqを作成します:あなたは、これは(順列の数に対する座標の数が少ないため)を行う方が良いことを見つけるかもしれない、あなたは可能性の数は、順列を座標超えることはありませんと仮定すると

ランダムな座標ペアの.unique(:as(*.Str))は、.Str表現に従って、ユニークな座標をフィルタリングするようにします。その後、.headが最初の5件を取得します。

これにより、すべての順列を構築する必要がなくなります。あなたがそれらすべてを必要とするなら、再び、あなたの道(マイナス>>.Array)は、私がそれをやる方法とほとんど同じです。

Rakudo Perl 6の将来のバージョンでは、このより良いパフォーマンスを実現する:as(*.Str)が必要ない場合があります。

関連する問題