使用 Dyalog APL 我想采用一个掩码向量,其中“-”表示使用原始字符,任何其他字符将替换数据向量中的该位置。因此,在下面的示例中,在向量“b”上使用掩码“a”来创建向量“c”。
┌──────┬────────┬────┐
│X--Y-Z│--34--91│-+-+│ Mask Vector a
└──────┴────────┴────┘
┌──────┬────────┬────┐
│abcdef│hijklmno│stuv│ Data Vector b
└──────┴────────┴────┘
┌──────┬────────┬────┐
│XbcYeZ│hi34lm91│s+u+│ Resultant Vector c
└──────┴────────┴────┘
向量包含不同长度的字符串。我不想使用 APL 中内置的任何正则表达式或搜索和替换功能。
我创建了代码来执行此功能,但它似乎太复杂了,因为它要创建矩阵、旋转字符以及从行中提取数据。我确信在 APL 中有一种更简单的方法来执行此功能。我有兴趣看看更有经验的 APL 开发人员能想出什么。
mask ← 'X--Y-Z' '--34--91' '-+-+'
data ← 'abcdef' 'hijklmno' 'stuv'
where ← '-'≠mask
fill ← where/¨mask
(where/¨data) ← fill
data
主要操作是
(where/¨data) ← fill
,这是“选择性赋值”的一个例子。
这个操作可以更简洁地定义为运算符:
merge ← {d←⍵ ⋄ (w/¨d)←(w←⍺⍺≠⍺)/¨⍺ ⋄ d}
并以
mask ('-' merge) data
的形式调用