#!/usr/bin/env dbqn impl ← " ∧ ← × ∨ ← (+-×) #⌜ # LAYER 3: Remove other limits # Now all implementations are full but ↕ is monadic only Int←IsArray◶⟨⌊⊸=,0⟩ Nat←IsArray◶⟨0⊸≤∧⌊⊸=,0⟩ #⌜ # LAYER 4: Operators Cell ← ↓⟜≢ _ranks ← {⟨2⟩⊘⟨1,0⟩((⊣-1+|)˜⟜≠⊑¨<∘⊢)⥊∘𝔽} _depthOp_←{ neg←0>n←𝕨𝔾_ranks𝕩 ⋄ F←𝔽 _d←{ R←(𝕗+neg)_d 𝕨(2⥊(neg∧𝕗≥0)∨(0⌈𝕗)≥≍○<○≡)◶(⟨R¨⋄R⟜𝕩¨∘⊣⟩≍⟨(𝕨R⊢)¨∘⊢⋄F⟩)𝕩 } 𝕨 n _d 𝕩 } ⚇ ← _depthOp_ #⌜ # LAYER 5: Structural functions _onAxes_←{ F←𝔽 (𝔾<≡)∘⊣◶{ # One axis ! 1≤≠≢𝕩 𝕨F𝕩 }‿{ # Multiple axes ! 1≥≠≢𝕨 ! 𝕨≤○≠≢𝕩 R←{(⊑𝕨)F(1↓𝕨)⊸R˘𝕩}⍟{0<≠𝕨} 𝕨R𝕩 } } Take←{ T←{ ! Int 𝕨 l←≠𝕩 i←(l+1)|¯1⌈l⌊((𝕨<0)×𝕨+l)+↕|𝕨 i⊏∾⟜(1⊸Cell⥊Type)⍟(0∨´l=i)𝕩 } 𝕨 T _onAxes_ 0 (⟨1⟩⥊˜0⌈𝕨-○≠⊢)⊸∾∘≢⊸⥊𝕩 } Prefixes ← {!1≤≠≢𝕩 ⋄ (↕1+≠𝕩)Take¨<𝕩} ↑ ← Prefixes ⊘ Take Windows←{ ! IsArray 𝕩 ! 1≥≠≢𝕨 ! 𝕨≤○≠≢𝕩 ! ∧´Nat¨⥊𝕨 s←(≠𝕨)↑≢𝕩 ! ∧´𝕨≤1+s 𝕨{(∾⟜(𝕨≠⊸↓≢𝕩)∘≢⥊>)<¨⊸⊏⟜𝕩¨s(¬+⌜○↕⊢)⥊𝕨}⍟(0<≠𝕨)𝕩 } Reverse ← {!1≤≠≢𝕩 ⋄ (-↕⊸¬≠𝕩)⊏𝕩} Rotate ← {!Int𝕨 ⋄ l←≠𝕩⋄(l|𝕨+↕l)⊏𝕩} _onAxes_ 0 ↕ ↩ ↕ ⊘ Windows ⌽ ← Reverse ⊘ Rotate #⌜ # LAYER 6: Everything else Join←{ C←(<⟨⟩)⥊⊸∾⌜´⊢ # Cartesian array product ! IsArray 𝕩 s←≢¨𝕩 d←≠⊑s ! ∧´⥊d=≠¨s ! d≥≠≢𝕩 l←(≢𝕩){(𝕩⊑⟜≢a⊑˜(j=𝕩)⊸×)¨↕𝕨}¨j←↕r←≠≢a←𝕩 ! (r↑¨s)≡C l i←C{p←+´¨↑𝕩⋄(↕⊑⌽p)-𝕩/¯1↓p}¨l >i<¨⊸⊏¨l/𝕩 }⍟(0<≠∘⥊) Group←{ ! IsArray 𝕩 Chk←{!1=≠≢𝕩⋄!∧´Int¨𝕩⋄!∧´¯1≤𝕩⋄≠𝕩} l←(1<≡)◶Chk‿{!1=≠≢𝕩⋄Chk¨𝕩}𝕨 ! l≤○≠≢𝕩 ! ∧´l=l≠⊸↑≢𝕩 (𝕨⊸=/𝕩˜)¨↕1+¯1⌈´⚇1𝕨 } ∾ ↩ Join ⊘ ∾ ⊔ ← Group⟜(↕≠⚇1) ⊘ Group # Searching IndexOf←{ c←1-˜≠≢𝕨 ! 0≤c 𝕨 (0<≠𝕨)◶⟨0⎉c∘⊢,((+´<˘)∧`)≢⎉c⎉c‿∞⟩ 𝕩 } UniqueMask←{ ! 1≤≠≢𝕩 u←0↑𝕩 {(≠u)>⊑u IndexOf 𝕩}◶{u↩u∾𝕩⋄1}‿0˘𝕩 } Find←{ r←≠s←≢𝕨 ! r≤≠≢𝕩 𝕨 ≡⎉r s ↕⎉r 𝕩 } ⊐ ← !∘0 ⊘ IndexOf ∊ ← UniqueMask ⊘ (⊐˜<≠∘⊢) ⍷ ← ∊⊸/ ⊘ Find ReorderAxes←{ 𝕩↩<⍟(0=≡)𝕩 ! 1≥≠≢𝕨 𝕨↩⥊𝕨 ! 𝕨≤○≠≢𝕩 ! ∧´Nat¨⥊𝕨 r←(≠≢𝕩)-+´¬∊𝕨 ! ∧´𝕨-<)𝕩 # Assume they're numbers }‿{ # At least one array e←𝕨-˜○(0∨´0=≢)𝕩 𝕨(e=0)◶e‿{ c←𝕨×∘-○(IsArray+≠∘≢)𝕩 s←≢𝕨 ⋄ t←≢𝕩 ⋄ r←s⌊○≠t l←s{i←+´∧`𝕨=𝕩⋄m←1×´i↑𝕨⋄{c↩×-´𝕩⋄m↩m×⌊´𝕩}∘(⊑¨⟜𝕨‿𝕩)⍟(r⊸>)i⋄m}○(r↑⌽)t a←⥊𝕨⋄b←⥊𝕩 Trav←(=⟜l)◶{Trav∘(1+𝕩)⍟(0⊸=)a Cmp○(𝕩⊸⊑)b}‿c Trav 0 }𝕩 } _grade←{ ! 1≤≠≢𝕩 i⊐˜+´˘((2⥊≠𝕩)⥊𝔽⎉∞‿¯1⎉¯1‿∞˜𝕩)(⌈⟜0+=⟜0⊸×)>⌜˜i←↕≠𝕩 } _bins←{ r←1-˜≠≢𝕨 ! 0≤r LE←0≤𝔽⎉r ! (0<≠)◶⟨1,∧´·LE´˘2↕<˘⟩𝕩 +´𝕨LE⎉¯1‿∞𝕩 } OccurrenceCount ← ⊐˜(⊢-⊏)⍋∘⍋ ProgressiveIndexOf ← {𝕨⊐○(≍˘⟜OccurrenceCount𝕨⊸⊐)𝕩} ⍋ ← Cmp _grade ⊘ ( Cmp _bins) ⍒ ← -∘Cmp _grade ⊘ (-∘Cmp _bins) ∧ ↩ ⍋⊸⊏ ⊘ ∧ ∨ ↩ ⍒⊸⊏ ⊘ ∨ ⊒ ← OccurrenceCount⊘ ProgressiveIndexOf " X←Raw←{≤4} { chrs←⟨ "!∧∨∾↑↕⌽⍉⍋⍒⊐⊒∊⍷⊔" "" "⚇" ⟩ nc ← ≠¨chrs chr ← ∾chrs itr ← 0⥊˜≠chr init ← " "⊸∾¨(/⟜"_"¨nc/0‿1‿1)∾¨(nc/"FMD")∾¨(nc+´⊸↑⥊"AB"∾⌜•a) post ← ∾⟜" "¨/⟜"_"¨nc/0‿0‿1 names ← init∾¨(•UCS 48)∾¨post Inc ← { i←⊑chr⊐𝕩 n←0 ⋄ itr↩{n↩1+𝕩}⌾(i⊑⊢)itr names↩((i⊑init)∾(•UCS 48+n)∾i⊑post)⌾(i⊑⊢)names } # starting built-ins inps←⟨"𝕨 ","𝕨,𝕗","𝕨,𝕘"⟩ ⍎¨names∾¨(nc/("←{⟨"∾∾⟜"⟩ ⋄ ⍎""Using undefined built-in ")¨inps)∾¨∾⟜"""}"¨chr # built-in assumptions Mod ← ⍎{𝔽 ((⊑chr⊐𝕨)⊑names) ∾ " ↩ " ∾ 𝕩} ⍎"IsArray ← 0≠≡" ⍎"Type ← ⟨⟩⥊0⊸⥊" '!' Mod "{𝕩 ⋄ ≤1}⍟¬" '↕' Mod "↕" '∾' Mod "∾" # checks if line is a builtin redefinition E_isdef ← (3≤≠)◶⟨0,∧´⟨chr," ","←↩"⟩∊˜¨3⊸↑⟩ # removes comments and replaces built-ins with names E_proc ← { l←≠chr q←≠`𝕩∊"""'" ⋄ f←¬∨`q¬⊸∧𝕩='#' ∾ (((l×f/q)+chr⊸⊐) (≥⟜l)◶⟨⊑⟜names,⥊∘⊢⟩¨ ⊢) f/𝕩 } E_redef ← { # handles [fmd] [←↩] tail ← E_proc 3↓𝕩 # must use old def Inc ⊑𝕩 (E_proc 1↑𝕩) ∾ "←" ∾ tail } lf ← •UCS 10 pre ← E_isdef◶E_proc‿E_redef¨ lf((⊢-˜¬×+`)∘=⊔⊢)impl Raw↩⍎ ExecFile←{Raw ∾ ∾⟜lf¨ E_proc¨ •LNS 𝕩} X↩Raw∘E_proc ⍎ ∾ ∾⟜lf¨ pre ≠◶X‿{ExecFile ⊑𝕩}‿{ExecFile ⊑𝕩 ⋄ X 1⊑𝕩} •args }0