# BQN runtime part 1. Requires: # Type Fill Log GroupLen GroupOrd _fillBy_ # +-×÷⋆⌊⌈|<>=≠≤≥≢⊢⊣⥊∾↑↓↕⊏⊑!⌜˙˜´`∘○⊸⟜◶⊘⍟ # Filled in by runtime: glyphs and default PrimInd # Provides: all BQN primitives Decompose ← {0‿𝕩} PrimInd ← {𝕩} SetPrims ← {Decompose‿PrimInd ↩ 𝕩} IsArray ← 0=Type Int ← (1=Type)◶⟨0,⌊⊸=⟩ Nat ← (1=Type)◶⟨0,0⊸≤×⌊⊸=⟩ Deshape ← IsArray◶{𝕩Fill⟨𝕩⟩}‿⥊ Pair ← {⟨𝕩⟩} ⊘ {⟨𝕨,𝕩⟩} ToArray ← <⍟(1-IsArray) Cell ← ↓⟜≢ MatchS ← 1×´=¨ PermInv ← 1⌜⊸GroupOrd _qSearch ← {+´·×`𝕗(1-=)⌜<} _glyphLookup_ ← { {PrimInd𝕩} ⊑ ((𝕘⊑˜𝕗_qSearch)⌜glyphs)˙ } _isGlyph ← { (glyphs _qSearch 𝕗) = {PrimInd𝕩} } IsJoin ← '∾'_isGlyph Split2 ← { s←2⊸×⌜↕(≠𝕩)÷2 ⋄ ⟨s⊏𝕩,(1⊸+⌜s)⊏𝕩⟩ } _lookup_ ← { k‿v←Split2 𝕘 ⋄ k _glyphLookup_ (v∾⟨𝕗⟩) } Identity ← {𝕏0} ("´: Identity not found"!0˙) _lookup_ ⟨ '+',0 , '-',0 '×',1 , '÷',1 '⋆',1 , '¬',1 '⌊',∞ , '⌈',¯∞ '∨',0 , '∧',1 '≠',0 , '=',1 '>',0 , '≥',1 ⟩ _fold←{ "´: 𝕩 must be a list" ! 1==𝕩 𝕨 (0<≠)⊘1◶⟨Identity 𝕗˙, 𝔽´⟩ 𝕩 } _eachd←{ _d←{ # Equal ranks p←≢𝕨 "Mapping: Equal-rank argument shapes don't agree" ! p MatchS ≢𝕩 p⥊𝕨𝔽¨○⥊𝕩 } _e←{ # 𝕨 has smaller or equal rank p←≢𝕨 ⋄ k←=𝕨 ⋄ q←≢𝕩 "Mapping: Argument shape prefixes don't agree" ! 1(⊑⟜p=⊑⟜q)⊸×´↕k l←1(q⊑˜k⊸+)⊸×´↕(=𝕩)-k a←⥊𝕨 ⋄ b←⥊𝕩 q⥊⥊(≠a) (⊑⟜a𝔽l⊸×⊸+⊑b˙)⌜○↕ l } =○=◶⟨>○=◶⟨𝔽_e⋄𝔽˜_e˜⟩⋄𝔽_d⟩ } _perv←{ # Pervasion R←𝔽{𝕨𝔽_perv𝕩} +○IsArray◶⟨ 𝔽 R⌜⊘(>○IsArray◶{𝕨{𝕗R𝕩}⌜𝕩}‿{𝕩{𝕩R𝕗}⌜𝕨}) _fillBy_ R R _eachd _fillBy_ R ⟩ } # Sorting Cmp0 ← ≥-≤ Cmp1 ← (0<1×´≢∘⊢)◶⟨1, IsArray∘⊢◶(1-2×≤)‿{𝕨Cmp1𝕩}⟜(0⊑⥊)⟩ CmpLen ← { e←𝕨-○(1×´0⊸<⌜)𝕩 𝕨(e=0)◶⟨e,0⟩‿{ SM←Cmp0 Pair ≥⊑Pair c‿r←𝕨SM○≠𝕩 l←𝕨{ i←0+´×`𝕨=¨𝕩 m←1×´i↕⊸⊏𝕨 {k‿l←SM´𝕩⋄c↩k⋄m×↩l}∘(<⊑⌜𝕨‿𝕩˙)⍟(r⊸>)i m }○{𝕩⊏˜(¯1+≠𝕩)⊸-⌜↕r}𝕩 ⟨c,l⟩ }𝕩 } _getCellCmp ← { Ci←𝔽⋄c←𝕨⊣0⋄l←𝕩 Cc←{ a←𝕨⋄b←𝕩 S←(l⊸=)◶{S∘(1+𝕩)⍟(0⊸=)a Ci○(𝕩⊸+)b}‿c S 0 } (𝕨 ⊢⊘{𝕨⍟(0⊸=)𝕏} ci˙)⍟(1=l) cc } Cmp ← +○IsArray◶⟨ Cmp0 IsArray∘⊣◶⟨Cmp1,-Cmp1˜⟩ { lc←𝕨CmpLen○≢𝕩 cc ← (⊑⟜(⥊𝕨))⊸Cmp⟜(⊑⟜(⥊𝕩)) _getCellCmp´ lc Cc˜0 } ⟩ _grade ← { gt ← 𝕗 cmps ← {𝕏˜}⌜⍟𝕗⟨Cmp,Cmp0,Cmp≤0˙,≤⟩ 0 Fill { "⍋𝕩: 𝕩 must have rank at least 1" ! 1≤=𝕩 l←≠𝕩 (2≤l)◶⟨↕∘l,{ m1←1=m←1×´1 Cell 𝕩 𝕩↩⥊𝕩 a0←1⋄ts←0⋄{a0×↩1≤𝕩⋄ts+↩𝕩}∘Type⌜𝕩 cs←a0+2×m1 Merge ← { # Merge sort le ← m {(𝕏 _getCellCmp m)≤0˙}⍟(1-m1) 𝕩{𝕏○(⊑⟜𝕗)} cs⊑cmps B←l⊸≤◶⊢‿l (↕l){ i←-d←𝕨 ⋄ j←ei←ej←0 e←3 ⋄ G←LE○(⊑⟜(m⊸×⌜⍟(1-m=1)𝕩)) ⋄ c←⟨1-G,0,1,2⟩ s←(8≤d)⊑⟨+,{(𝕩-1){𝕩⋄e↩2⋄j↩i⋄i↩𝕩}⍟G⍟(1-e)𝕩}⟩ N←{i↩d+𝕨⋄ej↩B d+ei↩B j↩d+𝕩⋄e↩l≤j⋄S ei⋄i R j} R←{𝕨e◶c𝕩}◶{e+↩2×ei=i↩1+𝕨⋄𝕨}‿{e+↩ej=j↩1+𝕩⋄𝕩}‿N {(i R j)⊑𝕩}⟜𝕩⌜𝕩 }´(2⋆ni-1+⊢)⌜↕ni←⌈2 Log l+l=0 } # Counting sort for small-range ints bl←bu←0 ⋄ Count←{GroupLen⊸GroupOrd (gt⊑⟨-⟜bl,bu⊸-⟩)⌜𝕩} sr←((3=cs)×ts=l)◶⟨0,(1×´⌊⊸=⌜)◶0‿{((bu↩⌈´𝕩)-bl↩⌊´𝕩)≤2×l}⟩𝕩 sr◶Merge‿Count 𝕩 }⟩𝕩 } } _binSearch ← { B ← 𝔽 { R←{𝕨{a←B m←𝕩+h←⌊𝕨÷2⋄(h+a×𝕨-2×h)R a⊑𝕩‿m}⍟(>⟜1)𝕩} 1+(𝕩+1)R ¯1 }⍟(0⊸<) } _bins←{ c←1-˜=𝕨 "⍋ or ⍒: Rank of 𝕨 must be at least 1" ! 0≤c "⍋ or ⍒: Rank of 𝕩 must be at least cell rank of 𝕨" ! c≤=𝕩 𝕩↩ToArray 𝕩 lw←1×´sw←1 Cell 𝕨 cw←𝔽○(⊑⟜(⥊𝕨)) _getCellCmp lw "⍋ or ⍒: 𝕨 must be sorted" ! 0⊸<◶⟨1,1×´·(Cw≤0˙)⟜(lw⊸+)∘(lw⊸×)⌜↕∘-⟜1⟩≠𝕨 cx←c-˜=𝕩 sx←cx Cell 𝕩 ⋄ lc←sw CmpLen sx cc ← (⊑⟜(⥊𝕨))⊸𝔽⟜(⊑⟜(⥊𝕩)) _getCellCmp´ lc B←(1×´sw)⊸×⊸Cc≤0˙ 0 Fill (≠𝕨)⊸{B⟜𝕩 _binSearch 𝕨}⌜ (1×´sx)⊸×⌜ ⥊⟜(↕1×´⊢)cx↑≢𝕩 } ⍋ ← 0 _grade ⊘ (Cmp _bins) ⍒ ← 1 _grade ⊘ (Cmp˜ _bins) # Searching _search←{ # 0 for ∊˜, 1 for ⊐ ind ← 𝕗 red ← 𝕗⊑⟨1-×´,+´×`⟩ 0 Fill { c←1-˜=𝕨 "p⊐𝕩 or 𝕨∊p: p must have rank at least 1" ! 0≤c "p⊐n or n∊p: Rank of n must be at least cell rank of p" ! c≤=𝕩 n←≠𝕨 ⋄ k←1×´s←1 Cell 𝕨 ⋄ cx←c-˜=𝕩 lx←1×´sh←cx↑≢𝕩 sh ⥊ 𝕨 (0_cr⟩ ⊣ ei!Int∘⊢ }⌜⟨ "𝕨⊑𝕩: Indices in 𝕨 must consist of integers"‿"𝕨⊑𝕩: Index out of range" "𝕨⊏𝕩: Indices in 𝕨 must be integers"‿"𝕨⊏𝕩: Indices out of range" ⟩ Pick0←{ "𝕨⊑𝕩: 𝕩 must be a list when 𝕨 is a number" ! 1==𝕩 𝕩⊑˜(≠𝕩)NormIndP𝕨 } Pick1←{ "𝕨⊑𝕩: Indices in compound 𝕨 must be lists" ! 1==𝕨 "𝕨⊑𝕩: Index length in 𝕨 must match rank of 𝕩" ! 𝕨=○≠s←≢𝕩 i←0⋄𝕨{i↩(𝕩NormIndP𝕨)+𝕩×i}¨s i⊑Deshape𝕩 }⟜ToArray Pickd←(0<0+´IsArray⌜∘⥊∘⊣)◶Pick1‿{Pickd⟜𝕩⌜𝕨} Pick←IsArray∘⊣◶Pick0‿Pickd FirstCell←{ "⊏𝕩: 𝕩 must have rank at least 1" ! 1≤=𝕩 "⊏𝕩: 𝕩 cannot have length 0" ! 0<≠𝕩 (<0) ⊏ 𝕩 } SelSub←{ "𝕨⊏𝕩: 𝕨 must be an array" ! IsArray 𝕨 𝕨 (≠𝕩)⊸NormIndS⌜⊸⊏ 𝕩 } First ← IsArray◶⟨⊢, (0<≠)◶⟨Fill,0⊸⊑⟩⥊⟩ IsPure ← {d←Decompose𝕩 ⋄ 2⊸≤◶⟨≤⟜0, 1×´·𝕊⌜1↓d˙⟩0⊑d} HomFil ← {((𝕎0) Fill 𝕏)⊘𝕏}⍟("=≠≡≢"_glyphLookup_(<⟜4⌜↕5)∘⊣) _fillByPure_←{ 𝕘 (3≤Type∘⊣)◶⟨{𝕨Fill𝕏},{(𝕨HomFil𝕩)_fillBy_𝕨}⍟(IsPure⊣)⟩ 𝕗 } _each ← {𝕨𝔽⌜⊘(𝔽_eachd)_fillByPure_𝔽○ToArray𝕩} _table ← {𝕨𝔽⌜_fillByPure_𝔽○ToArray𝕩} StructErr←{𝕩} IsStructErr ← (3=Type)◶⟨0,StructErr˙⊸=⟩ _under_←{ val←𝕨𝔽○𝔾𝕩 # Construct indices Inds ← IsArray◶⟨0,⥊⟜(↕1×´⊢)≢⟩ 𝕩 ⊑⟜⥊⍟(IsArray⊢)´ Reverse _s_ ← { f←𝕗 st‿d‿o←𝕩 g←𝕨 St Inds∘{f↩f(IsArray⊣)◶⟨⟩‿∾⟨𝕩⟩}⍟(d>IsArray) 𝕘 {f _s_ 𝕩}⍟o g } IsStruct ← (5=0⊸⊑)◶⟨0,s˙=2⊸⊑⟩ Decompose sf ← isStruct StructFn 𝕘 ⋄ SR ← ¯1 _s_ 0 root‿ind ← IsStruct◶⟨0‿StructErr,1‿3⊏Decompose⟩ SF sr # Traverse indices 𝕩 and values 𝕨. # Return flat lists ⟨indices,values⟩, or structErr if 𝕨 doesn't capture 𝕩. GetInserts←{ count←0⋄depth←{IsArray◶⟨{𝕩⋄count+↩1⋄0},1+0𝕊⊸⌈´⥊⟩𝕩}𝕩 𝕩 (2⌊depth)◶(Pair○Pair)‿(StructConform◶⟨StructErr˙,Pair○⥊⟩)‿{ Fail←{𝕊‿0} # 𝕎 is parent traversal; 𝕩 is current components of ind and val Trav←(IsArray 0⊑⊢)◶⟨Pair, StructConform´∘⊢◶Fail‿{ Parent←𝕎 ⋄ n←≠0⊑a←⥊⌜𝕩 ⋄ j←¯1 Child←Trav⟜{𝕩⊸⊑⌜a} { j+↩1 ⋄ f←n⊸≤◶⟨𝕊˙⊸Child,Parent˙⟩j ⋄ F 0 } }⟩ next ← 0 Trav 𝕨‿𝕩 res ← {n‿o←Next𝕩⋄next↩n⋄o}⌜ ↕count (next=fail)◶⟨0⊸⊑⌜ Pair 1⊸⊑⌜, StructErr˙⟩ res } 𝕨 }⍟(1-IsStructErr∘⊢) Struct←{ i‿v←𝕨 Set1←𝕨⊸{ 𝕩↩ToArray𝕩 s←≢𝕩⋄l←≠d←⥊𝕩 gl←l GroupLen i ⋄ g←gl GroupOrd i Sel←v⊑˜⊑⟜g j←0⋄Adv←Sel{(j+↩𝕩)-1} CM←"⌾: Incompatible result elements in structural Under"!Match⟜Sel s⥊(↕l)2⊸⌊◶⟨⊑⟜d,Adv,Adv{(𝕨CM(j-𝕩)⊸+)⌜↕𝕩-1⋄𝕨}⊢⟩¨gl } _at_ ← {(↕≠𝕩)𝔽⍟((𝔾𝕩)=⊣)¨𝕩} Set ← 0⊸{ (𝕨≥≠root)◶⟨≢⥊(1+𝕨)⊸𝕊_at_(𝕨⊑root˙)∘⥊, Set1⟩ 𝕩 } IsArray∘root◶⟨0⊑v˙, Set⟩ 𝕩 } _fillBy_ ⊢ IsStructErr◶⟨Struct⟜(𝕩˙), {𝕏val}·Inverse𝔾˙⟩ val GetInserts ind } match←{(0⊑𝕨)◶(1⊑𝕨)‿𝕩}´⟨ ⟨=○IsArray, 0⟩ ⟨IsArray∘⊢, =⟩ ⟨=○= , 0⟩ ⟨MatchS○≢ , 0⟩ {1×´𝕨Match¨○⥊𝕩} ⟩ structConform ← {𝕎◶0‿𝕏}´⟨IsArray⊢, =○=, MatchS○≢⟩ Depth←IsArray◶0‿{1+0⌈´Depth⌜⥊𝕩} ≡ ← Depth ⊘ Match ≢ ↩ IsArray◶⟨⟩‿≢ ⊘ (1-Match) IF ← ⊢⊣!∘≡ # Intersect fill IEF← (0<≠)◶⟨⊢_fillBy_ Fill, ⊢_fillBy_ IF´⟩∘⥊ _fillMerge_ ← {(0<≠∘⥊)◶⟨(𝔾○≢⥊⟨⟩˙)_fillBy_⊢⟜Fill, 𝔽 ⊣_fillBy_⊢ IEF⟩} Merge←{ c←≢0⊑⥊𝕩 (">𝕩: Elements of 𝕩 must have matching shapes" ! c =○≠◶0‿MatchS ≢)⌜⥊𝕩 (Deshape⌜𝕩)⊑˜⌜c⥊↕1×´c }_fillMerge_∾⍟IsArray JoinTo←(1<⌈○=)◶(∾○⥊)‿{ a←1-˜𝕨⌈○=𝕩 s←𝕨Pair○≢𝕩 "𝕨∾𝕩: Rank of 𝕨 and 𝕩 must differ by at most 1" ! 1×´(a≤≠)⌜s c←(≠-a˙)⊸↓⌜s "𝕨∾𝕩: Cell shapes of 𝕨 and 𝕩 must match" ! MatchS´c l←0+´(a<≠)◶1‿(0⊑⊢)⌜s (⟨l⟩∾0⊑c)⥊𝕨∾○⥊𝕩 }○ToArray _fillBy_ IF Join1←{ # List of lists i←j←¯1 ⋄ e←⟨⟩ ⋄ a←𝕩 {{e↩a⊑˜i↩𝕩⋄j↩¯1}⍟(1-i⊸=)𝕩⋄(j↩j+1)⊑e}⌜Indices≠⌜𝕩 } JoinM←{ # Multidimensional n←≠z←⥊𝕩 ⋄ s←≢⌜z ⋄ d←≠0⊑s ⋄ r←=𝕩 "∾𝕩: Elements of 𝕩 must all have the same rank" ! 1×´(d=≠)⌜s "∾𝕩: 𝕩 element rank must be at least argument rank" ! d≥r _s0←{s←𝕨⋄F←𝔽⋄{o←s⋄s F↩𝕩⋄o}⌜𝕩} sh←≢𝕩 ⋄ p←1 ⋄ i←j←<0 (Reverse 1×_s0 Reverse sh){ q←𝕨 a←𝕩⊑sh m←𝕩⊸⊑⌜s l←m⊏˜q⊸×⌜↕a "∾𝕩: 𝕩 element shapes must be compatible" ! m MatchS ⥊(↕p)⊢⌜l⊣⌜↕q k ← Indices l c ← (↕≠k)-¨k ⊏ 0+_s0 l i ↩ (i ×⌜ k⊏l) +¨ i⊢⌜c j ↩ j ×⟜a⊸+⌜ k p×↩a }¨↕r G←(⥊⌜z){𝕨⊑𝕩⊑𝕗}¨ i (r", Mon 2 _sfn_ 1 # "∾", Mon 2 _sfn_ 1 # Dyad combines # "˘⎉¨⌜", # "⚇", ⟩ SP ← (Join1 k)_glyphLookup_((k≠⌜⊸Rep v)∾⟨{ NS ← 𝕎 _errIf (Type-3˙)◶⟨NS, {m←𝕩⋄{NS(𝕗_m)˙0}}, {m←𝕩⋄{NS(𝕗_m_𝕘)˙0}}⟩ 𝕩 }⟩) StructPrim ← {p←SP𝕩⋄𝕨P𝕩} 0⊸≤◶⟨3,2⊸≤◶⊢‿2⟩∘(0⊑⊢)◶⟨ SE ⊣ StructPrim 1⊑⊢ # 0 primitive StructErr˙˙ # 1 block 0⊸⊑ Recompose {𝕨˙⊸StructFn⌜1↓𝕩} # other operation SE 1⊑⊢ # ¯1 constant ⟩⟜{Decompose𝕩} } _takeDrop←{ take ← 1 - 𝕗 gl ← 𝕗⊑"↑"‿"↓" noop ← 𝕗⊑⟨1-=⟜|, 1-0⊸=⟩ inds ← 𝕗⊑⟨ { 𝔽⍟(𝕨⊸<)a←|𝕩 ⋄ (0<𝕩)◶⟨¯∞⍟(<⟜0)⌜+⟜(𝕨+𝕩)⌜, ¯∞⍟(𝕨⊸≤)⌜⟩↕a } { 𝔽 ⋄ 0⊸<◶⟨↕0⌈+,<∘⊢+⌜·↕0⌈-⟩ } ⟩ pre ← "𝕨"∾gl∾"𝕩: 𝕨 must " ernk ← pre∾"have rank at most 1" eint ← pre∾"consist of integers" IsArray∘⊣◶{ eint ! Int 𝕨 p←0≤𝕨 l←𝕨p◶⟨0⌈+,⌊⟩≠𝕩 F←𝕩{(Fill𝕗)˙⌜↕𝕩} k←1⋄S←⊢ ⋄ 𝕨⊸{k×´↩c←1 Cell𝕩 ⋄ S↩(⟨(0⌈(≠𝕩)-⊢)⍟(1-take)|𝕨⟩∾c)⊸⥊}⍟(1<=) 𝕩 S ((|∘𝕨-≠){𝕩p◶⟨∾˜,∾⟩F𝕨×k}⍟(>⟜0)⊢)⍟take (l×k) (take=p)◶↓‿↑ ⥊𝕩 }‿{ ernk ! 1≥=𝕨 𝕨 ↩ ⥊𝕨 eint ! 1×´Int⌜𝕨 r ← ≠𝕨 s ← r {(1⌜∘↕𝕨-≠𝕩)∾𝕩}⍟(>⟜≠) ≢𝕩 _c ← { (×⟜𝕗⌜𝕨) +⌜ 𝕩 } i←<0 ⋄ k←1 ⋄ UIk←{ i (k×𝕨)_c↩ k ↕⊸(𝕨_c)⍟(1-=⟜1) 𝕩 ⋄ k↩1 ⋄ ≠𝕩 } doFil←0 sh ← (r↑s) Noop◶{k×↩𝕨⋄𝕨}‿(⊣ UIk {𝕩⋄doFil↩1}_inds)¨ 𝕨 (0<=i)◶(s⊸⥊)‿{ sh ∾↩ t ← r↓s {i 𝕩_c↩ ↕𝕩}⍟(1-1⊸=) k×´t Sel ← ⊑⟜(⥊𝕩) 𝕩{Sel↩0⊸≤◶⟨(Fill𝕨)˙,Sel⟩}⍟⊢doFil Sel⌜ sh ⥊ i } 𝕩 }_fillBy_⊢ ⟜ ToArray } Take ← 0 _takeDrop Drop ← 1 _takeDrop ShiftCheck←{ "« or »: 𝕩 must have rank at least 1" ! 1≤=𝕩 d←𝕩-○=𝕨 "« or »: 𝕨 must not have higher rank than 𝕩" ! 0≤d "« or »: Rank of 𝕨 must be at least rank of 𝕩 minus 1" ! 1≥d s←1 Cell 𝕩 "« or »: 𝕨 must share 𝕩's major cell shape" ! s MatchS (1-d)↓≢𝕨 1×´s } ShiftBefore←{ c←𝕨 ShiftCheck 𝕩 n←c×(𝕩≤○=⊢)◶1‿≠𝕨 (≢𝕩)⥊n⊸≤◶⟨⊑⟜(Deshape𝕨),-⟜n⊑(⥊𝕩)˙⟩⌜↕c×≠𝕩 } ShiftAfter←{ c←𝕨 ShiftCheck 𝕩 l←c×≠𝕩 n←c×(𝕩≤○=⊢)◶1‿≠𝕨 m←l-n (≢𝕩)⥊m⊸≤◶⟨+⟜n⊑(⥊𝕩)˙,-⟜m⊑(Deshape𝕨)˙⟩⌜↕l } FC←{ # Fill cell "« or »: 𝕩 must have rank at least 1" ! 1≤=𝕩 (Fill 𝕩)⌜ ⥊⟜(↕1×´⊢) 1 Cell 𝕩 } Range←{ I←{"↕𝕩: 𝕩 must consist of natural numbers"!Nat𝕩⋄↕𝕩} M←{"↕𝕩: 𝕩 must be a number or list"!1==𝕩⋄(0⌜𝕩)Fill(<⟨⟩)Pair⊸∾⌜´I⌜𝕩} IsArray◶I‿M 𝕩 } Windows←{ "𝕨↕𝕩: 𝕨 must have rank at most 1" ! 1≥=𝕨 r←≠𝕨↩Deshape 𝕨 𝕨{ "𝕨↕𝕩: Length of 𝕨 must be at most rank of 𝕩" ! r≤=𝕩 "𝕨↕𝕩: 𝕨 must consist of natural numbers" ! ×´Nat⌜𝕨 s←≢𝕩 l←(r↑s)(1+-)¨𝕨 "𝕨↕𝕩: Window length 𝕨 must be at most axis length plus one" ! ×´0⊸≤⌜l k←1×´t←r↓s str ← Reverse ×`⟨k⟩∾s⊏˜{𝕩⊸-⌜↕𝕩}r-1 (⥊𝕩) ⊏˜ k +⌜⟜(t⥊↕)˜⍟(1-=⟜1) l +⌜○(+⌜´str{𝕨⊸×⌜↕𝕩}¨⊢) 𝕨 }_fillBy_⊢⍟(0𝕩)⊑𝕨‿𝕩}) _perv ⌈ ↩ (-∘⌊∘- ⊘ {(𝕨<𝕩)⊑𝕨‿𝕩}) _perv ∧ ← ⍋⊸⊏ ⊘ (× _perv) ∨ ← ⍒⊸⊏ ⊘ ((+-×) _perv) × ↩ (0⊸(<->) ⊘ ×) _perv < ↩ < ⊘ ((1-≥) _perv) > ↩ Merge ⊘ ((1-≤) _perv) ≠ ↩ ≠ ⊘ ((1-=) _perv) = ↩ = ⊘ (= _perv) ≥ ← ("≥: No monadic form"!0˙) ⊘ (≥ _perv) ≤ ↩ ("≤: No monadic form"!0˙) ⊘ (≤ _perv) + ↩ + _perv - ↩ - _perv ¬ ← 1+- ValidateRanks←{ "⎉ or ⚇: 𝔽 result must have rank at most 1" ! 1≥=𝕩 𝕩↩⥊𝕩 "⎉ or ⚇: 𝔽 result must have 1 to 3 elements" ! (1⊸≤∧≤⟜3)≠𝕩 "⎉ or ⚇: 𝔽 result must consist of integers" ! 1∧´Int⌜𝕩 𝕩 } _ranks ← {⟨2⟩⊘⟨1,0⟩ ((⊣-1+|)˜⟜≠⊑⌜<∘⊢) ValidateRanks∘𝔽} _depthOp_←{ neg←0>n←𝕨𝔾_ranks𝕩 ⋄ F←𝔽 _d←{ R←(𝕗+neg)_d 𝕨(×⟜2⊸+´2 Reshape (neg∧𝕗≥0)∨(0⌈𝕗)≥Pair○≡)◶⟨ R _each, R⟜𝕩_table∘⊣, (𝕨R⊢)_table∘⊢, F ⟩𝕩 } 𝕨 n _d 𝕩 } _rankOp_←{ k←𝕨(Pair○= (0≤⊢)◶⟨⌊⟜-,0⌈-⟩¨ 𝔾_ranks)𝕩 Enc←(>⟜0×1+≥⟜=)◶⟨<⊢,EncCell,<_table⊢⟩ > ((0⊑k)Enc𝕨) 𝔽_each ((1-˜≠)⊸⊑k)Enc𝕩 } _repeat_←{ F←𝔽 ⋄ b←𝕨{𝕏⊣}˙⊘{𝕨˙{𝔽𝕏⊣}}0 n←𝕨𝔾𝕩 Multi←{ l←u←0 {"⍟: Repetition numbers in 𝕨𝔾𝕩 must be integers"!Int𝕩⋄l↩l⌊𝕩⋄u↩u⌈𝕩}_perv n i←⟨𝕩⟩⋄P←B⊸{𝕎`i∾↕𝕩} pos←f P u neg←f 0⊸<◶⟨i,Inverse⊸P⟩ -l (|⊑<⟜0⊑pos‿neg˙)_perv n } (Nat n)◶Multi‿{𝕩(B f)∘⊢´↕n} 𝕩 } ↕ ↩ Range ⊘ Windows ⌽ ← Reverse ⊘ (Rot _onAxes_ 0) / ← Indices ⊘ Replicate » ← FC⊸ShiftBefore ⊘ ShiftBefore _fillBy_ (⊢⊘IF) « ← FC⊸ShiftAfter ⊘ ShiftAfter _fillBy_ (⊢⊘IF) GroupM←{ "𝕨⊔𝕩: Compound 𝕨 must be a list" ! 1==𝕨 n←0+´r←=⌜𝕨 "𝕨⊔𝕩: Total rank of 𝕨 must be at most rank of 𝕩" ! n≤=𝕩 ld←(Join≢⌜𝕨)-n↑≢𝕩 "𝕨⊔𝕩: Lengths of 𝕨 must equal to 𝕩, or one more only in a rank-1 component" ! 1∧´(0⊸≤∧≤⟜(r/1=r))ld dr←r⌊(0»+`r)⊏ld∾⟨0⟩ l←dr-˜≠⌜𝕨↩⥊⌜𝕨 ⋄ LS←∾⟜(n Cell 𝕩) Reshape 𝕩˙ S←⊏⟜(LS⟨1×´l⟩) (LS 0⌜𝕨) Fill dr (1≠≠∘⊢)◶⟨S _group○(0⊸⊑), S⌜ ·+⌜⌜´ (⌽×`1»⌽l) × ⊢_group¨⟩ 𝕨 } ↑ ↩ Prefixes ⊘ Take ↓ ↩ Suffixes ⊘ Drop ⊔ ← GroupInds ⊘ GroupGen ⊐ ← SelfClas ⊘ (1 _search) ∊ ← ⊢_self ⊘ (0 _search˜) ⎉ ← _rankOp_ Find←{ r←=𝕨 "⍷𝕩: Rank of 𝕨 cannot exceed rank of 𝕩" ! r≤=𝕩 0 Fill 𝕨 ≡⎉r ((1+r-⊸↑≢𝕩)⌊≢𝕨)⊸↕⎉r 𝕩 }○ToArray ProgressiveIndexOf ← 0 Fill { c←1-˜=𝕨 "⊒: Rank of 𝕨 must be at least 1" ! 0≤c "⊒: Rank of 𝕩 must be at least cell rank of 𝕨" ! c≤=𝕩 𝕨⊐○(Pair¨⟜(≢⥊OccurrenceCount∘⥊) 𝕨⊸⊐)𝕩 } ReorderChk←{ "𝕨⍉𝕩: 𝕨 must have rank at most 1" ! 1≥=𝕨 "𝕨⍉𝕩: Length of 𝕨 must not exceed rank of 𝕩" ! 𝕨≤○≠≢𝕩 "𝕨⍉𝕩: 𝕨 must consist of natural numbers" ! 1∧´Nat⌜⥊𝕨 } ReorderAxesSub←{ (𝕨⊸⊏Pick𝕩˙)⌜↕⌊´⌜𝕨⊔≢𝕩 } _fillBy_ ⊢ ReorderAxes←{ 𝕨 ReorderChk 𝕩 𝕨↩⥊𝕨 r←(=𝕩)-0+´¬∊𝕨 "𝕨⍉𝕩: Skipped result axis" ! 1∧´𝕨∾¯1⊸»⌜𝕩 g←GroupLen j IX 1∧´g≤1 o←/¬g (⍋j∾o)⊏(/≠⌜𝕩)∾¯1⌜o } GroupInv ← { IA 1==𝕨 IA 1∧´Nat⌜𝕨 i←⊔𝕨 IX i≡○(≠⌜)𝕩 i ⍋⊸⊏○∾ 𝕩 } ⊏ ↩ FirstCell ⊘ (ToArray⊸(SelSub _onAxes_ 1)) _fillBy_ ⊢ PrimInverse ← INF _lookup_ ⟨ '+', +⊘(-˜) '-', - '×', ⊢_invChk_×⊘(÷˜) '÷', ÷ '⋆', Log _perv '√', ט⊘(⋆˜) '∧', ⊢_invChk_∧⊘(÷˜) '∨', ⊢_invChk_∨⊘(-˜÷1-⊣) '¬', ¬ '<', {IX IsArray𝕩⋄IX 0==𝕩⋄0⊑⥊𝕩}⊘(IA∘0) '⊢', ⊢ '⊣', ⊢⊘(⊢⊣IX∘≡) '∾', IA∘0 ⊘ {d←𝕩-○=𝕨⋄IX(0⊸≤∧≤⟜1)d⋄l←d◶1‿≠𝕨⋄IX l≤≠𝕩⋄IX 𝕨≡d◶⟨⊏,l⊸↑⟩𝕩⋄l↓𝕩} '≍', {IX 1=≠𝕩⋄⊏𝕩} ⊘ {IX 2=≠𝕩⋄IX 𝕨≡⊏𝕩⋄1⊏𝕩} '↑', ¯1⊸⊑_invChk_↑ ⊘ (IA∘0) '↓', 0⊸⊑_invChk_↓ ⊘ (IA∘0) '↕', ≢_invChk_↕ ⊘ (IA∘0) # Should trace edge and invChk '⌽', ⌽ ⊘ (-⊸⌽) '⍉', TransposeInv ⊘ ReorderAxesInv '/', {IA 1==𝕩⋄IA 1∧´Nat⌜𝕩⋄IX(1∧´¯1⊸↓≤1⊸↓)𝕩⋄GroupLen𝕩}⊘(IA∘0) '⊔', GroupIndsInv ⊘ GroupInv ⟩ SwapInverse ← INF _lookup_ ⟨ '+', ÷⟜2⊘(-˜) '-', IA∘0⊘+ '×', √⊘(÷˜) '÷', IA∘0⊘× '⋆', IA∘0⊘√ '√', IA∘0⊘(÷Log) '∧', √⊘(÷˜) '∨', (¬√∘¬)⊘(-˜÷1-⊣) '¬', IA∘0⊘(+-1˙) ⟩ ⌜ ↩ _table ¨ ↩ _each Mod1Inverse ← INF˙ _lookup_ ⟨ '˜', SwapInverse '¨', {𝕏⁼¨ ⊣·IX 0<≡∘⊢} '⌜', {𝕏⁼⌜⊘(IA∘0) ⊣·IX 0<≡∘⊢} '˘', {(IX∘IsArray⊸⊢𝕏⁼)˘ ⊣·IX 0<=∘⊢} '`', {(⊏∾¯1⊸↓𝕏1⊸↓)⍟(1<≠)⊘(»𝕏⊢)⊣·IX 0<=∘⊢}∘{𝕏⁼¨} ⟩ ⍟ ↩ _repeat_ ⌾ ← _under_ Mod2Inverse ← INF˙ _lookup_ ⟨ '∘', AtopInverse '○', {Fi←𝕎⁼⋄𝕏⁼ Fi⊘(𝕏⊸Fi)} '⌾', {𝕎⁼⌾𝕏} # Need to verify for computation Under '⍟', Int∘⊢◶⟨IA∘0˙,0⊸≤◶{𝕎⍟(-𝕩)_invChk_(𝕎⍟𝕩)}‿{𝕎⍟(-𝕩)}⟩ '⊘', {(𝕎⁼)⊘(𝕏⁼)} '⊸', IsConstant∘⊣ ⊣◶{INF⊘𝕏}‿⊢ {𝕎⊸(𝕏⁼)} '⟜', {(𝕨IsConstant∘⊢◶⟨IA∘0˙,{𝕩𝕎{SwapInverse𝕗}⊢}⟩𝕩)⊘(𝕏⁼𝕎⁼)} ⟩ { inv˙⊸=◶⟨𝔽,{𝕏_inv_𝕎}˙⟩ } ´ ← _fold ˝ ← _insert ⁼ ↩ _undo ˘ ← _cells ⊑ ↩ First ⊘ Pick ◶ ↩ {𝕨((𝕨𝔽𝕩)⊑𝕘){𝔽}𝕩} # Same definition, new Pick ⚇ ← _depthOp_ ⥊ ↩ Deshape ⊘ Reshape ≍ ← >∘Pair _fillBy_ (⊢⊘IF) ⍉ ← Transpose ⊘ ReorderAxes ⊒ ← OccurrenceCount⊘ ProgressiveIndexOf ⍷ ← ∊⊸/ ⊘ Find