2016-06-08 20 views
-1
dictionary = ['acres', 'cares', 'Cesar', 'races', 'smelt', 'melts', 'etlsm'] 

def anagrams_for(word, array) 
    matches = [] 
    array.each do |x| 
     if word.downcase.chars.sort == x.downcase.chars.sort 
      matches.push(x) 
     end 
    end 
    puts matches 
end 

如果輸入詞在詞典中,它應該在返回的數組中。不使用循環的Anagram碼

該列表應該不區分大小寫。

anagrams_for('acres', dictionary) # => ['acres', 'cares', 'Cesar', 'races'] 
anagrams_for('ACRES', dictionary) # => ['acres', 'cares', 'Cesar', 'races'] 
anagrams_for('Cesar', dictionary) # => ['acres', 'cares', 'Cesar', 'races'] 

雖然"sacre"不在字典,字典中的幾個詞是"sacre"字謎。

anagrams_for('sacre', dictionary) # => ['acres', 'cares', 'Cesar', 'races'] 

輸入單詞和詞典中的單詞都不需要是有效的英文單詞。

anagrams_for('etlsm', dictionary) # => ['smelt', 'melts', 'etlsm'] 
anagrams_for('unicorn', dictionary) # => [] 

是否有一種方法不需要循環來實現相同的結果?

回答

1
def anagram?(word, other) 
    word.downcase.chars.sort == other.downcase.chars.sort 
end 

def anagrams_for(word, array) 
    array.select { |other_word| anagram?(word, other_word) } 
end 

我不知道如果這是你在找什麼,因爲通過陣列select環反正。

+0

謝謝,這是非常優雅。 – Cozzie

1

也許你可以使用哈希在這種情況下

def get_dictionary_hash(dictionary) 
    exp = Hash.new{|k, v| k[v] = []} 
    dictionary.each{|s| exp[s.downcase.chars.sort] << s} 
    exp 
end 

def anagrams_for(word, dictionary) 
    dictionary[word.downcase.chars.sort] || [] 
end 

測試

dictionary = ['acres', 'cares', 'Cesar', 'races', 'smelt', 'melts', 'etlsm'] 

dictionary_h = get_dictionary_hash(dictionary) 

['acres', 'ACRES', 'Cesar', 'sacre', 'etlsm', 'unicorn'].each do |word| 
    puts word 
    p anagrams_for(word, dictionary_h) 
end 

# => acres 
# => ["acres", "cares", "Cesar", "races"] 
# => ACRES 
# => ["acres", "cares", "Cesar", "races"] 
# => Cesar 
# => ["acres", "cares", "Cesar", "races"] 
# => sacre 
# => ["acres", "cares", "Cesar", "races"] 
# => etlsm 
# => ["smelt", "melts", "etlsm"] 
# => unicorn 
# => [] 

我希望這有助於