ช่วย optimize code ด้วยครับ

สำหรับผู้ที่ เริ่มต้น Programming - PHP มีอะไร แนะนำ หรือข้อสงสัยต้องบอร์ด นี้ คนที่มีความรู้ แบ่งปันคนอื่นบ้างนะ ปัญหาการเขียนโปรแกรม แบบ OOP Session Cookies php network

Moderators: mindphp, ผู้ดูแลกระดาน

User avatar
retool2
PHP Newbie
PHP Newbie
Posts: 4
Joined: 01/01/1970 7:00 am

ช่วย optimize code ด้วยครับ

Post by retool2 » 11/02/2009 3:17 pm

code เป็นการแก้ปัญหาเกมส์ครับ
โดยหุ่นวิ่งหลบระเบิด ผมเขียนให้รับ input ได้ทั้ง GET และ form input
โดยจะมีสนามระเบิดอยู่( FVterrainString) ค่า X เป็นระเบิดค่า . เป็นช่องว่าง
และค่าความกว้างยาวของสนาม( FVboardX & FVboardY)
และมีคำสั่งที่ต้องใส่ในหุ่นเป็นค่าสูงสุดกับต่ำสุด ( FVinsMax & FVinsMin)
หุ่นเดินได้แต่ ขวา และ ลง เท่านั้น(ใน code แทนขวาด้วย 0 แทนลงด้วย 1)
ตอนนี้การทำงานยังดูช้าๆ อยากให้ผู้มีความสามารถช่วย optimize code ให้ด้วยครับ

Code: Select all

<?php
if(!empty($_POST['text'])){
  header("location: ".$_SERVER['PHP_SELF']."?".$_POST['text']);
}
echo '<form method="post" action="">
<textarea name="text" rows="10" cols="50"></textarea><BR>
<input type="submit">
</form>';
$terrain = $_GET['FVterrainString'];
$insmax = $_GET['FVinsMax']; //11
$insmin = $_GET['FVinsMin']; //7
$boardx = $_GET['FVboardX']; //18
$boardy = $_GET['FVboardY']; //18
if($insmax+$insmax+$boardx+$boardy+$level < 5) {
  exit();
}
$original = array(".", "X");
$replace   = array("0", "1");
$terrain = str_replace($original, $replace, $terrain);
$board = str_split($terrain, $boardx);
foreach($board as $boardline){
  $board2[] = $boardline."5";
}
$board2[] =  sprintf("%'5".($boardx+1)."s",  "");
for($i=$insmin;$i<=$insmax;$i++){
  unset($ins);
  $maxround = pow(2,$i);
  sprintf("%0".$i."s\n",   decbin($j));
  for($j=0;$j<$maxround;$j++){
    $ins = sprintf("%0".$i."s",   decbin($j));
    runaway($board2,$ins);
  }
}

function runaway($board,$ins){
  $pass = 0;
  $bomb = 0;
  $x=0;
  $y=0;
  $insar = str_split($ins);
  $insar2 = str_split($ins);
  while($pass == 0 && $bomb ==0){
    if(empty($insar))$insar = str_split($ins);
    $insin = array_shift($insar);
    if($insin == 0){
      $y++;
    }elseif($insin == 1){
      $x++;
    }
    if($board[$x][$y] == 0){
    }elseif($board[$x][$y] == 1){
      $bomb = 1;
    }elseif($board[$x][$y] == 5){
      $pass = 1;
    }
  }
  if($pass){
    $original = array("0", "1");
    $replace   = array("R", "D");
    $answer = str_replace($original, $replace, $ins);
    echo "<BR> Pass with ".$answer;
    //exit();
  }
}
?>
test input มีแบบสั้นแล้วก็แบบยาวครับ

Code: Select all

FVterrainString=..XX...X.&FVinsMax=2&FVinsMin=2&FVboardX=3&FVboardY=3

Code: Select all

FVterrainString=..X.XX....X......XXXX......X...XX...X...XX......X..***..X.........X.....X........X.X......X..X.X.....XX.....X.XXXXX.X...XX.XX....XX.X...X.............X.............X..........XX...X..........XX..X.....X.X.XX.......X...X.X..***..X........X.***..XX....XX...XX..X..XXXX..X..X..X.....X..X.XX..***.X..........X..........X....X...XX..XX.......X.X.X..............XX.......XX....X..X..X.X.....X..X........X...X....X..X...X..XXXX.X....X.....XX.......X............XX.X...XX.X..X...X.X...X.....X..XX.....X.X..XX..XX.XX....X...........X.X.X..XX..XX...XX.X...***...X........X.....XX..X..X.X...X.......X....X.X............X.X.X...X...X.X...XX...X................XX......X..X...X..X...X..X.X.***....X......XX..X...XX..........X.XX.X....X................***.....***......X.....X...X....X.X.....***.XX..X.......XX..X..XX.....X.......X...X...X.....***.X....X.X..........XXXX...........X.X.X...X...XX..X.....X..XX.....X.XX............X.X.XX....X..............XX...XXXX.X....X.....X...X...XX.X....X.X.X......X...XX..XX................XX......X........X....XXXX..XX....X......X.X..X......X..X....X.X...X.............X..XX...X......XX...X.X.XX.X....X.X...XX....X.X.....X.X.X....X...X.....XX.XX...XX........X.....X...XX.......X.........XX...X..X...X...X...X.X..X....X......***...X.....X........XX.***...........X..X.X......XX.......XX..X...X..X........XX.X......X.....X.XXXXX.X....X..X.....X..X.......***.X..X.X.......X..XX...XX.XX.XX....X.....X.X..X...XX..X......X.X..X...........***..X.........X.X...X...XX.....X...X.X.X..X....X..X.X..X....XX&FVinsMax=23&FVinsMin=14&FVboardX=39&FVboardY=39

User avatar
retool2
PHP Newbie
PHP Newbie
Posts: 4
Joined: 01/01/1970 7:00 am

Re: ช่วย optimize code ด้วยครับ

Post by retool2 » 11/02/2009 5:22 pm

ผมได้ทำการ optimize code ด้วยการเพิ่ม function findinitins เข้าไปครับ
เป็นการทำให้มันไม่หาค่าที่ไม่จำเป็นออกไป การทำงานเร็วขึ้นแล้ว (คิดว่าน่าจะดีที่สุดเท่าที่ผมเขียนได้แล้ว)
ใครมีความเห็นเพิ่มเติมรบกวนแนะนำด้วยครับ

Code: Select all

<?php
if(!empty($_POST['text'])){
  header("location: ".$_SERVER['PHP_SELF']."?".$_POST['text']);
}
echo '<form method="post" action="">
<textarea name="text" rows="10" cols="50"></textarea><BR>
<input type="submit">
</form>';
$terrain = $_GET['FVterrainString'];
$insmax = $_GET['FVinsMax']; //11
$insmin = $_GET['FVinsMin']; //7
$boardx = $_GET['FVboardX']; //18
$boardy = $_GET['FVboardY']; //18
if($insmax+$insmax+$boardx+$boardy+$level < 5) {
  exit();
}
$original = array(".", "X");
$replace   = array("0", "1");
$terrain = str_replace($original, $replace, $terrain);
$board = str_split($terrain, $boardx);
foreach($board as $boardline){
  $board2[] = $boardline."5";
}
$board2[] =  sprintf("%'5".($boardx+1)."s",  "");
$initins = findinitins($board2,$insmin);
#print_r($initins);

for($i=$insmin;$i<=$insmax;$i++){
  $temp1 = $i-$insmin;
  $maxround = pow(2,$temp1);
  foreach($initins as $init1){
    for($j=0;$j<$maxround;$j++){
      $ins = $init1.sprintf("%0".$temp1."s",   decbin($j));
      runaway($board2,$ins);
    }
  }
}/**/

function findinitins($board,$insmin){
  $maxround = pow(2,$insmin);
  for($j=0;$j<$maxround;$j++){
    $x=0;
    $y=0;
    $pass =0;
    $bomb = 0;
    $ins = sprintf("%0".$insmin."s",   decbin($j));
    $insar = str_split($ins);
    while($pass == 0 && $bomb ==0 && !empty($insar)){
      $insin = array_shift($insar);
      if($insin == 0){
        $y++;
      }elseif($insin == 1){
        $x++;
      }
      if($board[$x][$y] == 0){
      }elseif($board[$x][$y] == 1){
        $bomb = 1;
      }elseif($board[$x][$y] == 5){
        $pass = 1;
      }
      if($bomb == 0 && empty($insar)){
        $initins[] = $ins;
      }
    }

  }
  return $initins;
}


function runaway($board,$ins,$return=0){
  $pass = 0;
  $bomb = 0;
  $x=0;
  $y=0;
  $insar = str_split($ins);
  $insar2 = str_split($ins);
  while($pass == 0 && $bomb ==0){
    if(empty($insar))$insar = str_split($ins);
    $insin = array_shift($insar);
    if($insin == 0){
      $y++;
    }elseif($insin == 1){
      $x++;
    }
    if($board[$x][$y] == 0){
    }elseif($board[$x][$y] == 1){
      $bomb = 1;
    }elseif($board[$x][$y] == 5){
      $pass = 1;
    }
  }
  if($pass){
    $original = array("0", "1");
    $replace   = array("R", "D");
    $answer = str_replace($original, $replace, $ins);
    if($return){
      return $answer;
    }else{
      echo "<BR> Pass with ".$answer;
      exit();
    }
  }
}
?>

Post Reply

Return to “Programming - PHP”

Users browsing this forum: No registered users and 20 guests