in reply to Re^2: alternatives to if and series of elsif
in thread alternatives to if and series of elsif

Because my original version of the algorithm was wrong, that's why! :) I've fixed it. I don't know if it is any clearer. The basic idea is that the tests for points and quota are not independent; they follow the form:

$points > 2000*X && $quota < 15+X
for some integer 0 < X < 10. One can eliminate the redundancy between these two tests. Algebraically, the above is equivalent to
$points/2000 > X && X > $quota-15
...which can be further reduced to
$points/2000 + 15 > $quota
...except that there are edge cases (basically, X must be an integer strictly between 0 and 10) which make the algorithm a bit more complex.

Specifically, the last pair of inequalities can be written as

ceil( $points/2000 ) > X && X > $quota - 15
but since X is an integer, we can write
ceil( $points/2000 ) - 1 >= X && X > $quota - 15
Now we can eliminate the X:
( ceil( $points/2000 ) - 1 ) + 15 > $quota
This manipulation takes care of enforcing the constraint that X must be an integer.

Lastly, to take care of the limits on X, we use min and max. The final test is then:

max( min( 24, ( ceil( $points/2000 ) - 1 ) + 15 ), 15 ) > $quota

the lowliest monk

Replies are listed 'Best First'.
Re^4: alternatives to if and series of elsif
by kiat (Vicar) on Jul 03, 2005 at 15:56 UTC
    Great thanks, tlm!

    Now I understand how you got rid of $points > 2000. I was wondering how $new > $quota took care of everything.

    I ran gsiems's against your original version and it says "looks ok". Then then I tried to understand how your code works and that got me wondering about $new > $quota being a sufficient test.

    Cheers and thanks once again :)