cancel
Showing results for 
Search instead for 
Did you mean: 
megan_mcp
Moderator Moderator
Moderator

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 there’s 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)

 

 

 

5 Comments
mnolan
New Contributor
New Contributor

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

 

megan_mcp
Moderator Moderator
Moderator

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

SJT
Valued Contributor

 

q)list1:4 7 9 7 2 8 9
q)ru:@[;1] desc distinct::  /runner-up
q)ru list1
8

 

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.

fbodon
New Contributor II
New Contributor II

@SJT What is the recommended way to chain unary functions? Both  @ and :: do the job, but I thought the former is recommended.

SJT
Valued Contributor

Nicely timed question! I’m just up to the chapter on composition in the book I’m 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.) 

Contributors