Skip to content

Instantly share code, notes, and snippets.

@NimaGhaedsharafi
Last active May 11, 2021 18:26
Show Gist options
  • Save NimaGhaedsharafi/b86fb07bc9d7e7f2163bc343dc3304cb to your computer and use it in GitHub Desktop.
Save NimaGhaedsharafi/b86fb07bc9d7e7f2163bc343dc3304cb to your computer and use it in GitHub Desktop.
<?php
$input = 9;
// 1x1 => 1
// 2x2 => 4
// 3x3 => 9
// 4x4 => 16
/*
i:0 1 2
0 1 8 7
1 2 9 6
2 3 4 5
2x2
1 4
2 3
9x9
01 32 31 30 29 28 27 26 25
02 33 56 55 54 53 52 51 24
03 34 57 72 71 70 69 50 23
04 35 58 73 80 79 68 49 22
05 36 59 74 81 78 67 48 21
06 37 60 75 76 77 66 47 20
07 38 61 62 63 64 65 46 19
08 39 40 41 42 43 44 45 18
09 10 11 12 13 14 15 16 17
**/
$size = $input * $input;
$result = [];
$counter = 1;
/*
1 -> towrds right, bottom
0 -> stays
-1 -> towards left or top
**/
$di = 1;
$dj = 0;
$i = 0;
$j = 0;
while ($counter <= $size) {
$result[$i][$j] = $counter++;
$i += $di;
$j += $dj;
// checks for boundries
if (invalid($i, $j, $input, $result)) {
// reset first
$i -= $di;
$j -= $dj;
// change direction
if ($di == 1 && $dj == 0) {
$di = 0;
$dj = 1;
} elseif ($di == 0 && $dj == 1) {
$di = -1;
$dj = 0;
} elseif ($di == -1 && $dj == 0) {
$di = 0;
$dj = -1;
} elseif ($di == 0 && $dj == -1) {
$di = 1;
$dj = 0;
}
// adds up again
$i += $di;
$j += $dj;
}
}
$maxWS = ceil(log10($size+1));
for ($i = 0; $i < $input; $i++) {
for ($j = 0; $j < $input; $j++) {
echo str_pad($result[$i][$j], $maxWS, "0", STR_PAD_LEFT) . " ";
}
echo PHP_EOL;
}
function invalid($i, $j, $size, $result)
{
return $j < 0 || $i < 0 || $j >= $size || $i >= $size || isset($result[$i][$j]) != false;
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment