Perl6:挑选一对坐标

问题描述 投票:1回答:1

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

虽然我很难理解'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)
perl6
1个回答
2
投票

Documentation on XDocumentation on >>。 虽然在这种情况下你不需要>>.Array,正如布拉德已经指出的那样。

假设您永远不会超过可能的坐标排列数,您可能会发现这样做性能更好(对于低坐标数和排列数):

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),这将使这个表现更好。

© www.soinside.com 2019 - 2024. All rights reserved.