Perl6:选择一对坐标

Perl6: Picking a pair of coordinates

我试图找到一种方法来打印随机坐标列表,没有任何重复,给定两个维度的最小值和最大值。

尽管我很难理解 '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)

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 of random coordinate pairs. The .unique(:as(*.Str)) makes sure we filter the unique coordinates out, as per their .Str representation. Then .head 只取找到的前 5 个。

这避免了必须构建所有排列。再一次,如果你确实需要它们,那么你的方式(减去 >>.Array)几乎就是我会做的。

Rakudo Perl 6 的未来版本可能不需要 :as(*.Str),这将使它的性能更好。