Last active
June 23, 2017 06:39
-
-
Save phil2phil/94a614e2cb3f21ab3a1cb6bf4e3a6ae2 to your computer and use it in GitHub Desktop.
dailyprogrammer challenge on reddit: spiral
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// https://www.reddit.com/r/dailyprogrammer/comments/6i60lr/20170619_challenge_320_easy_spiral_ascension/ | |
/** | |
* @param array $arguments | |
* @return int | |
*/ | |
function check_args_and_get_number(array $arguments) | |
{ | |
$parameter_name = 'n'; | |
$filename = $arguments[0]; | |
if(!array_key_exists(1, $arguments)) | |
{ | |
die('Please enter a number as parameter like "php ' . $filename . ' ' . $parameter_name . '=5"'); | |
} | |
list($given_parameter_name, $number) = explode('=', $arguments[1]); | |
$number = intval($number); | |
if($given_parameter_name != $parameter_name) | |
{ | |
die('Please enter a number as parameter like "php ' . $filename . ' ' . $parameter_name . '=5"'); | |
} | |
if(!is_integer($number) || $number < 1) | |
{ | |
die('Your input ' . $number . ' wasn\'t a positive number.'); | |
} | |
return $number; | |
} | |
/** | |
* @param int $number | |
* @return array | |
*/ | |
function get_empty_canvas(int $number) | |
{ | |
$canvas = []; | |
for($i = 0; $i < $number; $i++) | |
{ | |
for($j = 0; $j < $number; $j++) | |
{ | |
$canvas[$i][$j] = 0; | |
} | |
} | |
return $canvas; | |
} | |
/** | |
* @param array $canvas | |
* @param int $number | |
*/ | |
function draw_spiral_on_canvas(array &$canvas, int $number) | |
{ | |
$column = $row = 0; | |
$direction = 'right'; | |
for($i = 1; $i <= $number ** 2; $i++) | |
{ | |
$canvas[$row][$column] = $i; | |
make_a_step($row, $column, $direction); | |
// make a turn if the cursor is out of bound or would replace a value different from zero | |
if(!isset($canvas[$row][$column]) || $canvas[$row][$column] != 0) | |
{ | |
make_a_turn($direction, $row, $column); | |
} | |
} | |
} | |
/** | |
* @param int $row | |
* @param int $column | |
* @param string $direction | |
*/ | |
function make_a_step(int &$row, int &$column, string $direction) | |
{ | |
switch($direction) | |
{ | |
case 'right': | |
$column++; | |
break; | |
case 'down': | |
$row++; | |
break; | |
case 'left': | |
$column--; | |
break; | |
case 'up': | |
$row--; | |
break; | |
} | |
} | |
/** | |
* @param string $direction | |
* @param int $row | |
* @param int $column | |
*/ | |
function make_a_turn(string &$direction, int &$row, int &$column) | |
{ | |
switch($direction) | |
{ | |
case 'right': | |
$direction = 'down'; | |
$row++; | |
$column--; | |
break; | |
case 'down': | |
$direction = 'left'; | |
$row--; | |
$column--; | |
break; | |
case 'left': | |
$direction = 'up'; | |
$row--; | |
$column++; | |
break; | |
case 'up': | |
$direction = 'right'; | |
$row++; | |
$column++; | |
break; | |
} | |
} | |
/** | |
* @param array $canvas | |
* @param int $number | |
*/ | |
function print_canvas(array $canvas, int $number) | |
{ | |
$out = ''; | |
$padding_left = strlen($number ** 2) + 1; | |
foreach($canvas as $lines) | |
{ | |
foreach($lines as $field) | |
{ | |
$out .= str_pad($field, $padding_left, " ", STR_PAD_LEFT); | |
} | |
$out .= PHP_EOL; | |
} | |
echo $out; | |
} | |
$number = check_args_and_get_number($argv); | |
$canvas = get_empty_canvas($number); | |
draw_spiral_on_canvas($canvas, $number); | |
print_canvas($canvas, $number); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment