質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

3回答

2138閲覧

数字が斜めに増えていく正方配列の生成(アルゴリズム)

退会済みユーザー

退会済みユーザー

総合スコア0

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2017/10/16 13:35

正の整数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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2017/10/16 15:02

こんなに簡潔に書けるんですね。びっくりしました。
gotata

2017/10/16 15:07

僕が動かすとSyntaxError: invalid syntax が出るのですがどういうことでしょうか。 どなたかわかる方いますか?
YouheiSakurai

2017/10/16 15:07

ありがとうございます。でもあくまで実務用途外のコードです。読みやすくはないので。
gotata

2017/10/16 15:15

高度過ぎてわかんないです...
LouiS0616

2017/10/16 15:15

> gotataさん Python2.7使ってたりしませんか?
gotata

2017/10/16 15:16

2.7です
gotata

2017/10/16 15:17

3じゃないと動きませんか?
LouiS0616

2017/10/16 15:20

2から3に移行する際に、print文がprint関数に置き換えられています。
gotata

2017/10/16 15:23

ではどうすればよいですか??
YouheiSakurai

2017/10/16 15:27

自分で調べることも勉強ですよ。
gotata

2017/10/16 15:28

そうですね。調べてみます。
gotata

2017/10/16 15:38

from __future__ import print_function でできました。ありがとうございました。
gotata

2017/10/16 15:39

ちなみにhttps://teratail.com/questions/20823 のやり方だと、どうなるかわかりますか? 考えたんですけどわからなくて... 気になって寝れません。
YouheiSakurai

2017/10/16 16:02

そっちのやり方はよくわかりません。大丈夫です、気になっててもいつかは寝れます。寝るのが先かわかる様になるのが先かは貴方次第です。
guest

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
quickquip

総合スコア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
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/10/16 14:07

それは見つけましたが、よければ教えていただきたいです。
退会済みユーザー

退会済みユーザー

2017/10/16 14:26

そのサイトを見たのですがどこを直せばよいかわかりません
gotata

2017/10/16 15:25

>katoyさん 質問しといて退会とは失礼ですね笑 このサイトを参考にしたんですけど左下から右上に上がるときはどうすればよいですかね
katoy

2017/10/17 14:33 編集

コードをなおしてみたものを回答に追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問