0

私は次のように機能するプログラムでプロジェクトを行っています:

  • ユーザーは、必要な最小および最大の難易度を入力します。
  • プログラムは、問題と解答を含むファイルを読み取り、難易度に応じて問題を出力します。
  • ユーザーが質問に答えます。
  • ユーザーの回答が実際の回答と比較されます。

ファイルは次のようになります。

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

D 1質問と回答だけを取得したいとします。D 1と次の 2 行 (Qと)を読み取ることができる正規表現を作成する必要がありAます。これは私がこれまでに思いついたものです:

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
    }

私が持っているものは機能しません。iflike の先頭が で始まるかどうかを確認する最初のステートメントDは、他の 2 つのステートメントを実行するために常に true である必要がありますが、 ififの外にある必要がある次の行も読み取る必要があります。D声明。どうすればこれを行うことができますか?

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")または作成することもできますが、Ruby を使用して、返された列挙子に対してその魔法を働かせることもできます。File.readlinesopen

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 に答える