Skip to content

Instantly share code, notes, and snippets.

@abrudz abrudz/TAO.dyalog
Created Dec 7, 2017

Embed
What would you like to do?
Sorting and grading any Dyalog APL array.
Sort{⎕ML1 Total array ordering (TAO) comparison.
acmp{ array comparison.
/:¯1 match: equal.
~/¨: xrnk ranks differ: reshape with 1-axes.
⊃⊃/:1 prefixes precede their continuations.
⊃⊃/:0 continuations follow their prefixes.
~/¨: xshp shapes differ: stretch with fills.
0=×/:¨ null: comparison of proto items.
~¨: halves,¨ non-atomic: item-wise comparison.
comparison of atomic items:
typestype¨ item types: char, number, ...
/types:/types types differ: compare.
3.=types: fixor¨ ⎕ORs: comparison of fixed items.
1.=types:ncmp simple numbs: comparison.
0.=types:/ simple chars: ⍋-style comparison.
comparison of refs:
/ot.⎕WG'Type': ot object-type mismatch: order on types
/¨⍺⍺: ⍺⍺¨⍺⍺ cycles in both: cycle lengths (NN).
unms.(~' '¨⎕NL10) user-supplied names.
ucls.⎕NC¨unms and their name-classes.
uvls valu¨¨unms value of each symbol in each space.
ucmpzip¨zip unms ucls uvls name/class/value triples.
scmp.(⎕CT ⎕DIV ⎕IO ⎕ML ⎕PP ⎕RL ⎕RTL) system variable values.
pcmp.(⎕WG¨⎕WG'PropList') property values.
(⍺⍺¨)∇∇ zip ucmp scmp pcmp cmp of user-vals; sysvars; props.
}
xshp{ stretch arrays of differing shape.
shp/¨ new shape
pad{@()0} padding of ref-array(s)
16::zip(shppad¨)(¨) nonce: can't over-take ref array <V>
newshp¨ extended arrays.
zip new(¨) (⍺ shp)(⍵ shp)
}
xrnk{ stretch arrays of differing rank.
rnk/¨ new rank.
onesrnk1 sufficient 1-padding.
shps(-rnk)¨ones,¨ new shapes.
ors{1 ()()}¨ must enclose ⎕or for reshape.
newshps¨ors{()}¨ extended arrays.
zip new(¨) (⍺ rnk)(⍵ rnk)
}
type{ types of depth-0 items:
1 0(),⍴⍴:3 ⎕OR: 3
9=⎕NC'':2 ref: 2
0=0 num: 1, char: 0
}
ncmp{ comparison of numbers.
0>(9 11-/)~0 real part trumps imaginary part.
}
fixor{ fix of ⎕OR item in tmp space.
11::⎕NS ⎕OR of namespace.
⎕NR(⎕NS'').⎕FX ⎕OR of fn/op.
}
valu{ referent value of name ⍺.⍵.
'':'' ignore null name.
3 4.=.⎕NC :.⎕NR fn/op: nested rep.
. var or ref: value.
}
zip{} items interleaved.
halves{ compare vector halves.
n()÷2 half-way point.
n=0:⍺⍺¨ compare single items
¯1c⍺⍺ n¨:c first halves differ: done.
⍺⍺ n¨ comparison of second halves.
}
| acmp ⍺≤⍵
}{ quicksort.
1: single item or null: done.
head tail(1)(1) first and remaining items.
le gt1 0=tail ⍺⍺¨head comparison with first item.
( le/tail),head, gt/tail sorted vector.
}
GradeUp{|/Sort { }¨}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.