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

标签 arrays ruby multidimensional-array collections functional-programming

我很难想出一种函数式方法来反转 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

有人知道如何在不引用显式索引的情况下使用更多的函数式编程风格吗?

最佳答案

如果 array 是你的输入,那么它就很简单

result = array.transpose.map(&:reverse)

如果我正确理解您想要的输出。 ;)

详细说明一下:Array#transpose基本上沿主对角线“镜像”二维数组:

transposed = array.transpose  #=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

您似乎只希望所有行都反转,这是通过调用 map 处理的:

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

map(&:reverse) 语法只是map { |a| 的简写a.reverse 并由 this 启用方法。

手工制作

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

def transpose(a)
  (0...a[0].length).map { |i|
    (0...a.length).map { |j| a[j][i] }
  }
end

虽然这确实引用了显式索引,但它是由其他纯函数组成的纯函数,因此它至少符合对泛函的定义。 ;)

关于arrays - 反转多维数组 - 函数式编程风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38512908/

相关文章:

arrays - (Julia) 快速对数组进行按列求和

Javascript字符串到多维数字数组

c++ - 方法调用后字节大小不正确

java - 如何同时验证字符串值和字符串数组值?也许使用可选语法?

ruby - 如何获取 RSpec 的当前上下文名称?

Ruby 类继承 : How to preven a public method from beeing overwritten in the child classes

Ruby 数组映射(& :flatten) is causing a latency issue

PHP - 如何以任何顺序测试多维数组中的重复元素值

arrays - Valgrind错误-条件跳转或移动取决于未初始化的值

c - 二维数组的大小在哪里以及如何使用点将 1 维变为 2 维?