чтение половины таблицы - PullRequest
1 голос
/ 08 июня 2010

Когда у меня есть стол;

1 0 0 1 0
0 1 0 1 0
0 0 1 0 1
1 1 1 1 0
0 0 0 0 1

Скажем, я хочу только читать и хранить значения вдоль верхней диагонали этой таблицы, как я могу легко сделать это в чистом рубине?

такой, что конечная структура выглядит как

1 0 0 1 0
  1 0 1 1 
    1 0 1
      1 0
        1

Спасибо

Ответы [ 3 ]

2 голосов
/ 08 июня 2010

Предполагается, что ваша таблица находится в файле где-то, но вы можете просто зайти туда, откуда хотите:

# get data from file
data = File.readlines(path).map(&:chomp)

# convert to array of integers
a = data.map { |line| line.split(" ").map(&:to_i) }

# remove incrementally more elements from each row
a.each_index { |index| a[index].slice!(0,index) }

# alternatively, you could set these to nil
# in order to preserve your row/column structure
a.each_index { |index| index.times { |i| a[index][i] = nil } }
1 голос
/ 08 июня 2010

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

# Create a two-dimensional array, somehow.
table = []
table << %w{1 0 0 1 0} 
table << %w{0 1 0 1 0}
table << %w{0 0 1 0 1}
table << %w{1 1 1 1 0}
table << %w{0 0 0 0 1}

# New table
diagonal = []
table.each_with_index {|x,i| diagonal << x[0,table.size - i]}

# Or go the other direction
diagonal = []
table.each_with_index {|x,i| diagonal << x[0,i+1]}

Если вам нужно, чтобы значения были целыми числами, бросьтеmap {|i| i.to_i} где-то там.

1 голос
/ 08 июня 2010
input = File.new(filename, "rb")
firstRow = input.readline().split(" ").map  { |el| el.to_i }
len = firstRow.length
table = [firstRow]
remaining = input.readlines().map { |row| row.split(" ").map { |el| el.to_i } }
(len - 1).times  { |i| table << remaining[i].slice(i + 1, len - i - 1) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...