Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 反转多维数组-函数式编程风格_Arrays_Ruby_Multidimensional Array_Collections_Functional Programming - Fatal编程技术网

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

Arrays 反转多维数组-函数式编程风格,arrays,ruby,multidimensional-array,collections,functional-programming,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

我很难想出一种在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)
如果我正确理解您的期望输出。;)

详细说明一下:基本上沿主对角线“镜像”2D阵列:

transposed = array.transpose  #=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
您似乎只希望所有行都颠倒过来,这是通过调用:

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

手工做 在我最初的回答之后,评论中发现OP实际上是在
转置
的功能实现之后。以下是我的想法:

def transpose(a)
  (0...a[0].length).map { |i|
    (0...a.length).map { |j| a[j][i] }
  }
end
虽然这确实是指显式索引,但它是由其他纯函数组成的纯函数,因此它至少符合我对函数的定义。;)

我相信这符合我们的要求

步骤如下:

arr_rev = arr.reverse
   #=> [[7, 8, 9], [4, 5, 6], [1, 2, 3]] 
arr_rev.first.zip(arr_rev[1..-1])
   #=> [7, 8, 9].zip(*[[4, 5, 6], [1, 2, 3]])
   #.    [7, 8, 9].zip([4, 5, 6], [1, 2, 3])
   #.    [[7, 4, 1], [8, 5, 2], [9, 6, 3]]

请参阅。

回答得不错。包含到的链接或快速演示其工作原理会很有帮助。这是正确的输出,当然也是客户端代码的好方法。考虑到这一点,我真正好奇的是寻找一种编码数组转置的函数方法。你说得对@sagarpandya82,我详细阐述了一下,谢谢你的反馈。@radlab也为你添加了一些东西。朱利安,你提出了一个重要问题。我的意见是,最好用最鲁莽的方式编写代码。是的,读者可能需要运用这些灰色的小单元来理解你所写的内容,但他们会学到一些关于语言力量的新东西,而不仅仅是迟钝的片段。随着练习,越来越多的Rubyish方式将进入潜意识,使其更容易理解和更快阅读。你有没有机会解释一下
zip(*arr_rev)
part是如何工作的?@sagarpandya282,请查看我的编辑(我应该在没有被要求的情况下提供)。是的,我真的需要这里的步骤谢谢你。我从来没有见过像这样使用
*
,如果我是正确的,它似乎像反splat一样工作?不,这是splat的正常用法:它用元素列表替换数组。啊,这就是反splat的意思。不管怎样,我已经把事情弄清楚了,谢谢。
ar =  [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

ar.reverse.transpose # => [[7, 4, 1], [8, 5, 2], [9, 6, 3]]
arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

arr_rev = arr.reverse
  #=> [[7, 8, 9], [4, 5, 6], [1, 2, 3]] 
arr_rev.first.zip *arr_rev[1..-1]
  #=> [[7, 4, 1], [8, 5, 2], [9, 6, 3]] 
arr_rev = arr.reverse
   #=> [[7, 8, 9], [4, 5, 6], [1, 2, 3]] 
arr_rev.first.zip(arr_rev[1..-1])
   #=> [7, 8, 9].zip(*[[4, 5, 6], [1, 2, 3]])
   #.    [7, 8, 9].zip([4, 5, 6], [1, 2, 3])
   #.    [[7, 4, 1], [8, 5, 2], [9, 6, 3]]