Perl6:挑选一对坐标

时间:2017-12-21 22:51:22

标签: 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)

1 个答案:

答案 0 :(得分:2)

Documentation on X
Documentation 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),这样可以使其表现更好。