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:
for some integer 0 < X < 10. One can eliminate the redundancy between these two tests. Algebraically, the above is equivalent to$points > 2000*X && $quota < 15+X
...which can be further reduced to$points/2000 > X && X > $quota-15
...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.$points/2000 + 15 > $quota
Specifically, the last pair of inequalities can be written as
but since X is an integer, we can writeceil( $points/2000 ) > X && X > $quota - 15
Now we can eliminate the X:ceil( $points/2000 ) - 1 >= X && X > $quota - 15
This manipulation takes care of enforcing the constraint that X must be an integer.( ceil( $points/2000 ) - 1 ) + 15 > $quota
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
In reply to Re^3: alternatives to if and series of elsif
by tlm
in thread alternatives to if and series of elsif
by kiat
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |