如何屏蔽 APL 中的扫描操作员?

How can I mask the scan operator in APL?

假设我有一个数组 N ← 0 0 0 1 1 1 0 0 1,我如何应用扫描 \ 来获得数组 0 0 0 1 2 3 0 0 1

+\N 给我 0 0 0 1 2 3 3 3 4 这不是我想要的。

+\¨⊆⍨N 给我 | 1 2 3 | 1 | 更接近,但我失去了位置。

有没有办法在扫描和相乘中携带原始值,或者更好的方法?

这里有几个选项。使用 \.

可以轻松调整您的原始想法

或者,对于一个简短的(但效率低下的 O(n^2))解决方案,⊥⍨¨,\ 有效。

为了更有效但更长的解决方案,我采用了 https://aplcart.info/?q=cumulative%20sum#

可能还有更好的东西但我太难找了但它留给了 reader ;)

      f ← {⍵\∊+\¨⊆⍨⍵}
      g ← ⊥⍨¨,\
      h ← {+\⍵-a\¯2-/0,(a←1,2≠/⍵)/+\¯1↓0,⍵}
      f 0 0 0 1 1 1 0 0 1
0 0 0 1 2 3 0 0 1

      r ← ? 1e3 ⍴ 2        ⍝ random boolean array
      (∧/2≡/f,⍥⊆g,⍥⊆h)r   ⍝ they're all the same
1
      
      ]runtime -c 'f r' 'g r' 'h r'
                                                                
  f r → 3.6E¯5 |    0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                      
  g r → 7.7E¯5 | +111% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕ 
  h r → 7.3E¯6 |  -80% ⎕⎕⎕⎕                                     

m←{s-⌈\(s←+\⍵)×2>/0,⍵}怎么样,好像快了一倍?

      cmpx  'h r' 'm r'
  h r → 1.1E¯5 |   0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
  m r → 4.2E¯6 | -63% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕