Ruby转置表,数组到字符串,正则表达式

时间:2014-04-03 12:15:08

标签: ruby arrays string transpose

在Ruby中我会有这个数组数组:

[[1,1,1,0,0],[1,1,1,0,0],[0,0,0,1,1]]

转换为此矩阵或表(无标题):

11100
11100
00011

我想要做的是将数组中每个数组的每个元素转换为数组,例如,在上面的表/数组中,我将此输出作为数组数组:

[[1,1,0],[1,1,0],[1,1,0],[0,0,1],[0,0,1]]

或此表

110
110
110
001
001

最后,一旦完成上述操作,我想将数组中的每个数组转换为一个字符串,该字符串将排除任何不连续1的值,例如,如果我转换数组[1,0,1, 1,1,0,1]到一个非连续1被排除的字符串我应该得到这样的结果:111。注意第一,第二,第六和第七个元素被排除,因为它们不是连续的1。

2 个答案:

答案 0 :(得分:2)

对于第一部分,您只需要Array#transpose

array.transpose
#=>  [[1,1,0],[1,1,0],[1,1,0],[0,0,1],[0,0,1]]

然后你可以做以下

.map {|arr| arr.join.scan(/11+/)}

计算连续的数。 join将每个子数组转换为字符串,然后scan检查两个或更多个连续的1

共:

array.transpose.map {|arr| arr.join.scan(/11+/)}
#=> [["11"], ["11"], ["11"], [], []]

如果你想删除空数组,@ Doorknob注意到你可以追加reject

array.transpose.map {|arr| arr.join.scan(/11+/)}.reject(&:empty?)
#=> [["11"], ["11"], ["11"]]

答案 1 :(得分:0)

您也可以使用Enumerable#chunk

<强>代码

array.transpose
     .map { |a|
       a.chunk { |e| e }
        .select { |f,a| f == 1 && a.size > 1 }
        .map { |_,a| a.join } }

示例

array = [[1,1,1,0,0],[1,1,0,1,0],[0,0,1,1,1],[1,1,0,1,1],[1,0,1,1,1]]
  #=> [["11", "11"], ["11"], [], ["1111"], ["111"]]

如果需要,可以消除空集。

<强>解释

对于上面的array

a = array.transpose
  #=> [[1, 1, 0, 1, 1],
  #    [1, 1, 0, 1, 0],
  #    [1, 0, 1, 0, 1],
  #    [0, 1, 1, 1, 1],
  #    [0, 0, 1, 1, 1]]

a.map遍历a的元素(行)。考虑第一个元素:

b = a.first
  #=> [1, 1, 0, 1, 1]
c = b.chunk { |e| e }
  #=> #<Enumerator: #<Enumerator::Generator:0x000001020495e0>:each>

要查看此枚举器的内容,请添加.to_a

  b.chunk { |e| e }.to_a
    #=> [[1, [1, 1]], [0, [0]], [1, [1, 1]]]
d = c.select { |f,a| f == 1 && a.size > 1 }
  #=> [[1, [1, 1]], [1, [1, 1]]]
d.map { |_,a| a.join }
  #=> ["11", "11"]