如何在 Perl 6 中找到列表的正确最小值/最大值

How to find correct min / max values of a list in Perl 6

Perl6 的新手,试图找出我在这里做错了什么。问题是一个简单的校验和,它取 csv

中每一行的最大值和最小值的差值

它returns 的最大值和最小值是完全错误的。对于 csv 中的第一行,returns 最大值为 71,最小值为 104,这是不正确的。

这是对应问题的link to the repo for reference, and the link

#!/usr/bin/env perl6

use Text::CSV;

sub checksum {
    my $sum = 0;
    my @data = csv(in => "input.csv");
    for @data -> @value {
        $sum += (max @value) - (min @value);
    }
    say $sum;
}

checksum

我假设您的输入包含数字,但由于 CSV 是一种文本格式,因此输入被读取为字符串。 minmax是基于字符串排序操作的,所以max("4", "10")4,而max("04", "10")10。要解决这个问题,您可以在获得 min/max:

之前将每个元素转换为 Numeric (整数、浮点数等)
@input.map(*.Numeric).max

或将转换函数传递给 minmax,以便每个元素在比较时被解析为数字:

@input.max(*.Numeric)

第一个解决方案更适合您的情况,因为第二个解决方案是临时转换,在内部转换但仍返回字符串。最后注意:在正常代码中,我会写 +*{ +$_ } 来表示 "treat X as a number",但在这种情况下我更喜欢明确:.Numeric.