插入嵌套数组

时间:2018-06-09 16:24:19

标签: arrays ruby

我在这种形式的文件中描述了汽车:

CAR
Audi
1x1
XXX
XXXXX
_X
_X

我想将此文件中的汽车插入10 x 10嵌套数组中。 第二行是从汽车起点的左上角开始的坐标(R×C)。第三到第五行显示了汽车的形状。

OUTPUT= [["O","O","O","O","O","O","O","O","O","O"],
    ["O","X","X","X","O","O","O","O","O","O"],
    ["O","X","X","X","X","X","O","O","O","O"],
    ["O","O","X","O","O","O","O","O","O","O"],
    ["O","O","X","O","O","O","O","O","O","O"]
    ["O","O","O","O","O","O","O","O","O","O"]
    ["O","O","O","O","O","O","O","O","O","O"]
    ["O","O","O","O","O","O","O","O","O","O"]
    ["O","O","O","O","O","O","O","O","O","O"]
    ["O","O","O","O","O","O","O","O","O","O"]

INPUT arr =[]

Grid with first car

1 个答案:

答案 0 :(得分:-1)

这应该有用,非常棘手。当然有更好的方法。

首先将文件映射为哈希值。

car_array = []
File.open('car_array.txt').each_with_index do |line, idx|
    car_array << line.chomp
end
p car_array
# => ["CAR", "Audi", "1x1", "XXX", "XXXXX", "_X", "_X", "CAR", "BMW", "5x1", "__X", "XXX", "X", "XX"]

car_hash = {}
key = nil
car_array.each_with_index do |e, index|
  key = car_array[index-1].downcase.to_sym if car_array[index-2] == "CAR"
  car_hash[key] = [e] if car_array[index-2] == "CAR"
  car_hash[key] << e if car_hash[key] unless (car_array[index-2] == "CAR" || car_array[index-1] == "CAR" || car_array[index] == "CAR")
end

p car_hash
# => {:audi=>["1x1", "XXX", "XXXXX", "_X", "_X"], :bmw=>["5x1", "__X", "XXX", "X", "XX"]}

car_hash.transform_values do |array|
  h = {start: [], points: []}
  h[:start] = array[0].split('x').map(&:to_i).map!{ |e| e}
  (array.size - 1).times do |n|
    h[:points] << array[n+1]
  end
  array[0] = h
  (array.size - 1).times do |n|
    array.pop
  end
end

car_hash.transform_values! {|v| v[0]}

p car_hash
# => {:audi=>{:start=>[1, 1], :points=>["XXX", "XXXXX", "_X", "_X"]}, :bmw=>{:start=>[5, 1], :points=>["__X", "XXX", "X", "XX"]}}

car_hash.each_value do |car|
  car[:points].map! do |point|
    point.scan(/./)
  end
  row = car[:start][0] - 1
  col = car[:start][1] - 1
  car[:points].map! do |points|
  delta_col = 0
  row += 1
    points.map! do |point|
      delta_col +=1
      point == 'X' ? [row, col + delta_col] : nil
    end
    points.compact
  end
  car[:points] = car[:points].flatten(1)
end


p car_hash
# => {:audi=>{:start=>[1, 1], :points=>[[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [3, 2], [4, 2]]}, :bmw=>{:start=>[5, 1], :points=>[[5, 3], [6, 1], [6, 2], [6, 3], [7, 1], [8, 1], [8, 2]]}}

然后我们使用哈希来构建表格。

table_model = Array.new(10) {Array.new(10,'O')}

def print_table (table)
  table.each {|row| p row}
end

audi_table = table_model.dup

car_hash[:audi][:points].each { |point| audi_table[point[0]][point[1]] = 'x' }

print_table audi_table

# => ["O", "O", "O", "O", "O", "O", "O", "O", "O", "O"]
# => ["O", "x", "x", "x", "O", "O", "O", "O", "O", "O"]
# => ["O", "x", "x", "x", "x", "x", "O", "O", "O", "O"]
# => ["O", "O", "x", "O", "O", "O", "O", "O", "O", "O"]
# => ["O", "O", "x", "O", "O", "O", "O", "O", "O", "O"]
# => ["O", "O", "O", "O", "O", "O", "O", "O", "O", "O"]
# => ["O", "O", "O", "O", "O", "O", "O", "O", "O", "O"]
# => ["O", "O", "O", "O", "O", "O", "O", "O", "O", "O"]
# => ["O", "O", "O", "O", "O", "O", "O", "O", "O", "O"]
# => ["O", "O", "O", "O", "O", "O", "O", "O", "O", "O"]