
x = [2, 5, 8, 33, 58]
print x.collect {|n| x.collect {|i| (n-i).abs}}.flatten
Я думаю, это сработает.
Если вам действительно нужен массив вместо матрицы, это O (n ^ 2/2) вместо O (n ^ 2).
result=[]
x.each_index{|i| (i+1).upto(x.size-1){|j| result<<(x[i]-x[j]).abs}}
Ой - если 4! это 4 * 3 * 2 * 1, как называется 4 + 3 + 2 + 1?
1 + 2 + ... + п = п * (п-1) / 2
@grifaton, да, а есть ли у него название? Произведение чисел от 1 до N равно N факториалу. Как вы называете сумму чисел от 1 до N?
Ну n * (n + 1) / 2 - n-е треугольное число, но для этого нет общепринятого имени или символа.
x.map{|i| x.map{|j| (i-j).abs } }
дает
[[0, 3, 6, 31, 56], [3, 0, 3, 28, 53], [6, 3, 0, 25, 50], [31, 28, 25, 0, 25], [56, 53, 50, 25, 0]]
(отформатируйте его вот так, напечатав с 'pp' вместо put)
и
x.map{|i| x.map{|j| (i-j).abs } }.flatten
дает
[0, 3, 6, 31, 56, 3, 0, 3, 28, 53, 6, 3, 0, 25, 50, 31, 28, 25, 0, 25, 56, 53, 50, 25, 0]
если вам действительно нужен массив
это все еще O (n ^ 2), но с половиной сравнений чисел. О (п!) В любом случае не то, что вы имеете в виду.