Rubí (110 bytes)
n=a.size
b=[*(0...n)]
b.product(b).group_by{|i,j|i+j}.flat_map{|_,f|f.sort.map{|i,j|a[i][j]}}.each_slice(n).to_a
#=> [[1, 2, 1, 3, 2],
# [1, 4, 3, 2, 1],
# [5, 4, 3, 2, 1],
# [5, 4, 3, 2, 5],
# [4, 3, 5, 4, 5]]
los sort
posible que la operación no sea necesaria, pero el documento para Enumerable # group_by no garantiza el orden de los valores en los valores hash (que son matrices), pero las versiones actuales de Ruby proporcionan el orden que uno esperaría y el orden que necesitaría si sort
fuera eliminado de mi código.
Los pasos son los siguientes.
n=a.size
#=> 5
b=[*(0...n)]
#=> [0, 1, 2, 3, 4]
c = b.product(b)
#=> [[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [1, 0], [1, 1], [1, 2], [1, 3],
# [1, 4], [2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [3, 0], [3, 1], [3, 2],
# [3, 3], [3, 4], [4, 0], [4, 1], [4, 2], [4, 3], [4, 4]]
d=c.group_by{|i,j|i+j}
#=> {0=>[[0, 0]],
# 1=>[[0, 1], [1, 0]],
# 2=>[[0, 2], [1, 1], [2, 0]],
# 3=>[[0, 3], [1, 2], [2, 1], [3, 0]],
# 4=>[[0, 4], [1, 3], [2, 2], [3, 1], [4, 0]],
# 5=>[[1, 4], [2, 3], [3, 2], [4, 1]],
# 6=>[[2, 4], [3, 3], [4, 2]],
# 7=>[[3, 4], [4, 3]],
# 8=>[[4, 4]]}
e=d.flat_map{|_,f|f.sort.map{|i,j|a[i][j]}}
#=> [1, 2, 1, 3, 2, 1, 4, 3, 2, 1, 5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5]
f=e.each_slice(n)
#=> #<Enumerator: [1, 2, 1, 3, 2, 1, 4, 3, 2, 1, 5, 4, 3, 2, 1, 5, 4, 3, 2,
# 5, 4, 3, 5, 4, 5]:each_slice(5)>
Por último, f.to_a
devuelve la matriz mostrada anteriormente.