This is more of an expanding list of Q idioms I have had to either assemble or remember or some combination.

- Cross product of two lists is faster in table form

q)show x:til 3

0 1 2

q)show y:2#7

7 7

q)x cross y

0 7

0 7

1 7

1 7

2 7

2 7

q) ([] x) cross ([] y)

x y

—

0 7

0 7

1 7

1 7

2 7

2 7

\t til[1000] cross 1000#5

85

\t flip value flip ([] til 1000) cross ([] x1:1000#5)

33

/and if you are happy working with it in table form

\t ([] til 1000) cross ([] x1:1000#5)

5

- Take last N observations for a column in a tableBoth of these can be used to create a list of indexes and the columns can be simply projected on to the list of indexes

/a) Intuitive way take last n from c

q) N:10; C:til 100000;

q) {[n;c]c{y-x}[til n] each til count c}[N;C] /timing 31 milli

0

1 0

2 1 0

3 2 1 0

4 3 2 1 0

….

/b) Faster way using xprev and flip

q) \t {[n;c] flip (1+til n) xprev \\: c}[10;c] /timing 9 millesec

- Create a Polynomial Function from the coefficients

poly:{[x] (‘)[wsum[x;];xexp/:[;til count x]]};

f:poly 0 1 2 3;

f til 5

0 6 34 102 228

- Count Non Null entries

All in K:

fastest:{(#x)-+/^x}

slower:{+/~^x}

slowest:{#*=^x}

Q translation:

fastest:{count[x]-sum null x}

slower:{sum not null x}

slowest:{count first group null x}

- Camel case char separated symbols:

camelCase:{[r;c]`$ssr[;r;””] each @'[h;i;:;]upper h @’ i:1+ss'[;r] h:string x}

most common case

q)c:` sv/: `a`b cross `e`fff`ggk cross `r`f

`a.e.r`a.e.f`a.fff.r`a.fff.f`a.ggk.r`a.ggk.f`b.e.r`b.e.f`b.fff.r`b.fff.f`b.ggk.r`b.ggk.f

camelCase[“.”;c]

`aER`aEF`aFffR`aFffF`aGgkR`aGgkF`bER`bEF`bFffR`bFffF`bGgkR`bGgkF

6. Progress style bars:

p:0;do[10; p+:1; system “sleep .1”;1 “\r “,p#”#”];-1 “”;

{[p]1 “\r “,(a#”#”),((75-a:7h$75*p%100)#” “),string[p],”%”;if[p=100;-1 “”;]}

7. AutoCorr:

autocorr:{x%first x:x{(y#x)$neg[y]#x}/:c-til c:count x-:avg x}

8. Index of distinct elements:

idistinct:{first each group x}