【问题标题】:Perl6: Picking a pair of coordinatesPerl6:选择一对坐标
【发布时间】:2019-11-24 20:59:51
【问题描述】:

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

虽然我很难理解“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)

【问题讨论】:

  • >>.Array 完全没有必要。

标签: raku


【解决方案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),这将使其性能更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多