2015-04-15 2 views
2

я работаю над этой программной задачей из Coderbyte:массива find_index возвращения ноля, даже если значение явно в массиве

Использования языка Ruby, есть функция LetterChanges (ул) принимают параметр ул, передаваемый и измените его, используя следующий алгоритм. Замените каждую букву в строке буквой, следующей за ней в алфавите (т.е. c станет d, z станет a). Затем загладьте каждую гласную в этой новой строке (a, e, i, o, u) и, наконец, верните эту модифицированную строку.

Мой код выглядит следующим образом:

def LetterChanges(str) 
    alphabet = ('a'..'z').to_a 
    result = "" 
    str = str.each_char do |c| 
    idx = alphabet.find_index(c) 
    if idx != nil 
     idx == 25 ? idx = 0 : idx += 1 
     c = alphabet[idx] 
     c.upcase! if ["a","e","i","o","u"].include?(c) 
    end 
    result << c 
    end 
    return result 
end 

Когда я запускаю код LetterChanges ("coderbyte") возвращает 'dpEesczUe'. Я провел некоторое тестирование, и реализованный alphabet.find_index («e») вернул нуль. Однако, когда я запускаю код LetterChanges («eeeee»), он возвращает «fffff», как и ожидалось. Должно быть, что-то мне не хватает, я просто не могу понять, что!

ответ

4

Вы делаете:

c = alphabet[idx] 

, который принимает один из персонажей из alphabet

и затем делать c.upcase!, который изменит эту запись в alphabet так после «г» «coderbyte» alphabet[4] («e») был изменен на «E», поэтому, когда вы пытаетесь найти «e» в alphabet, его больше нет.

Много способов переработать код немного решить эту проблему, но один было бы изменить, чтобы использовать c = alphabet[idx].dup или изменить на подход, при котором вы можете использовать upcase вместо upcase!

+0

Полностью пропустил это, спасибо! – aiven

+0

Рад помочь. Представьте себе, что было кажущееся очень странно :) – mikej

2

более простой реализации

def LetterChanges(str) 
    str.tr('a-z','b-zA').gsub(/[aeiou]/){|c| c.capitalize} 
end 
+0

ты волшебник – aiven

+0

нет, я нашел метод в API док – nickcen

+1

О, хорошо. Спасибо за разъяснения. – aiven

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