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

Ruby转置表,数组到字符串,正则表达式,ruby,arrays,string,transpose,Ruby,Arrays,String,Transpose,在Ruby中,我将使用以下数组: [[1,1,1,0,0],[1,1,1,0,0],[0,0,0,1,1]] [[1,1,0],[1,1,0],[1,1,0],[0,0,1],[0,0,1]] 转换为该矩阵或表格(无标题): 我想做的是取数组中每个数组的每个元素来转置数组,例如,在上面的表/数组中,我将此输出作为数组数组: [[1,1,1,0,0],[1,1,1,0,0],[0,0,0,1,1]] [[1,1,0],[1,1,0],[1,1,0],[0,0,1],[0,0,1]] 还是这

在Ruby中,我将使用以下数组:

[[1,1,1,0,0],[1,1,1,0,0],[0,0,0,1,1]]
[[1,1,0],[1,1,0],[1,1,0],[0,0,1],[0,0,1]]
转换为该矩阵或表格(无标题):

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

[[1,1,1,0,0],[1,1,1,0,0],[0,0,0,1,1]]
[[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。

对于第一部分,您只需要
数组#转置

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
s

总共:

array.transpose.map {|arr| arr.join.scan(/11+/)}
#=> [["11"], ["11"], ["11"], [], []]
如果您想删除空数组,@Doorknob注意到您可以附加一个
拒绝

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

代码

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.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"]]
如果需要,可以消除空集

解释

对于上面的
数组

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>

\n表示“无”,是一个输入错误。如果排除了第7个元素,那么为什么不排除第三个元素?其前面有
0
?如果没有连续的元素,您希望输出什么?当有多组连续的数据集时?(例如[1,1,0,1,1])?
flatten
去除空数组(没有连续数组),可能是不必要的。如果有
[1,1,0,1,1]
?然后将有两个独立的字符串。您可能需要
.transpose.map{| arr | arr.join.scan(/11+/).join}.reject(&:empty?)
@Doorknob good point。我没有考虑这种情况。我已经更新了我的答案,并要求OP澄清。您仍然需要添加一个
。在
扫描之后加入
@doorknoble,这取决于OP想要的输出。我很乐意将其作为数组的数组,并将任何进一步的文本输出作为OP的练习:)