2016-04-15 25 views
1

進行我試圖讓用戶將其在用逗號分隔的字母列表,並找出可以從這些信件作出了哪些單詞。該程序使用單詞列表與輸入字母進行比較。檢查該列表中的話可以根據用戶輸入的字母

這是我試過的代碼。我嘗試了幾種不同的方式,這是我最不成功的試驗。

#import list, get user input and separate each letter 
list_of_words = IO.foreach("referencewords.txt") 
letter_choice = gets.chomp 
letter_choice = letter_choice.split(/,*/) 

#make new blank array for possible words 
final_word_array = [] 
list_of_words.each do |word| 
    final_word_array.push(word) if letter_choice.include?(word) 
end 

#show possible words to the user 
final_word_array.each do |word| 
    puts word 
end 

當我運行這段代碼,我什麼也沒得到我的final_word_array。我的問題是,爲什麼我沒有在我的'final_word_array'中找到可能的單詞列表?

+0

什麼是你的問題? – sawa

+0

檢查擴展IO的Ruby文件類,特別是File.open(http://ruby-doc.org/core-2.1.4/File。html#method-c-open),然後從IO繼承each_line方法。 – AndyV

+0

您的電話'letter_choice.split'錯誤。你需要使用像'letter_choice.split(/,\ s * /)'這樣的東西,它在一個逗號後面加上零個或多個空格字符。您當前的正則表達式會打破零個或多個逗號,從而得到如下結果:'letter_choice =「a,b,c,d」; letter_choice = letter_choice.split(/,* /)'=>'[「a」,「」,「b」,「」,「c」,「」,「d」]'。 – Linuxios

回答

1

讓我們來看看發生了什麼。

letter_choice局部變量的結束是字母的排列你的正則表達式拆分後。

# assume input was "a, b, c, d" 
letter_choice = "a, b, c, d" 
letter_choice = letter_choice.split(/,*/) # => ['a', 'b', 'c', 'd'] 

後來,您正在尋找一個字母列表中的整個工作。假設你的單詞列表中有一個單詞「bad」。你會這樣做:

if letter_choice.include?(word) 
# would be 
['a', 'b', 'c', 'd'].include?("bad") # => false 

因此,代碼的行爲是正確的。我會建議使用Set s。使list_of_words可以保存由您的文字中的字母組成的數組。然後檢查你的字母是否是你的單詞的subset

word.subset?(letter_choice_set) 

更新:忘了提,這個方案不會考慮重複的字母。即使用戶只輸入一個「d」,像「badd」這樣的詞也會匹配。

+0

這是對的主要算法問題(+1)。我只是想提到'split'調用仍然是錯誤的(參見我的[comment](http://stackoverflow.com/questions/36651803/checking-which-words-in-a-list-could-be-made -from-user-input-letters#comment60897536_36651803))。 – Linuxios

0

也許這可以幫助:單詞

list_of_words = IO.foreach("referencewords.txt") 
letter_choice = gets.chomp.split(/,*/) 

final_word_array = [] 
list_of_words.each do |word| 
    letters_of_word = word.split('').uniq 
    final_word_array.push(word) if (letters_of_word && letter_choice) == letters_of_word 
end 

#show possible words to the user 
final_word_array.each do |word| 
    puts word 
end 
0

樣品清單:

a = ["cat", "bat", "dog", "god", "rabbit"] 

轉換:

​​

樣品用戶輸入:

s = "o,d,g\n" 

可能的話:

h[s.chomp.split(",").sort] # => ["dog", "god"] 
+1

用戶輸入是「用逗號分隔的字母列表」。我認爲在你的例子中會是''b,d,o,a,t,c \ n「'。 –

+0

@CarySwoveland謝謝。 – sawa

0

如果某些或所有字母都可以用於形式的話,你可以做到以下幾點。

代碼

words_by_letters = word_list.each_with_object(Hash.new { |h,k| h[k]=[] }) { |word, h| 
    h[word.each_char.sort] << word } 

def extract_words(words_by_letters, letters) 
    (1..letters.size).flat_map do |n| 
    letters.combination(n).map(&:sort).uniq.flat_map do |word_set| 
     words_by_letters[word_set] 
    end.compact 
    end.reject(&:empty?) 
end 

例子

word_list = ["a", "at", "cat", "bat", "do", "dog", "god", "act", "rot", "robot"] 

words_by_letters = word_list.each_with_object(Hash.new { |h,k| h[k]=[] }) { |word, h| 
    h[word.each_char.sort] << word } 
    #=> {["a"]=>["a"], 
    # ["a", "t"]=>["at"], 
    # ["a", "c", "t"]=>["cat", "act"], 
    # ["a", "b", "t"]=>["bat"], 
    # ["d", "o"]=>["do"], 
    # ["d", "g", "o"]=>["dog", "god"], 
    # ["o", "r", "t"]=>["rot"], 
    # ["b", "o", "o", "r", "t"]=>["robot"]} 

extract_words(words_by_letters, ['c', 'a', 't']) 
    #=> ["a", "at", "cat", "act"] 

extract_words(words_by_letters, ['o', 'g', 'd']) 
    #=> ["do", "dog", "god"] 

extract_words(words_by_letters, ['o', 'o', 't', 'r', 'b']) 
    #=> ["rot", "robot"] 
相關問題