3

「random_adjective(category)」メソッドの基礎になりたい形容詞のリスト(ここにあります)があります。

便利なプログラムでの最初の本当の試みとして、私は本当にこれを突き刺しているだけです。
ステップ1:ファイルを開き、フォーマットを削除します。問題ない。

list=File.read('adjectivelist')
list.gsub(/\n/, " ")

次のステップは、文字列をカテゴリ別に分割することです。

list.split(" ")

これで、ファイル内のすべての単語の配列ができました。きちんとした。前にチルダが付いているものは、カテゴリ名を表します。

ここで、このLARGE配列を、カテゴリに基づいていくつかの小さい配列に分割したいと思います。 ここでの構文についてサポートが必要ですが、このための擬似コードは次のようになります。

チルダで始まる要素の配列をスキャンします。次に、チルダのない要素の名前に基づいて新しい配列を作成し、この「カテゴリ名」を「categories」配列に配置します。次に、メインアレイからすべての要素をプルし、別のチルダに出会うまでサブアレイにポップします。次に、配列に要素がなくなるまでこのプロセスを繰り返します。

最後に、パラメーターで指定されたカテゴリーからランダムな単語を引き出します。パラメータに一致するカテゴリ名がない場合は、falseを返し、終了します(これは、後でカテゴリを追加したい場合に備えてです)。

ヒントをいただければ幸いです

4

3 に答える 3

3

戻って、次のように最初に分割することをお勧めします。

categories = list.split(" ~")

次に、各リスト項目がカテゴリ名で始まります。これにより、提案どおりにデータ構造に戻る必要がなくなります。ヒントを考えてみましょう:容赦なく前進するよりも、コーディングの問題の始まりを再考する方が良い場合があります

あなたが到達しようとしている構造は、おそらくハッシュであり、キーはカテゴリ名であり、値は一致するすべての形容詞の配列です。次のようになります。

{
  'category' => [ 'word1', 'word2', 'word3' ]
}

だからあなたはこれをするかもしれません:

words_in_category = Hash.new

categories.each do |category_string|
  cat_name, *words = category_string.split(" ")
  words_in_category[cat_name] = words
end

最後に、配列からランダムな要素を選択するために、Ruby は非常に便利なメソッドを提供しているsampleので、これを行うだけで済みます。

words_in_category[ chosen_category ].sample

. . . 想定chosen_categoryには、実際のカテゴリの文字列名が含まれています。これをすべてまとめて、エラーや不適切な入力などを処理する方法を理解するのはあなたに任せます

于 2013-03-21T23:51:58.953 に答える
2

使用slice_before:

categories = list.split(" ").slice_before(/~\w+/)

~これにより、次の一致する単語の前のすべての単語を含む、 で始まる各単語のサブ配列が作成されます。

于 2013-03-21T23:55:54.740 に答える
1

このファイル形式がオリジナルであり、自由に変更できる場合は、データを yaml または json 形式で保存し、必要に応じて読み取ることをお勧めします。これを行うためのライブラリがあります。それだけです。混乱の心配はありません。車輪の再発明に時間を費やす必要はありません。

于 2013-03-21T23:54:18.417 に答える