$x_min, 'x_max' => $x_max, 'y_min' => $y_min, 'y_max' => $y_max]; function increment(&$x, &$y, &$x_velocity, &$y_velocity) { $x += $x_velocity; $y += $y_velocity; if ($x_velocity > 0) $x_velocity -= 1; elseif ($x_velocity < 0) $x_velocity += 1; else $x_velocity = 0; $y_velocity -= 1; } function check($x, $y, $target) { return $x >= $target['x_min'] && $x <= $target['x_max'] && $y >= $target['y_min'] && $y <= $target['y_max']; } $max = 0; for ($i = 1; $i < abs($target['x_min']); $i++) { $tmp_max = 0; for ($j = 1; $j < abs($target['y_min']); $j++) { $x = 0; $y = 0; $x_velocity = $i; $y_velocity = $j; $tmp_max = max($tmp_max, $y); while(!check($x, $y, $target)) { echo sprintf('x: %s, y: %s%s', $x, $y, "\n"); increment($x, $y, $x_velocity, $y_velocity); $tmp_max = max($tmp_max, $y); if ($y <= $target['y_min']) { break; } } if (check($x, $y, $target)) { $max = max($max, $tmp_max); } } } echo $max;