2017-01-15 7 views
-4

Я массив массивов называется головоломкой, и я пытаюсь вернуть новый массив с первым массивом, состоящим изповорот колонны массива в ряды рубин

["a", "s", "i", "o", "s", "u", "z"] 

Тогда следующий массив, состоящий из массива "S второй индекс

["k", "o", "t", "t", "e", "r", "s"] 

и т.д. и т.п. Какие есть хорошие способы сделать это. Я думал об использовании карты и двух счетчиков, но не мог заставить их работать или или увеличение в разное время должным образом. Любая помощь будет удивительным .

Я хочу, чтобы вернуть новый массив из этого puzzle:

puzzle = [ 
    ["a", "k", "f", "o", "x", "e", "s"], 
    ["s", "o", "a", "w", "a", "h", "p"], 
    ["i", "t", "c", "k", "e", "t", "n"], 
    ["o", "t", "s", "d", "h", "o", "h"], 
    ["s", "e", "x", "g", "s", "t", "a"], 
    ["u", "r", "p", "i", "w", "e", "u"], 
    ["z", "s", "b", "n", "u", "i", "r"] 
] 
+4

Я заметил, что вы никогда не принимаете ответы на свои вопросы. Обязательно переходите к своим вопросам некоторое время и принимайте лучшие ответы, учитывая, что они решают ваш вопрос. Таким образом, вы даете сообществу понять, что проблема решена, и в то же время вы вознаграждаете усилия тех, кто предоставил решение. –

+0

Поскольку 'puzzle' является экземпляром класса [Array] (http: // ruby-doc.org/core-2.3.0/Array.html), вы должны сначала просмотреть методы экземпляра этого класса (см. ссылку). Если вы не найдете что-то там, которое работает (но вам нужно), просмотрите модуль [Перечислимый] (http://ruby-doc.org/core-2.3.0/Enumerable.html). 'Array'' включает этот модуль, поэтому все методы экземпляра в «Enumerable» доступны для использования экземплярами «Array», как если бы они были созданы как метод экземпляра «Array». –

+3

Сокращенное из-за: 1) никаких усилий вообще не проявляется; 2) правильный ответ не принимается. – mudasobwa

ответ

5

Array#transpose есть для вас:

puzzle = [ 
    ["a", "k", "f", "o", "x", "e", "s"], 
    ["s", "o", "a", "w", "a", "h", "p"], 
    ["i", "t", "c", "k", "e", "t", "n"], 
    ["o", "t", "s", "d", "h", "o", "h"], 
    ["s", "e", "x", "g", "s", "t", "a"], 
    ["u", "r", "p", "i", "w", "e", "u"], 
    ["z", "s", "b", "n", "u", "i", "r"] 
] 
puzzle.transpose 
# => [["a", "s", "i", "o", "s", "u", "z"], 
# ["k", "o", "t", "t", "e", "r", "s"], 
# ["f", "a", "c", "s", "x", "p", "b"], 
# ["o", "w", "k", "d", "g", "i", "n"], 
# ["x", "a", "e", "h", "s", "w", "u"], 
# ["e", "h", "t", "o", "t", "e", "i"], 
# ["s", "p", "n", "h", "a", "u", "r"]] 
+0

'transpose' - это путь, но' puzzle.first.zip (* puzzle.drop (1)) 'также работает. См. [Enumerable # zip] (http://ruby-doc.org/core-2.3.0/Enumerable.html#method-i-zip) и [Enumerable # drop] (http://ruby-doc.org/ ядро-2.3.0/Enumerable.html # метод-я-капля). Для массивов, которые могут быть транспонированы, методы 'transpose' и' zip' являются ying и yang. –

0
class Array 
    def my_transpose! 
    size.times do |i| 
     0.upto(i) do |j|         # iterate only through lower half 
     self[i][j], self[j][i] = self[j][i], self[i][j] # swap rows and cols 
     end 
    end 
    self             # return the array itself 
    end 

    def my_transpose 
    dup.map(&:dup).my_transpose!       # inner arrays are dup'ed, too 
    end 
end 

ИЛИ если вам не нужно мутатор ....

.transpose тогда выбор интересующего вас массива с []

puzzle.transpose[0] 

[0] говорит, что дает мне первый результат.

puzzle.transpose[0] 
=> ["a", "s", "i", "o", "s", "u", "z"] 

puzzle.transpose[1] 
=> ["k", "o", "t", "t", "e", "r", "s"] 
+3

вы понимаете, что ваш ответ не приносит ничего нового по сравнению с моим и дается как через 10 минут, верно? :) –

 Смежные вопросы

  • Нет связанных вопросов^_^