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)
,这将使它的性能更好。
我试图找到一种方法来打印随机坐标列表,没有任何重复,给定两个维度的最小值和最大值。
尽管我很难理解 '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)
,这将使它的性能更好。