Challenge 3 The Runner-Up

https://learninghub.kx.com/forums/topic/challenge-3-the-runner-up

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.

Here’s my approach:

 

q)list1: (4;7;9;7;2;8;9) 
q)list1: asc list1 
q)list1 `s#
2 4 7 7 8 9 9 
q)list2:list1 except max list1 
q)runner_up:max list2 
q)runner_up 
8

 

Also a solution in python:

n = 5

arr = [2,3,6,6,5]

outmax = min(arr)

for i in range(len(arr)): if outmax < arr[i] and arr[i] != max(arr): outmax = arr[i]

print(outmax)

 

 

 

Indexing into the descending sorted list of distinct scores works pretty well ok

 

q)f:{desc[distinct x]1}
q)l:4 7 9 7 2 8 9
q)f[l]
8

 

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

 

does this take the second distinct number in the list? If so, thanks! I really like that approach