有时,我对APL的熟悉程度为我提供了解决问题的算法思路,例如,我使用自己拥有的语言(例如Perl)重新实现。

因此,我已经处理了一个文本文件以创建一个 bool(boolean) vector ,该 vector 指示分隔文件中的已使用字段,现在我想输出这些已使用字段的索引以及已使用字段的名称。在APL中,我将在字段名称的 vector 以及字段数量的iota上使用compress运算符。

在Perl中,我这样做:

my @UsedFieldNames = map { $UsedFields[$_] ? $FieldNames[$_] : () } 0 .. $#UsedFields;


say join " ", map { $UsedFields[$_] ? $) : () } 0 .. $#UsedFields;

其中@UsedFields是一个数组,其中包含0(未使用)和1(已使用)字段。
  • 我不太喜欢使用带有?:()的 map 来模拟压缩-是否有更好的方法(我的真实程序在模拟垂直或缩小文件时第三次使用)?
  • 我真的不喜欢在索引上进行映射以获得结果-有更好的方法来计算吗? (我想一种优化方法是先计算使用的索引,然后再计算
    @UsedFieldNames = @FieldNames[@UsedIndexes];
  • 最佳答案

    其他方法:

    my @UsedFieldNames = map { ( $FieldNames[$_] ) x !!$UsedFields[$_] } 0..$#UsedFields;
    my @UsedFieldNames = @FieldNames[ grep $UsedFields[$_], 0..$#UsedFields ];
    

    10-06 06:47