aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarshall Lochbaum <mwlochbaum@gmail.com>2020-08-08 22:04:15 -0400
committerMarshall Lochbaum <mwlochbaum@gmail.com>2020-08-08 22:20:59 -0400
commit4c6591c8981ec5cc533173a9136c3d870c6a7862 (patch)
tree5940a686504a3e7d27e77412491f00bfc506ea23
parentff1c76da4a4efe69590cab6d99b5d7ab6652544d (diff)
Grade-based IndexOf
-rw-r--r--src/r.bqn75
1 files changed, 39 insertions, 36 deletions
diff --git a/src/r.bqn b/src/r.bqn
index e67e45bb..e2723bbf 100644
--- a/src/r.bqn
+++ b/src/r.bqn
@@ -341,40 +341,6 @@ Pick1←{
Pickd←(∨´IsArray⌜∘⥊∘⊣)◶Pick1‿{Pickd⟜𝕩⌜𝕨}
Pick←IsArray◶⥊‿⊢⊸Pickd
-# Searching
-IndexOf←{
- c←1-˜=𝕨
- ! 0≤c
- 𝕨 (0<≠𝕨)◶⟨0⎉c∘⊢,(+˝∧`)≢⌜○((0<c)◶⟨⊢,<⎉c⟩)⟩ ToArray𝕩
-}
-UniqueMask←{
- ! 1≤=𝕩
- g←Cmp _grade_ 0 𝕩
- (1¨⊸GroupOrd g)⊏0⊸<◶⟨1,-⟜1≢○(⊑⟜(g⊏<˘⍟(1<=)𝕩))⊢⟩⌜↕≠𝕩
-}
-Find←{
- r←=𝕨
- ! r≤=𝕩
- 𝕨 ≡⎉r (≢𝕨) ↕⎉r 𝕩
-}
-
-⊐ ← !∘0 ⊘ IndexOf
-∊ ← UniqueMask ⊘ (⊐˜<≠∘⊢)
-⍷ ← ∊⊸/ ⊘ Find
-
-ReorderAxes←{
- 𝕩↩<⍟(0=≡)𝕩
- ! 1≥=𝕨
- 𝕨↩⥊𝕨
- ! 𝕨≤○≠≢𝕩
- ! ∧´Nat⌜⥊𝕨
- r←(=𝕩)-+´¬∊𝕨
- ! ∧´𝕨<r
- 𝕨↩𝕨∾𝕨(¬∘∊˜/⊢)↕r
- (𝕨⊸⊏Pick𝕩˜)⌜↕⌊´⌜𝕨⊔≢𝕩
-}
-⍉ ← Transpose ⊘ ReorderAxes
-
# Sorting
CmpLen ← {
e←𝕨-˜○(∨´0⊸=)𝕩
@@ -423,8 +389,43 @@ _bins←{
⍋ ← Cmp _grade_ 0 ⊘ (Cmp _bins)
⍒ ← Cmp˜ _grade_ 1 ⊘ (Cmp˜ _bins)
-∧ ↩ ⍋⊸⊏ ⊘ ∧
-∨ ↩ ⍒⊸⊏ ⊘ ∨
+
+# Searching
+IndexOf←{
+ c←1-˜=𝕨
+ ! 0≤c
+ 𝕨 ∧○(8<≠∘⥊)◶⟨
+ (0<≠𝕨)◶⟨0⎉c∘⊢, (+˝∧`)≢⌜○((0<c)◶⟨⊢,<⎉c⟩)⟩
+ { g←⌽⍒𝕨 ⋄ i←g⊏˜0⌈1-˜(g⊏𝕨)⍋𝕩 ⋄ i+(i-˜≠𝕨)×(i⊏𝕨)≢⎉c𝕩 }
+ ⟩𝕩
+}⟜ToArray
+UniqueMask←{
+ ! 1≤=𝕩
+ g←⍋𝕩
+ (1¨⊸GroupOrd g)⊏0⊸<◶⟨1,-⟜1≢○(⊑⟜(g⊏<˘⍟(1<=)𝕩))⊢⟩⌜↕≠𝕩
+}
+Find←{
+ r←=𝕨
+ ! r≤=𝕩
+ 𝕨 ≡⎉r (≢𝕨) ↕⎉r 𝕩
+}
+
+⊐ ← !∘0 ⊘ IndexOf
+∊ ← UniqueMask ⊘ (⊐˜<≠∘⊢)
+⍷ ← ∊⊸/ ⊘ Find
+
+ReorderAxes←{
+ 𝕩↩<⍟(0=≡)𝕩
+ ! 1≥=𝕨
+ 𝕨↩⥊𝕨
+ ! 𝕨≤○≠≢𝕩
+ ! ∧´Nat⌜⥊𝕨
+ r←(=𝕩)-+´¬∊𝕨
+ ! ∧´𝕨<r
+ 𝕨↩𝕨∾𝕨(¬∘∊˜/⊢)↕r
+ (𝕨⊸⊏Pick𝕩˜)⌜↕⌊´⌜𝕨⊔≢𝕩
+}
+⍉ ← Transpose ⊘ ReorderAxes
OccurrenceCount ← ⊐˜(⊢-⊏)⍋∘⍋
ProgressiveIndexOf ← {𝕨⊐○(≍˘⟜OccurrenceCount𝕨⊸⊐)𝕩}
@@ -460,4 +461,6 @@ _repeat_←{
⥊ ↩ Deshape ⊘ Reshape
⌜ ↩ {𝔽⌜○ToArray}
+∧ ↩ ⍋⊸⊏ ⊘ ∧
+∨ ↩ ⍒⊸⊏ ⊘ ∨
⌾ ← _under_