/ https://code.kx.com/trac/wiki/QforMortals2/primitive_operations / https://code.kx.com/trac/wiki/QforMortals2/built_in_functions / This file contains basic operations and how to do them in q / I strongly recommend that / you try these one line at a time in the interpreter. / It will help you internalize frequently used operators and adverbs / Arithmetic: 5 * 6 / scalar mult (5 6 7) * 3 / vector * scalar mult (5 6 7) * (1 2 3) / vector mult -- arguments must be the same length (5 6 7) % (1 2 3) / vector division -- note that division is % / Generating data til 10 / whole numbers from 0 to 9 5 + til 10 / generate first and then add 5 to each element 10 ? 20 / 10 numbers drawn from 20 at random with replacement (-10) ? 20 / 10 numbers drawn from 20 at random without replacement 10 ? 06:00:00 / 10 random times over 6 hours 10 ? `a`bbb`c / 10 random symbols from `a `bbb `c / starting at a random seed determined by current time t: ltime .z.p / current datetime locally millis: `int$t.time / milliseconds x: (millis mod 767) ? 20 / Now can use a random number as you like possiblestocks: `ibm`hp`aapl`goog first 1 ? possiblestocks / arrays and lists x: 12 ? 06:00:00 y: 12 ? 300 z: x,y / two lists can be concatenated together x[2 4] / lists can be indexed like arrays z[4 18 15] / index lists even of mixed types m: max y y ? m / find index of max element in y y[y ? m] / just checking that we've found the max x[y ? m] / find time corresponding to index of max element of y asc x / sort a list iasc x / find the permutation that would give the sort x[iasc x] / net effect is to sort x y[iasc x] / net effect is to sort y based on ordering of x (asc x),'(y[iasc x]) / concatenate pairs in order sum y sums y / running sums sums y[iasc x] x[where y > 175] / indexes in x give selection in y sums y[where x > 02:00:00] / notice how operators go from right to left / unless there are parens z: 50 ? 8 / 50 numbers with replacement from 0 through 7 inclusive g: group z / group them key g value g (key g),'(count each value g) / find greatest index of each key value / string manipulation s: "i am a string." s[11] / index into the string s[0 4 6] / multiple indexes into the string s,s / concatenate strings s,\: "&" / append blank to each character in s and get many lists s,\: "1 2 3" / append several numbers after each character in s raze s,\: " " / append blank to each character in s and then put lists together raze (" "),/: s / figure out how this is different from previous s ss " a" / looking for indexes of space followed by a s like "*rin*" / does the string "rin" exist anywhere? ssr[s;"trin";"un"] / replace trin by un in s / basic functions / indent the name and outdent the other lines / semi-colon after each line except the last one / return value preceded by colon (:) foo:{[a;z] x: a+2*z; / semi-colon after each line if[a < z; :x]; / return value preceded by colon; use of if i: 0; while[i < 10; x: x+5; / add 5 to x i+: 1; ]; x} / last line doesn't need a semi-colon foo[5;10] foo[10;5] foopair:{[mypair] foo[mypair[0]; mypair[1]]} x: 5 ? 10 y: 10 + 5 ? 20 x,'y / pairwise each is just a ' foopair each x,'y / single argument each (monadic) is the word "each" x,/:\:y / cross-product raze x,/:\:y / cross-product all at top level foopair each raze x,/:\:y / try to figure out what is going on / Matrix multiply m1: (1 2 3; 4 5 6; 7 8 9) m2: (10 20; 30 40; 50 60) m1[0] m2[;1] / column value dotprod:{[x;y] sum x * y} mymatmult: {[m1;m2] m1 dotprod/:\: flip m2}