2012-06-17 2 views
2

Leet для удовольствия я создаю в рубин простой Leet (1337) генератораGSUB - как быть эффективным генератором

так я делаю что-то вроде этого, который работает, но не выглядит очень эффективным, я уверен, это может быть выполнено только с одной линией ...

def leet 
     words = words.gsub(/a/, '4') 
     words = words.gsub(/e/, '3') 
     words = words.gsub(/i/, '1') 
     words = words.gsub(/o/, '0') 
     words = words.gsub(/s/, '5') 
     words = words.gsub(/t/, '7') 
     puts words 
    end 

Можете ли вы мне помочь? :) благодаря!

ответ

7
def leet(word) 
    puts word.gsub(/[aeiost]/,'a'=>'4','e'=>'3','i'=>'1','o'=>'0','s'=>'5','t'=>'7') 
end 
+0

спасибо за ваше решение! – alemur

4

Более общая версия Мегас годов:

class Leet 
    @@map = { 
     'a' => '4', 
     'e' => '3', 
     'i' => '1', 
     'o' => '0', 
     's' => '5', 
     't' => '7' 
    } 
    @@re = Regexp.union(@@map.keys) 

    def self.speak(str) 
     str.gsub(@@re, @@map) 
    end 
end 

puts Leet.speak('leet') 
# l337 

Adjust @@map по мере необходимости и далеко вы идете.

+0

@NiklasB .: Да, ['Regexp.union'] (http://ruby-doc.org/core-1.9.3/Regexp.html#method-c-union) является супер-удобным, лучше, чем пытаться чтобы избежать и объединить строки вместе, чтобы динамически создавать регулярные выражения. Думаю, я узнал об этом из [Phrogz] (http://stackoverflow.com/users/405017/phrogz). –

+0

thsnka для вашего ответа тоже, немного слишком продвинутый для меня, может быть: D – alemur

5
def leet s 
    s.tr 'aeiost', '431057' 
end 
+1

simpleest is best – pguardiario

+1

Знай свою библиотеку! –

+0

Можете ли вы дать мне ссылку на изучение этого? – alemur

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