2005-12-05

Hello, J World

Just a week ago I was given a link to dr_klm's article «Programming language J, the introduction»... At the same time appeared a problem easy enough to be written in the newly learned language and, besides, seemed very suitable for J.

The problem.

N teams are playing «What? Where? When?» game. The game usually consists of 25 questions. Each team can give wrong or correct answer. It is required to summarize, that can be done in different ways.

The formal rules. The amount of correct answers is counted for each team. The maximum sum is set to the 100 points. Each team receives points in proportion to the number of given correct answers.

The informal version. We think, it is unfair that the question cost does not depend on its complexity. The more teams gives the right answer for a question, the less scores each of them should receive for it. The simplest case - if only one team has the right answer, then it receives one point. If all the teams answered correctly then the question cost is 0 points. So, it should be the linear approximation between these two points. Then points are added up and normalized at 100, as usual.

The Implementation.

First go I'd like to generate a matrix that best matches the final table of the tournament: rows — questions, columns — teams. The table is filled with ones and zeros depending on how the team answered to this question.

Not that soon, the following line was born:
L=: 2 (>?) 36 25$ 5


Now L is the result of a game, consisting of 25 questions and containing 36 teams. A team can give a correct answer with probability 2/5.

The official results are getting on-the-fly:

Add up:
res:=+/"1


Find the maximum and normalize:
norm=:*&100@%>./


Use:
norm res L


In the informal case the operators of the normalization and of the counting results remain the same, but they must act on the matrix where the question cost is no longer «1». In the case of the linear approximation described above, we have the following simple formula:



n-x
Cost= ------
n-1


where n is number or teams and x is amount of correct answers for the given question.

So:
fairq=:*"1.(#-+/)%(#-1:)


Try this:
norm res fairq L


.... Well, in the case of equal distribution the difference is very unnoticable :)


Finally

The program with the comments is no longer then the problem description itself. If to be honest, I was lazy to write it in Fortran-like language (C, Java, Php...). In the case of J the coding almost was not behind the flight of thougth. I had no time for boring :).

Ranks are really something! H'm... I'm curious, whether they can be beautifully realized in Lisp syntax?

It turned out that participles, forks and hooks have nothing in common with macroses. It is easy to understand by executing several times
#~?100

A couple will be always consist of equal numbers. That's why the only way to create a matrix, filled with random elements, is to use inner property of the operator itself?

Yet, I can fink of no beautiful operator generates a random matrix filled with zeros and ones. It would be something a-la
createL 39 25;<2 5

But the introduction of unpacking operator and operator of access to the list elements is complicating the initial simple formula
p (>?) x y $ q


Working in the Interpreter is very convinient in case of input pure functional definitions. But let's do so:
p=:2
powP=.^&2

After changing p you have to run the whole program from the start. Actually, compilable languages do so.

After typing a formula in the Interpreter it was not so easy to give it a name. In 'norm' and 'fairq' definitions there are «redundant» dots and 'at' signs (@), which are unnecessary when writing an operatior explicitly.

In general, the language is very cool. I finish reading «Easy J». Proceed to «J for C Programmers».

No comments:

Post a Comment