如何在数组之前输入整数值,基于行+列值?

时间:2014-02-16 23:48:19

标签: ruby arrays

对于以下项目,我应该采用以下格式输入:R1C5 + 2,将其读作“在表中,第1行第5列,添加2.或者以这种格式:R1C2C3-5,其中读取:“在表格中,第1行第2-3列,减去5.这假设表格中的所有数字最初都是0。

我离开的地方:

我无法找到检测“+”或“ - ”的方法来添加/减去表中的值。此外,在提供两个C或R时允许多次添加的范围。例如:R1R5C2C3 + 2(行范围1 - 5,列范围2 - 3,添加2)。

以下是代码:

puts 'Please input: '
x = gets.chomp

col = []
row = []

x.chars.each_slice(2) { |u|  u[0] == "R" ? row << u[1] : col << u[1] }

p col
p row

puts "Largest # in Row array: #{row.max}"
puts "Largest # in Columns array: #{col.max}" #must be in "" to return value

big_row = row.max.to_i
big_col = col.max.to_i


table = Array.new (big_row) { Array.new(big_col) }

我感谢大家的帮助!

2 个答案:

答案 0 :(得分:0)

你的作业,先生。

puts 'Please input: '
x = gets.chomp

col = []
row = []
sign = ''
val = ''

x.chars.each_slice(2) do |u|
  case u[0]
  when 'R' then
    row << u[1]
  when 'C' then
    col << u[1]
  when '+', '-'
    sign, val = u[0], u[1]
  else
    puts 'Invalid input.'
    exit
  end
end

big_row = row.max.to_i
big_col = col.max.to_i
table = Array.new (big_row) { Array.new(big_col) }

# Initialize table to all zeros
table.map! do |row|
  row.map! { |col| 0 }
end

rows_range = row.length == 1 ? row[0]..row[0] : row[0]..row[1]
cols_range = col.length == 1 ? col[0]..col[0] : col[0]..col[1]

table.each_with_index do |row, ri|
  if rows_range.include? (ri + 1).to_s
    row.each_with_index do |col, ci|
      if cols_range.include? (ci + 1).to_s
        table[ri][ci] = (sign + val).to_i
      end
    end
  end
end

# Padding for fields in table.
padding = 4

# Table
table.each do |row|
  row.each do |col|
    print "#{col.to_s.rjust(padding)}"
  end
  print "\n"
end

答案 1 :(得分:0)

你不小心发了两次这个。以下是我在另一份副本上给出的答案:

您正在寻找的方法是=~运算符。如果你在字符串上使用它并给它一个正则表达式模式,它将返回该字符串中该模式的位置。因此:

x = 'R1C2C3-5'

x =~ /R/

返回:0,因为那是字符串中'R'的位置(就像数组0,1,2 ......一样计算)。

如果您不熟悉regexp和=~运算符,我建议您查看Ruby文档,它非常有价值。基本上正斜杠之间的模式匹配。您希望匹配+-,但它们在regexp中具有特殊含义,因此您必须使用反斜杠转义它们。

x =~ /\+/
x =~ /\-/

但您可以将它们组合成一个带有OR符号(管道)|

的模式匹配器
x =~ /\+|\-/

所以现在你有了一个方法来获得运营商:

def operator(my_string)
  r = my_string.slice(my_string =~ /\+|\-/)
end

我还会使用运算符将​​字符串拆分为列/行部分和数字部分:

op = operator(x)    # which returns op = '-'
arr = x.split(my_string(x))  # which returns an array of two strings ['R1C2C3', '5']

我将进一步的字符串操作留给您。我将在String类上阅读这个页面:Ruby String Class,这在数组:Ruby Array Class上,因为Ruby包含了很多方法来使这样的事情变得更容易。我学会用Ruby做的一件事是想“我想这样做,我想知道是否已经有一个内置的方法来做这个?”我去检查文档。使用Rails更是如此!