TalkPHP (http://www.talkphp.com/forums.php)
-   General (http://www.talkphp.com/general/)
-   -   Calculating an unknown variable (http://www.talkphp.com/general/2820-calculating-unknown-variable.html)

 ReSpawN 05-18-2008 09:54 PM

Calculating an unknown variable

Dear PHPers,

I'm currently developing a cupsystem for a new gaming ladder called "ClanFight". Now, I hit a snag.

I am trying to determine how many brackets should be played before the end is 'near', so to speak. For example:

PHP Code:

``` \$totalPlayers = 64;\$totalBrackets = \$totalPlayers * 2 - 1; /* 128 minus 1, 127th is the winner */  ```
Now, of course I know that we have to play:
64 players, remainder 32, remainder 16, remainder 8, remainder 4, remainder 2, winner 1. A total of 127 brackets (64 + 32 + 16 + 8 + 4 + 2 + 1 = 127).
Now, this means, that there will be played 7 ROUNDS.
Round 1 :: 64 (32 matches, 32 dropouts)
Round 2 :: 32 (16 matches, 16 dropouts)
Round 3 :: 16 (8 matches, 8 dropouts)
Round 4 :: 8 (4 matches, 2 dropouts)
Round 5 :: 4 (2 matches, 2 dropouts
Round 6 :: 2 (1 match, 1 winner)

Anyhow, this all looks rather simple because we can calculate the yet unknown variable. We know by seeing the nummers 64 to 1, that 7 rounds are played, with the 7th round being the winner. So most fairly, you could say 6 rounds with the result 1 winner. Either way. I rather have it displayed in 6 rounds though, because the 6th round, 1 on1 will spit out the winner anyway.

Now, how am I supposed to calculate it? 8 players requires 3 rounds. (8 - 4 - 2 (- 1)) So how am I supposed to draw from 8, 3 and from 64, 6.

64 / 8 = 8 - 2 = 6... But that doesn't work on the 8 players.
8 / 8 = 0 - 2 = -2...

I am still ignorant to this variable or calculationmethod. Perhaps you guys could take a crack at it.

The total players will increase to 512 players total, 1023 brackets with A LOT of ROUNDS. :)

Help? :)

 Salathe 05-19-2008 12:31 PM

To find the number of rounds from players, it looks like you could use the `log2` value. In PHP we don't have this function available (though it is in C) but we do have a more general `log` function which can take a variable base value and for our purposes that base should be 2.

To quote the PHP Manual page:
`float log ( float \$arg [, float \$base ] )`

If the optional base parameter is specified, log() returns logbase arg , otherwise log() returns the natural logarithm of arg.
In practice, we can use it like so:
PHP Code:

``` \$players  = 64; \$brackets = (\$players * 2) - 1;     // 127 \$rounds   = (int) log(\$players, 2); // 6  ```

 ReSpawN 05-19-2008 02:32 PM

I must say, I didn't know that there was a function like that. However, the code you supplied displays 5 instead of 6. :)

Perhaps any other methods you care to try out?

 Salathe 05-19-2008 09:06 PM

I think you must have copy/pasted incorrectly and/or altered something because `log(64, 2)` is `6`, fact. :)

 ReSpawN 05-19-2008 09:21 PM

Quote:
 Originally Posted by Salathe (Post 14742) I think you must have copy/pasted incorrectly and/or altered something because `log(64, 2)` is `6`, fact. :)
I'm not kidding. :) It seriously returns 5. :) Running version 5.2.4.

http://markernst.eu/clanfight/test.php

 Salathe 05-20-2008 12:08 AM

OK, looks like there may be a rounding problem on your machine or version of PHP (mine's 5.2.5). Simply round the value rather than casting it to integer.

`\$rounds = round(log(\$players, 2)); // 6`

As a fun check try: `echo (int) 5.999999999999999;` that's what PHP might be seeing rather than 6 as we expect.

 ReSpawN 05-20-2008 04:47 PM

Worked like a charm Salathe. Thanks a loOot.

 All times are GMT. The time now is 09:19 AM.