Arrays 如何根据字符位置对字符串重新排序

Arrays 如何根据字符位置对字符串重新排序,arrays,ruby,string,loops,Arrays,Ruby,String,Loops,我正在努力定义一个方法,该方法能够转换字符串,例如: "abcd\nefgh\nijkl\nmnop" 进入: 对此,我有一个冗长的过程,但我确信我可以通过一个倒计时循环进行迭代: def string_changer(str) arr = [] a_1 = [] str.split.map do |s| a_1 << s[3] end arr << a_1.join.reverse a_2 = [] str.split.map do

我正在努力定义一个方法,该方法能够转换字符串,例如:

"abcd\nefgh\nijkl\nmnop"
进入:

对此,我有一个冗长的过程,但我确信我可以通过一个倒计时循环进行迭代:

def string_changer(str)
  arr = []
  a_1 = []
  str.split.map do |s|
    a_1 << s[3]
  end
  arr << a_1.join.reverse
  a_2 = []
  str.split.map do |s|
    a_2 << s[2]
  end
  arr << a_2.join.reverse
  a_3 = []
  str.split.map do |s|
    a_3 << s[1]
  end
  arr << a_3.join.reverse
  a_4 = []
  str.split.map do |s|
    a_4 << s[0]
  end
  arr << a_4.join.reverse
  arr.join(',').gsub!(',', "\n")
end
def字符串转换器(str)
arr=[]
a_1=[]
str.split.map do|s|
a_1
说明:

str.split("\n") # breaks into parts
#=> ["abcd", "efgh", "ijkl", "mnop"]
str.split("\n").map(&:chars) #converts each part into individual char group
#=> [["a", "b", "c", "d"], ["e", "f", "g", "h"], ["i", "j", "k", "l"], ["m", "n", "o", "p"]]
str.split("\n").map(&:chars).transpose # transpose the array - groups by position
#=> [["a", "e", "i", "m"], ["b", "f", "j", "n"], ["c", "g", "k", "o"], ["d", "h", "l", "p"]]
str.split("\n").map(&:chars).transpose.map{ |x| x.join.reverse } # joins back each group and reverses
#=> ["miea", "njfb", "okgc", "plhd"]
str.split("\n").map(&:chars).transpose.map{ |x| x.join.reverse }.reverse #reverse entire group
#=> ["plhd", "okgc", "njfb", "miea"]
str.split("\n").map(&:chars).transpose.map{ |x| x.join.reverse }.reverse.join("\n") # joins back
#=> "plhd\nokgc\nnjfb\nmiea"
事实上,您可以对原始字符串执行一次反转操作,而不是以后对每个组执行反转操作:

str = "abcd\nefgh\nijkl\nmnop"
str.reverse.split("\n").map(&:chars).transpose.map(&:join).join("\n")
str.split("\n") # breaks into parts
#=> ["abcd", "efgh", "ijkl", "mnop"]
str.split("\n").map(&:chars) #converts each part into individual char group
#=> [["a", "b", "c", "d"], ["e", "f", "g", "h"], ["i", "j", "k", "l"], ["m", "n", "o", "p"]]
str.split("\n").map(&:chars).transpose # transpose the array - groups by position
#=> [["a", "e", "i", "m"], ["b", "f", "j", "n"], ["c", "g", "k", "o"], ["d", "h", "l", "p"]]
str.split("\n").map(&:chars).transpose.map{ |x| x.join.reverse } # joins back each group and reverses
#=> ["miea", "njfb", "okgc", "plhd"]
str.split("\n").map(&:chars).transpose.map{ |x| x.join.reverse }.reverse #reverse entire group
#=> ["plhd", "okgc", "njfb", "miea"]
str.split("\n").map(&:chars).transpose.map{ |x| x.join.reverse }.reverse.join("\n") # joins back
#=> "plhd\nokgc\nnjfb\nmiea"
str = "abcd\nefgh\nijkl\nmnop"
str.reverse.split("\n").map(&:chars).transpose.map(&:join).join("\n")