2010-06-08 2 views
1

Когда у меня есть стол;чтение половины части таблицы

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 

Благодарности

+0

будет ли решение, не связанное с пространством/временем? –

ответ

2

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

# 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 } } 
+0

Хотя я думаю, было бы лучше, если бы методы были неразрушающими. – Jeriko

1
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) } 
1

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

# 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} где-то там.