4

假设我有一个数组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 |更近的位置,但后来我失去了位置。

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

4

2 回答 2

5

怎么样m←{s-⌈\(s←+\⍵)×2>/0,⍵},似乎快两倍?

      cmpx  'h r' 'm r'
  h r → 1.1E¯5 |   0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
  m r → 4.2E¯6 | -63% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕ 
于 2021-09-17T11:49:57.083 回答
4

这里有几个选项。使用 \ 可以轻松调整您的原始想法。

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

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

可能有更好的东西,但我很难找到它,但它留给读者作为练习;)

      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% ⎕⎕⎕⎕                                     
于 2021-09-17T09:06:37.830 回答