Latest Articles
 by awuehr on 11-10-2008 in Tips & Tricks by Village Idiot on 11-04-2008 in Classes & Objects by codefreek on 10-23-2008 in Basic by wiifanatic on 09-12-2008 in Security & Permissions by drewbee on 07-03-2008 in Tips & Tricks
 IRC Channel
 Join the friendly bunch on IRC... (#TalkPHP on Freenode) ...Also available via a web interface. See this thread for information on the TalkPHP Free Hugs Initiative™. Subject to availability.
 Associates
 Associates
 TalkPHP » Calculating an unknown variable
 05-18-2008, 09:54 PM #1 (permalink) The Frequenter     Join Date: Nov 2007 Location: Netherlands Posts: 460 Thanks: 49 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) Round 7 :: 1 (cookie?) 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? :) __________________ "Life is a bitch, take that bitch on a ride"
 05-19-2008, 12:31 PM #2 (permalink) Moderateur          Join Date: Apr 2007 Posts: 1,393 Thanks: 5 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  ```
 05-19-2008, 02:32 PM #3 (permalink) The Frequenter     Join Date: Nov 2007 Location: Netherlands Posts: 460 Thanks: 49 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? __________________ "Life is a bitch, take that bitch on a ride"
 05-19-2008, 09:06 PM #4 (permalink) Moderateur          Join Date: Apr 2007 Posts: 1,393 Thanks: 5 I think you must have copy/pasted incorrectly and/or altered something because `log(64, 2)` is `6`, fact. :)
The Frequenter

Join Date: Nov 2007
Location: Netherlands
Posts: 460
Thanks: 49

Quote:
 Originally Posted by Salathe 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
__________________
"Life is a bitch, take that bitch on a ride"

 05-20-2008, 12:08 AM #6 (permalink) Moderateur          Join Date: Apr 2007 Posts: 1,393 Thanks: 5 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.
 05-20-2008, 04:47 PM #7 (permalink) The Frequenter     Join Date: Nov 2007 Location: Netherlands Posts: 460 Thanks: 49 Worked like a charm Salathe. Thanks a loOot. __________________ "Life is a bitch, take that bitch on a ride"

 Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)