如何在 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 是一种文本格式,因此输入被读取为字符串。 min
和max
是基于字符串排序操作的,所以max("4", "10")
是4
,而max("04", "10")
是10
。要解决这个问题,您可以在获得 min/max:
之前将每个元素转换为 Numeric
(整数、浮点数等)
@input.map(*.Numeric).max
或将转换函数传递给 min
和 max
,以便每个元素在比较时被解析为数字:
@input.max(*.Numeric)
第一个解决方案更适合您的情况,因为第二个解决方案是临时转换,在内部转换但仍返回字符串。最后注意:在正常代码中,我会写 +*
或 { +$_ }
来表示 "treat X as a number",但在这种情况下我更喜欢明确:.Numeric
.
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 是一种文本格式,因此输入被读取为字符串。 min
和max
是基于字符串排序操作的,所以max("4", "10")
是4
,而max("04", "10")
是10
。要解决这个问题,您可以在获得 min/max:
Numeric
(整数、浮点数等)
@input.map(*.Numeric).max
或将转换函数传递给 min
和 max
,以便每个元素在比较时被解析为数字:
@input.max(*.Numeric)
第一个解决方案更适合您的情况,因为第二个解决方案是临时转换,在内部转换但仍返回字符串。最后注意:在正常代码中,我会写 +*
或 { +$_ }
来表示 "treat X as a number",但在这种情况下我更喜欢明确:.Numeric
.