反转多维数组 - 函数式编程风格

rad*_*lab 1 ruby arrays collections functional-programming multidimensional-array

我很难想出一种功能性的方法来反转Ruby中的多维(偶数维度)数组.输入:[[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6] ,3]]

这个迭代解决方案有效.

def reverse(arr)
  size = arr.length
  output = Array.new(size) { Array.new(size,0) }
  arr.reverse.each_with_index do |a, i|
    a.each_with_index do |a, j|
      output[j][i] = a
    end
  end
  output
end
Run Code Online (Sandbox Code Playgroud)

任何人都有任何洞察如何使用更多的函数式编程风格而不参考显式索引?

Jul*_*off 6

如果array是你的输入,那就简单了

result = array.transpose.map(&:reverse)
Run Code Online (Sandbox Code Playgroud)

如果我正确理解你想要的输出.;)

详细说明:Array#transpose基本上沿主对角线"镜像"2D阵列:

transposed = array.transpose  #=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Run Code Online (Sandbox Code Playgroud)

你好像只想要反转所有行,这是通过调用来处理的map:

result = transposed.map(&:reverse)  #=> [[7, 4, 1], [8, 5, 2], [9, 6, 3]]
Run Code Online (Sandbox Code Playgroud)

map(&:reverse)语法仅用于简写map { |a| a.reverse },并通过启用这种方法.

手工完成

在我的初步回答之后,在评论中发现OP实际上是在功能实现之后transpose.这是我想出的:

def transpose(a)
  (0...a[0].length).map { |i|
    (0...a.length).map { |j| a[j][i] }
  }
end
Run Code Online (Sandbox Code Playgroud)

虽然这确实引用了显式索引,但它是一个由其他纯函数组成的纯函数,所以它至少符合对函数的定义.;)