3以上の整数かつ奇数のパラメータnが与えられた場合に、石を積み上げてn*nのピラミッドを2次元配列で作成するコードを書け。
例えばn=5のピラミッドは、
11111
12221
12321
12221
11111
という二次元配列を指す。
例えばn=7のピラミッドは、
1111111
1222221
1233321
1234321
1233321
1222221
1111111
という2次元配列を指す。
結論から言えば、以下のようなコードを書くのが効率が良いと思う。
$bx = []; for($i = 0; $i < $n; $i++){ for($j = 0; $j < $n; $j++){ $bx[$i][$j] = min($i, $j, (($n-1)-$i), (($n-1)-$j)) + 1; } }
逆にピラミッドではなく穴の中にピラミッドを掘りたいなら以下のようにする。
※穴の中にピラミッドができると言ったほうが適切でした。中央の高さがゼロで中央から離れるほど穴が深くなる。
$bx = []; for($i = 0; $i < $n; $i++){ for($j = 0; $j < $n; $j++){ $bx[$i][$j] = floor($n / 2) - min($i, $j, (($n-1)-$i), (($n-1)-$j)); } }
ピラミッド型の穴を掘りたいなら以下の通り。単純に積み上げた値をマイナスをすればよい。
$bx = []; for($i = 0; $i < $n; $i++){ for($j = 0; $j < $n; $j++){ $bx[$i][$j] = -1 * min($i, $j, (($n-1)-$i), (($n-1)-$j)) + 1; } }
これだけ見るとシンプルなコードだけど、これをノーヒントでやろうとすると結構難しくないですか?
n=5の場合は5*5の中央の石の数は頂点で最大になり3=n/2+1になる。
だから、中央から1離れると石は1つづつ下がるのでmin関数を使いxy座標の最小値をもとに中央からどれくらい離れているかを求めているのだが、min関数をうまく使っている。4象限が中央(x=0,y=0)からどれだけ離れているかを4つのパラメータから求められる。
Goodアイデア。いろいろな応用が効きそうだと思った次第。
こうったプログラムを各人には常識なのかもしれないけど、効率の良い書き方が思いつかなかったので、わかった時はとてもスッキリした。
コメント