我正在尝试获得正方形数字的对角线值。如果我给出数字2
,它应该将其转换为正方形并给出对角线值:
2
[0,1
2,3]
将提供[[0,3],[1,2]]
或3
[0,1,2
3,4,5
6,7,8]
将提供[[0,4,8], [2,4,6]
或4
[0 ,1 ,2 ,3
4 ,5 ,6 ,7
8 ,9 ,10,11
12,13,14,15]
将提供[[0,5,10,15],[3,6,9,12]]
等
def diagonal(2)
end
#=> [[0,3],[1,2]]
答案 0 :(得分:4)
你应该发布你之前尝试过的东西。无论如何,你走了:
def diagonal(a)
[0.step(a**2,a+1).to_a, (a-1).step(a**2-a,a-1).to_a]
end
diagonal 2
#=> [[0, 3], [1, 2]]
diagonal 3
#=> [[0, 4, 8], [2, 4, 6]]
diagonal 4
#=> [[0, 5, 10, 15], [3, 6, 9, 12]]
答案 1 :(得分:0)
您可以通过以下几种方式实现此目标。
<强>#1 强>
如果速度和内存不是问题,您可以执行以下操作:
def diags(n)
arr = (0...n*n).each_slice(n).to_a
[diag(arr), diag(rotate(arr))]
end
def rotate(a)
a.map { |row| row.reverse }
end
def diag(a)
a.size.times.map { |i| a[i][i] }
end
<强>#2 强>
这种方法的本质与@Grych的答案实际上是一样的,但我建议使用帮助器:
def diags(n)
[vec(n, 0, n+1), vec(n, n-1, n-1)]
end
def vec(vec_size, start, step_size)
(start...start+vec_size**2).step(step_size).to_a
end
<强>实施例强>
(2..4).each do |n|
w = n.to_s.size + 2
(0...n**2).each_slice(n) { |a| a.each { |i| print "%#{w}s" % i }; puts }
p diags(n)
puts
end
0 1
2 3
[[0, 3], [1, 2]]
0 1 2
3 4 5
6 7 8
[[0, 4, 8], [2, 4, 6]]
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
[[0, 5, 10, 15], [3, 6, 9, 12]]