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

Jak*_*yer 4 perl6

Perl6的新手,试图找出我在这里做错了什么.问题是一个简单的校验和,它取csv中每行的最大值和最小值的差值

它返回的最大值和最小值完全错误.对于csv中的第一行,它返回max为71,min为104,这是不正确的.

这是repo 的链接以供参考,以及指向相应问题的链接.

#!/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
Run Code Online (Sandbox Code Playgroud)

pio*_*ojo 12

我假设您的输入包含数字,但由于CSV是文本格式,因此输入将作为字符串读入.minmax正在操作基于字符串排序,所以max("4", "10")4max("04", "10")10.要解决这个问题,您可以Numeric在获得最小值/最大值之前将每个元素转换为(int,浮点等):

@input.map(*.Numeric).max
Run Code Online (Sandbox Code Playgroud)

或传递转换函数min,max因此每个元素都被解析为一个数字,因为它被比较:

@input.max(*.Numeric)
Run Code Online (Sandbox Code Playgroud)

第一种解决方案更适合您的情况,因为第二种解决方案是短暂的转换,在内部进行转换但仍然返回一个字符串.最后的注意事项:在正常的代码中,我会写+*{ +$_ }意为"将X视为数字",但在这种情况下,我更喜欢明确:.Numeric.

  • 我会用'+*`(`*.Numeric`),而不是`{.INT}`(或`*.Int`),因此它会继续,如果分数值给出,而不是正常工作. (2认同)