z = [
[0,0,0,0],
[0,1,0,0],
[0,0,0,1],
[0,0,0,0]
]
Во-первых, давайте найти соответствующие строки:
rows = z.each_with_index.select { |row, index| row.include? 1}.map(&:last)
# => [1, 2]
И затем для каждой строки найдем индекс соответствия 1
:
cols = rows.map {|row| z[row].each_with_index.select { |item, index| item == 1}.map(&:last) }
# => [[1], [3]]
Если мы хотим, мы можем затем объединить их с помощью zip
:
rows.zip(cols)
# => [[1, [1]], [2, [3]]]
выше работает, даже если ряд z
содержит несколько вхождений 1
Например, если у нас было:
z = [
[1,0,0,1],
[0,1,0,0],
[0,0,0,1],
[1,1,1,0]
]
затем
rows = z.each_with_index.select { |row, index| row.include? 1}.map(&:last)
# => [0, 1, 2, 3]
cols = rows.map {|row| z[row].each_with_index.select { |item, index| item == 1}.map(&:last) }
# => [[0, 3], [1], [3], [0, 1, 2]]
rows.zip(cols)
# => [[0, [0, 3]], [1, [1]], [2, [3]], [3, [0, 1, 2]]]
Интересно, почему люди продолжают использовать вложенный массив для таких ситуаций. Плоский массив намного легче справиться. – sawa
Когда вы приводите пример, назначьте переменную каждому входному объекту. Таким образом, переменная может ссылаться на ответы и комментарии. Все, кроме одного ответа, начинаются с определения массива. Если бы вы написали 'arr = [[0,0 ....]]' ничто из этого не понадобилось - ответы просто написали бы 'arr'. Я понимаю, что вы новичок в SO. Это всего лишь совет, а не критика. –