re: Write a script to identify an anagram VIEW POST


I'd think sorting the characters of the string and comparing them would be a fine solution.

In Ruby:

def is_anagram?(first_word, second_word)
    first_word.chars.sort.join == first_word.chars.sort.join

We might want to refactor into two functions

def is_anagram?(first_word, second_word)
    sort_alphabetically(first_word) == sort_alphabetically(second_word)

def sort_alphabetically(string)

The ? in Ruby is just another character, but it's commonly used in naming comparison methods like this.


Hi Ben,

seems to have a small typo in your code (first part).
After "==" should be second_word, no?


Actually, the join step is unnecessary given that the arrays will match or not at that point, but it still seems like an ergonomic step if we are thinking in words. 🙂


If we wanted the comparison to work for n words, we might take an approach like this:

    def are_anagrams?(words) { |w| sort_alphabetically(w) }.uniq.size == 1

This would check if the "unique" array of sorted words is a length of one, indicating they are all the same.

In true Ruby style, we could monkey patch the Array class, like such:

class Array
  def are_anagrams? { |w| sort_alphabetically(w) }.uniq.size == 1

So then we could call:

["pots", "post", "stop"].are_anagrams? # true
["pots", "post", "ghost"].are_anagrams? # false

Looking up methods on the Array class, I see that I can refactor the above to:

def are_anagrams? { |w| sort_alphabetically(w) }

This may be less clear to non-Rubyists, but that method is there for a reason for Ruby folks.

Very cool
i'm learning ruby currently and the refactor steps are very clear and easy to follow.
At then end only one line method!
i would have written this in 20 lines probably and in a couple of hours :)

Cool stuff.

code of conduct - report abuse