2014-04-03 26 views
0

在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。

+0

\ n没什么意思,一个错字。 – Tripon

+1

如果第7个元素被排除,那么为什么第三个元素不被排除,其前面加'0'? – Bala

+0

当没有连续的输出时,你想输出什么?当有多组连续的? (例如[1,1,0,1,1])? –

回答

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 s。

共有:

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"]] 
+0

你读过整个问题吗? -1 – Doorknob

+1

我不知道为什么我*不会* downvote一个不正确的答案 – Doorknob

+0

我已阅读整个问题,并相信这是正确的。 –

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"]