Thanks again to everyone who takes the time to interact / comment on these challenges, it really does benefit my knowledge of the q language!
My next challenge is a simpler one, but I know theres lots of different ways to solve it.
Given the participants’ score sheet for your University Sports Day, you are required to find the runner-up score. You are given n scores. Store them in a list and find the score of the runner-up.
EDIT: type and scale can matter here when looking for the best option. A version of the original suggestion outperforms mine in a lot of cases
q)f1:{max x except max x} // original suggested solution
q)f2:{desc[distinct x]1}
q)l:4 7 9 7 2 8 9
q)\t:10000 f1 l
9
q)\t:10000 f2 l
16
q)longs:100000?100 //scale up
q)\t:100 f1 longs
38
q)\t:100 f2 longs //lots of duplicates gives the "distinct" solution an advantage
19
q)floats:100000?100f // change type to float
q)\t:100 f1 floats
392
q)\t:100 f2 floats //advantage disappears when there are few duplicate entries
707
Using general list notation (items separated by semicolons and embraced by parentheses) suggests a list is general; better to write a vector as a vector literal.
Composition ru is a sequence of three unaries. In evaluation order: select the distinct items; sort descending; select second item.
Nicely timed question! Im just up to the chapter on composition in the book Im writing, Vector Programming in Q, and I need to settle a few questions about it myself. For example, is there ever a reason to prefer Compose to a train suffixed by @ or ::?
Nick Psaris commented recently that he favours :: because it composes directly rather than forming a projection. (I doubt the evaluation overhead is significant, but I get the point.)