2016-06-08 7 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 

Wenn das Eingabewort im Wörterbuch enthalten ist, sollte es im zurückgegebenen Array enthalten sein.Anagrammcode ohne Verwendung einer Schleife

Die Liste sollte nicht zwischen Groß- und Kleinschreibung unterschieden werden.

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

Obwohl "sacre" ist nicht im Wörterbuch, mehrere Wörter im Wörterbuch sind Anagramme von "sacre".

Weder das Eingangswort noch die Wörter im Wörterbuch müssen gültige englische Wörter sein.

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

Gibt es eine Methode, die nicht Looping erfordert das gleiche Ergebnis zu erzielen?

Antwort

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 

Ich weiß nicht, ob das ist, was Sie da select suchen wird Schleife durch ohnehin Array.

+0

Danke, das ist sehr elegant. – Cozzie

1

Vielleicht können Sie Hash in diesem Fall

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 

Test

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 
# => [] 

verwende ich hoffe, das hilft

Verwandte Themen