Skip to content

Instantly share code, notes, and snippets.

@phil2phil
Last active June 23, 2017 06:39
Show Gist options
  • Save phil2phil/94a614e2cb3f21ab3a1cb6bf4e3a6ae2 to your computer and use it in GitHub Desktop.
Save phil2phil/94a614e2cb3f21ab3a1cb6bf4e3a6ae2 to your computer and use it in GitHub Desktop.
dailyprogrammer challenge on reddit: spiral
<?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