2015-10-07 5 views
1

Я новичок в Ruby и пытаюсь выяснить проблему для онлайн-теста. Проблема заключается в следующем:Модуль сравнения аналогов Ruby

Анаграмма это слово, образованное от другого перестановкой его письма, используя все оригинальные письма ровно один раз; например, оркестр может быть перестроен в корзину.

Напишите функцию, которая проверяет, являются ли два слова анаграммами друг друга.

Например, AreAnagrams.are_anagrams? ('Momdad', 'dadmom') должно return true, поскольку аргументы являются анаграммами.

код я придумал это:

module AreAnagrams 
    def self.are_anagrams?(string_a, string_b) 
     ## Create @word1 variable to store string_a 
     @word1 = string_a 

     ## Create @word1_compare variable to store string_a in lower case 
     @word1_compare = @word1.downcase 

     ## Create @word2_compare variable to store string_b 
     @word2 = string_b 

     ## Create @word2_compare variable to store string_b in lower case 
     @word2_compare = @word2.downcase 

     ## Check length of @word1 and @word2 to make sure they are the same length 
     if @word1.length == @word2.length 

     =begin 
     Sort the letters of the @word1 and @word2 variables and compare 
     them to see if they are anagrams 
     =end 

     if @word1_compare.chars.sort.join == @word2_compare.chars.sort.join 
      puts "#{@word1} and #{@word2} are anagrams!" 
     else 
      puts "#{@word1} and #{@word2} are not anagrams!" 
     end 
     else 
      puts "#{@word1} and #{@word2} are not anagrams!" 
     end 
    end 
end 

Когда я отправить код, я получаю следующее обратно из теста:

Компиляция ОК, но 4 из 4 тестовых случаев не в состоянии

Пример случай: Неправильный ответ

слова с уникальными буквами: Неправильный ответ

Слова с повторяющимися буквами: Неправильный ответ

Одно слово является префиксом другого слова: Неправильный ответ

Я проверил мой код с несколькими строками и, кажется, работать просто отлично. Похоже, он хочет, чтобы я проверял более конкретные экземпляры (специальные символы, слова с повторяющимися буквами и т. Д.), Но это действительно необходимо? Извините, если это глупый вопрос, я новичок в Ruby и проиграл.

Любая помощь была бы принята с благодарностью!

+1

Поскольку это метод класса, вы должны * действительно * избегать использования переменных экземпляра здесь. Они будут сохраняться между вызовами метода, чего вы, вероятно, не хотели. Просто используйте регулярные локальные переменные, не требуя '@'. – tadman

+0

Звучит неплохо, я тоже исправлю переменные. Большое спасибо, еще раз спасибо! – Bryan

+2

@tadman ответил на ваш вопрос, но есть несколько вещей, которые вы могли бы сделать, чтобы улучшить свой метод. 1, Проблема не просит вас «puts», поэтому вы должны удалить это. 2. Когда вы хотите вернуть результат (например, «истина» или «ложь»), а также «ставит» результат, обычно лучше «ставить» вне метода. Это делает метод более универсальным, если вы хотите использовать его снова, в другом месте вашей программы, без каких-либо или разных сообщений 'puts' ... –

ответ

2

Я думаю, проблема в том, что вы показываете сообщение, но не возвращаете значение true или false, что и есть то, что ожидается.

После каждого puts включите соответствующий ответ. Таким образом, ваш метод вернет что-то полезное. Прямо сейчас я предполагаю, что это nil для всех случаев, так как это то, что возвращает puts.

+0

Теперь, когда вы определили проблему, возможно, несколько слов о том, как можно улучшить код ... –

+0

@CarySwoveland Я думал, что это было довольно ясно. Все, что нужно сделать, это добавить «true» или «false» после каждого puts. – tadman

+0

Использование временных переменных, использование переменных экземпляра, имеющих '' puts' внутри метода и т. Д. –

Смежные вопросы