【问题标题】:How to input integer value to an array, based preceeding row + column values? [duplicate]如何根据前面的行+列值将整数值输入到数组中? [复制]
【发布时间】:2014-02-16 23:48:18
【问题描述】:

对于下面这个项目,我应该采用以下格式输入: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) }

感谢大家的帮助!

【问题讨论】:

  • 这应该被标记为作业
  • 您可能需要遍历字符,直到匹配 - 或 +
  • 哦不,我知道,但它似乎对我不起作用。
  • @user3315041 在下面查看我的解决方案,如果它适合您,请接受它。
  • Nvm @Mikey 我搞定了,谢谢!

标签: ruby arrays


【解决方案1】:

您不小心发布了两次。这是我在另一份副本中给出的答案:

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

x = 'R1C2C3-5'

x =~ /R/

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

如果你不熟悉 regexp 和 =~ 操作符,我建议你看看上面的 Ruby 文档,它非常有价值。基本上正斜杠之间的模式得到匹配。您希望匹配+ 或-,但它们在正则表达式中具有特殊含义,因此您必须使用反斜杠对其进行转义。

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 更是如此!

【讨论】:

  • 因为这是家庭作业,我刚刚在=~ 上给了你线索。您应该能够使用我链接的字符串和数组方法来完成您的工作。我还将提示如何在数学方程式中使用字符串 '-' 或 '+' 作为加号或减号运算符,请查阅 send() ruby​​ 方法。
【解决方案2】:

你的作业,先生。

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

【讨论】:

  • 它适用于 R1C5+20 吗?
  • @Nik,不需要,但需要吗?
  • 不知道。家庭作业的范围可能有限,而在现实生活中,我想,任何数量都可以预期
  • 谢谢大家的帮助,但是这个算法是向数组注册值,还是只承认 +/- 字符?
  • @user3315041 将 +/- 放入 sign 变量中,以及在 val 中添加/减去多少。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多