回答編集履歴

1

追記

2017/10/17 14:32

投稿

katoy
katoy

スコア22324

test CHANGED
@@ -21,3 +21,133 @@
21
21
 
22
22
 
23
23
  この問題での解法をすこし変更すれば対処できるとおもわれます。
24
+
25
+
26
+
27
+ 追記: 2017-10-17
28
+
29
+
30
+
31
+ v -> (x, y) 数字 v を正方形のどの位置 (x, y) に置くかを求める方法を、この質問用に変形させてみました。
32
+
33
+
34
+
35
+ gen_square(n) 関数中に
36
+
37
+ ```ruby
38
+
39
+ x, y = [y, x] if (x + y).even? # 数字が進む向きを逆転させる
40
+
41
+ ```
42
+
43
+ の行を付け加えるだけです。
44
+
45
+
46
+
47
+ コード全体を示します。(正方形の描画方法の部分は、参考ページのものから少し変更しています)
48
+
49
+ sq.rv
50
+
51
+ ```ruby
52
+
53
+ def pos(v, n)
54
+
55
+ if v <= (n * n + 1) / 2 # 左上半分の三角形
56
+
57
+ pos_0(v, n)
58
+
59
+ else # 右半分の三角形
60
+
61
+ x, y = pos_0(n * n + 1 - v, n)
62
+
63
+ [n - 1 - x, n - 1 - y]
64
+
65
+ end
66
+
67
+ end
68
+
69
+
70
+
71
+ def pos_0(v, n)
72
+
73
+ z = 1 # 四角の上辺の数列の初期値
74
+
75
+ d = 1 # 四角の上辺の数列の次の項との差分
76
+
77
+ tx = 0 # 四角の上辺の位置
78
+
79
+ if v <= (n * n + 1) / 2
80
+
81
+ while z <= v
82
+
83
+ z += d
84
+
85
+ d += 1
86
+
87
+ tx += 1
88
+
89
+ end
90
+
91
+ z -= (d - 1)
92
+
93
+ x = tx - (v - z) - 1
94
+
95
+ y = v - z
96
+
97
+ [x, y]
98
+
99
+ else
100
+
101
+ fail "Bad argument v:#{v}, n:#{n}"
102
+
103
+ end
104
+
105
+ end
106
+
107
+
108
+
109
+ def square_to_s(ary)
110
+
111
+ keta = ary.size.zero? ? 1 : Math.log10(ary.size * ary.size).floor + 2
112
+
113
+ fmt = "%#{keta}d"
114
+
115
+ ary.each.map { |row| row.map { |item| format(fmt, item) }.join }.join("\n")
116
+
117
+ end
118
+
119
+
120
+
121
+ def gen_square(n)
122
+
123
+ ary = Array.new(n).map! { Array.new(n, 0) }
124
+
125
+ (1..n * n).each do |v|
126
+
127
+ x, y = pos(v, n)
128
+
129
+ x, y = [y, x] if (x + y).even? # 数字が進む向きを逆転させる
130
+
131
+ ary[y][x] = v - 1
132
+
133
+ end
134
+
135
+ ary
136
+
137
+ end
138
+
139
+
140
+
141
+ [0, 1, 2, 3, 4, 5, 6].each do |d|
142
+
143
+ puts(square_to_s(gen_square(d)))
144
+
145
+ puts
146
+
147
+ end
148
+
149
+ ```
150
+
151
+ 実行結果:
152
+
153
+ ![イメージ説明](e987b04bd999b840ffa823f677f3aafe.png)