对于以下项目,我应该采用以下格式输入: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) }
我感谢大家的帮助!
答案 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更是如此!