如何找到自然平方根数的对角线值

时间:2015-01-29 16:52:57

标签: ruby

我正在尝试获得正方形数字的对角线值。如果我给出数字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]]

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]]