Abhishek Saha
Abhishek Saha

Reputation: 2564

Optimized Logic to find high score

Basically this is related to a squash application where we have 2 scores. One is from winner point of view and another from loser point of view.

eg. Score1: 11-5,11-5,11-5 (Winner point of view) Score2: 5-11, 5-11,5-11 (Loser point of view)

Now in my logic i want to find which is the winner score and which is the loser score.

I have written my logic in the below way and it does work. But i want to know if their is any other better/optimized way of writing this.

$high1 = 0;
$high2 = 0;

$score1 = "2-11,5-11,4-11,4-4";
$score2 = "11-2,11-5,11-4,4-4";

$score1Array = explode(",",$score1);

$size = sizeof($score1Array);

for($i = 0; $i < $size; $i++) {

$checkscore1 = explode("-",$score1Array[$i]);


if($checkscore1[0] < $checkscore1[1]) {

    $high1++;

}else if($checkscore1[0] > $checkscore1[1]) {

    $high2++;

}


}

if($high1 > $high2) {

$winningScore = $score2;
$losingScore = $score1;
}else{

$winningScore = $score1;
$losingScore = $score2;
}

echo $winningscore;
echo $losingscore;

Upvotes: 0

Views: 107

Answers (4)

xfx
xfx

Reputation: 1948

for Winner point of view, all big score in left,otherwise in right. so u can just detect the first score.

$score1Array = explode(",",$score1);
$checkscore1 = explode("-",$score1Array[$i]);
if($checkscore1[0] < $checkscore1[1]) {
    echo $score2;
    echo $score1;
}else{
    echo $score1;
    echo $score2;
}

Fix: above code is wrong,try this:

$score1value = eval(str_replace(",","+",$score1));
$score2value = eval(str_replace(",","+",$score2));

if($score1value < $score2value) {
    echo $score2;
    echo $score1;
}else{
    echo $score1;
    echo $score2;
}

Upvotes: 0

fenz kurol
fenz kurol

Reputation: 113

you can use this :

<?php
$high1 = 0;
$high2 = 0;

$score1 = "2-11,5-11,4-11,4-4";
$score2 = "11-2,11-5,11-4,4-4";

$explode = explode(",",$score1);


for($i=0;$i<  sizeof($explode);$i++){
    $explode2= explode("-", $explode[$i]);
    if($explode2[0] <= $explode2[1]){
        echo $explode2[0]."-";
        echo $explode2[1]." ";
    }

}
echo "<br />";
for($i=0;$i<  sizeof($explode);$i++){
    $explode2= explode("-", $explode[$i]);
    if($explode2[1] >= $explode2[0]){
        echo $explode2[1]."-";
        echo $explode2[0]." ";
    }

}

?>

Upvotes: 0

air4x
air4x

Reputation: 5683

This should work

$score1 = "2-11,5-11,4-11,4-4";
$score2 = "11-2,11-5,11-4,4-4";
$l = $r = 0;

$score1_sets_arr = explode(',', $score1);
foreach ($score1_sets_arr as $set_score) {
  $set_score_arr = explode('-', $set_score);
  if ($set_score_arr[0] > $set_score_arr[1]) {
    $l++;
  } else {
    $r++;
  }
}

if ($l > $r) {
  $winning_score = $score1;
  $losing_score  = $score2;
} else {
  $winning_score = $score2;
  $losing_score  = $score1;
}

Upvotes: 0

Erik
Erik

Reputation: 2264

What about something like this:

function is_winning($score) {

  $split_scores = preg_split('/(-|,)/', $score);
  $wins = $losses = 0;

  for($i = 0; $i < count($split_scores) / 2; $i += 2) {
    if($split_scores[$i] > $split_scores[$i + 1])
      $wins++;
    if($split_scores[$i] < $split_scores[$i + 1])
      $losses++;
  }

  return $wins > $losses;

}

Assuming $score is formatted as in your question. You can then use it like this:

$score1 = "2-11,5-11,4-11,4-4";
$score2 = "11-2,11-5,11-4,4-4";

if(is_winning($score1)) {
  $winning_score = $score1;
  $losing_score = $score2;
} else {
  $winning_score = $score2;
  $losing_score = $score1;
}

echo $winning_score;
echo $losing_score;

The idea is to split the score into an array where the even numbered indexes have the left score and the odd numbered indexes the right score. We then count the number of wins and the number of losses. If there's more wins then losses then we return true since the score was a winning score. If there's not more wins then losses we simply return false.

Upvotes: 1

Related Questions