0

我正在做一个像这样工作的程序的项目:

  • 用户输入他们想要的最小和最大难度。
  • 程序读取包含问题和答案的文件,并根据难点打印问题。
  • 用户回答问题。
  • 将用户的答案与实际答案进行比较。

该文件如下所示:

D 1
Q What color are the clouds? 
A white
D 2 
Q What is 3 + 4? 
A 7

假设我只想抓取D 1问题和答案。我必须构建可以读取D 1的正则表达式和接下来的两行(QA)。到目前为止,这是我想出的:

if(File.exists?("quiz.txt"))
  myFile = File.open("quiz.txt")
  array = Array.new
  i = 0
  q = nil
  d = nil
  a = nil
  answer_array = Array.new
  myFile.each{|line| 
    if(line =~ (/^D #{minimum}/ =~ line || /^D #{maximum}/ =~ line))
      d = line
      d.slice!(0..1)
     if(/^Q/ =~ line)
       i= i+1
       q = line
       q.slice!(0..1)
     end
      if(/^A/ =~ line)
        a = line
        a.slice!(0..1)
      end
    end
    }

我所拥有的不起作用。if检查 like 开头是否以 a 开头的第一个语句,D其他两个语句必须始终为 trueif才能运行,但它们还必须读取下一行,该行必须在Dif之外陈述。我怎么能做到这一点?

4

2 回答 2

4

Ruby 的 Enumerable 有一个很棒的方法,叫做slice_before

file = [
  'D 1',
  'Q What color are the clouds?',
  'A white',
  'D 2',
  'Q What is 3 + 4?',
  'A 7'
]

file.slice_before(/^D/).select{ |a| a.first[/^D 1/] }
=> [["D 1", "Q What color are the clouds?", "A white"]]

slice_before适用于数组或可枚举,所以使用类似的东西File.open来做到这一点。另一种方法是使用File.read('path/to/file').split("\n")File.readlines创建一个数组,但您也可以使用open并让 Ruby 针对返回的枚举器发挥其魔力:

File.open('path/to/file').slice_before(/^D/).select{ |a| a.first[/^D 1/] }
于 2013-01-16T04:38:22.233 回答
1

Ruby 的 each_slice 在这里也很有用;

File.open("test.txt").each_slice(3) do |(d, q, a)|
  if d > min && d < max
     ...
  end
end

希望这有帮助!

于 2013-01-16T04:44:28.503 回答