正の整数nが与えられたとき、次のようなn * nの二次元配列を生成するコードを教えていただきたいです。
よろしくお願いします。
一番左上の値は 0 です。
例えば、n = 5が与えられたとき、
python
1 0 1 5 6 14 2 2 4 7 13 15 3 3 8 12 16 21 4 9 11 17 20 22 510 18 19 23 24
となります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
あー、せっかく勉強になるようにコードを書いたのに。。。
python
1 2def iterchain(n): 3 L, F = list(range(n ** 2)), True 4 for i in range(1, n): 5 yield sorted(L[:i], reverse=F) 6 L, F = L[i:], not F 7 for i in range(n, 0, -1): 8 yield sorted(L[:i], reverse=F) 9 L, F = L[i:], not F 10 11 12def iterrows(n): 13 source = list(iterchain(n)) 14 for i in range(n): 15 yield [source[i+j].pop(0) for j in range(n)] 16 17 18for row in iterrows(5): 19 print(*row, sep=' ')
投稿2017/10/16 14:53
総合スコア6142
0
面白かったのでつい考えてしまいました。
せっかくなので。
python
1from itertools import cycle 2 3def coord(n, reverse_first): 4 reverse_or_not = [lambda x: x, reversed] 5 if reverse_first: 6 reverse_or_not.reverse() 7 flip = cycle(reverse_or_not).__next__ 8 yield from (i for r in range(1, n + 1) for i in flip()(range(r))) 9 yield from (i for r in range(1, n) for i in flip()(range(r, n))) 10 11def matrix(n): 12 data = [[0] * n for _i in range(n)] 13 for n, (x, y) in enumerate(zip(coord(n, True), coord(n, False))): 14 data[x][y] = n 15 return data 16 17for row in matrix(5): 18 print(' '.join(map('{:3d}'.format, row)))
投稿2017/10/17 00:05
編集2017/10/17 00:10総合スコア11038
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
似た問題が過去にありました。
https://teratail.com/questions/20823
...
例えば、n = 4が与えられたとき、1 2 4 7
3 5 8 11
6 9 12 14
10 13 15 16
この問題での解法をすこし変更すれば対処できるとおもわれます。
追記: 2017-10-17
v -> (x, y) 数字 v を正方形のどの位置 (x, y) に置くかを求める方法を、この質問用に変形させてみました。
gen_square(n) 関数中に
ruby
1x, y = [y, x] if (x + y).even? # 数字が進む向きを逆転させる
の行を付け加えるだけです。
コード全体を示します。(正方形の描画方法の部分は、参考ページのものから少し変更しています)
sq.rv
ruby
1def pos(v, n) 2 if v <= (n * n + 1) / 2 # 左上半分の三角形 3 pos_0(v, n) 4 else # 右半分の三角形 5 x, y = pos_0(n * n + 1 - v, n) 6 [n - 1 - x, n - 1 - y] 7 end 8end 9 10def pos_0(v, n) 11 z = 1 # 四角の上辺の数列の初期値 12 d = 1 # 四角の上辺の数列の次の項との差分 13 tx = 0 # 四角の上辺の位置 14 if v <= (n * n + 1) / 2 15 while z <= v 16 z += d 17 d += 1 18 tx += 1 19 end 20 z -= (d - 1) 21 x = tx - (v - z) - 1 22 y = v - z 23 [x, y] 24 else 25 fail "Bad argument v:#{v}, n:#{n}" 26 end 27end 28 29def square_to_s(ary) 30 keta = ary.size.zero? ? 1 : Math.log10(ary.size * ary.size).floor + 2 31 fmt = "%#{keta}d" 32 ary.each.map { |row| row.map { |item| format(fmt, item) }.join }.join("\n") 33end 34 35def gen_square(n) 36 ary = Array.new(n).map! { Array.new(n, 0) } 37 (1..n * n).each do |v| 38 x, y = pos(v, n) 39 x, y = [y, x] if (x + y).even? # 数字が進む向きを逆転させる 40 ary[y][x] = v - 1 41 end 42 ary 43end 44 45[0, 1, 2, 3, 4, 5, 6].each do |d| 46 puts(square_to_s(gen_square(d))) 47 puts 48end
投稿2017/10/16 14:06
編集2017/10/17 14:32総合スコア22324
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/16 15:02
2017/10/16 15:07
2017/10/16 15:07
2017/10/16 15:15
2017/10/16 15:15
2017/10/16 15:16
2017/10/16 15:17
2017/10/16 15:20
2017/10/16 15:23
2017/10/16 15:27
2017/10/16 15:28
2017/10/16 15:38
2017/10/16 15:39
2017/10/16 16:02